質問

Mathematicaプログラムの単体テストの作成を開始し、いくつかのMakefileを使用してコマンドラインからすべてを制御したい。

Mathematica コマンドラインから実行できるようですが、 Mac OS Xでこれを開始するための基本的な手順は表示されません—誰もこれをやったことがありますか?


更新:

次のようなテストファイルの作成:

Print["hello"];
x := 1;
y = x+1;
z = y+1;
Print["y="ToString@y];
Print["z="ToString@z];
Quit[];

そして

で実行します
/Applications/Mathematica.app/Contents/MacOS/MathKernel -noprompt < test.m

は、ある種のバッチ処理に最も近いものです。ただし、出力は見苦しくなります。スクリプトのすべての行に改行が追加されます!

"hello"




"y=2"

"z=3"

これは、コンソール出力に情報を出力できるスクリプトに最も近いものですか?私はMathematica 6のみを使用していますが、それが違いをもたらさないことを願っています。

役に立ちましたか?

解決

これは、最終的に、私が期待するような出力を提供します:

/Applications/Mathematica.app/Contents/MacOS/MathKernel -noprompt -run "<<test.m"

理にかなっていると思います。これを .bash_profile に追加すると、簡単に実行できます( mma test.m のように):

mma () { /Applications/Mathematica.app/Contents/MacOS/MathKernel -noprompt -run "<<$1" ; }

dreevesの mash Perlスクリプト。このアプローチよりも利点があります。

他のヒント

いくつかの実験により、 /Applications/Mathematica.app/Contents/MacOS/MathKernel をコマンドラインから起動できることがわかりました。ただし、通常の -h または-help のコマンドラインフラグは受け入れないようです。

MASHプラグのPillsyとWill Robertsonに感謝します!関連するStackOverflowの質問は次のとおりです。コマンドライン引数、標準入力を使用して、コマンドラインからMathematicaプログラムを呼び出す、stdout、stderr

MASHを使用しない場合は、MASHが定義する次のユーティリティ関数を使用できます。 たとえば、標準のPrintは、通常はスクリプトに必要な文字列ではなく、引用符で文字列を印刷します。

ARGV = args = Drop[$CommandLine, 4];         (* Command line args.            *)
pr = WriteString["stdout", ##]&;             (* More                          *)
prn = pr[##, "\n"]&;                         (*  convenient                   *)
perr = WriteString["stderr", ##]&;           (*   print                       *)
perrn = perr[##, "\n"]&;                     (*    statements.                *)
EOF = EndOfFile;                             (* I wish mathematica            *)
eval = ToExpression;                         (*  weren't so damn              *)
re = RegularExpression;                      (*   verbose!                    *)
read[] := InputString[""];                   (* Grab a line from stdin.       *)
doList[f_, test_] :=                         (* Accumulate list of what f[]   *)
  Most@NestWhileList[f[]&, f[], test];       (*  returns while test is true.  *)
readList[] := doList[read, #=!=EOF&];        (* Slurp list'o'lines from stdin *)

MASHを使用するには、perlファイルを取得します。 mash.pl 、次にtest.mを次のようにします。

#!/usr/bin/env /path/to/mash.pl

prn["hello"];
x := 1;
y = x+1;
z = y+1;
prn["y=", y];
prn["z=", z];
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top