6

Mathematicaプログラムの単体テストを書き始め、いくつかのMakefileを使ってコマンドラインからすべてを制御したいと思います。

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


アップデート:

次のようなテストファイルを作成します。

Print ["hello"];
x:= 1;
y = x + 1;
z = y + 1;
Print ["y =" ToString @ y];
印刷["z="ToString @ z];
終了する[];

そしてそれを実行します

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

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

"こんにちは"




"y = 2"

"z = 3"

これは、コンソール出力に情報を出力できるスクリプトに最も近いものですか?私はMathematica6だけを使っていますが、それが違いを生まないことを願っています。

4

3 に答える 3

3

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

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

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

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

dreevesのmashPerlスクリプトも参照してください。これは、このアプローチに勝る利点を提供する可能性があります。

于 2009-10-22T05:54:41.713 に答える
2

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

于 2009-10-22T02:25:37.533 に答える
0

MASHプラグを提供してくれたPillsyとWillRobertsonに感謝します。関連するStackOverflowの質問は次のとおりです。コマンドライン引数、stdin、stdout、およびstderrを使用して、コマンドラインからMathematicaプログラムを呼び出します。

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];
于 2010-04-17T16:04:46.133 に答える