Pregunta

Me gustaría comenzar a escribir algunas pruebas unitarias para mis programas de Mathematica y controlar todo desde la línea de comandos con algunos Makefiles.

Parece que Mathematica se puede ejecutar desde la línea de comandos pero puedo no vea las instrucciones básicas para comenzar a hacer esto en Mac OS X & # 8212; ¿Alguien ha hecho esto antes?


Actualización:

Creando un archivo de prueba como este:

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

Y ejecutándolo con

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

es lo más cercano que puedo llegar a algún tipo de procesamiento por lotes. Sin embargo, la salida parece fea; ¡Se agregan nuevas líneas para cada línea del script!

"hello"




"y=2"

"z=3"

¿Es esto lo más cercano que puedo obtener de un script que aún puede dar información a la salida de la consola? Solo estoy usando Mathematica 6, pero espero que eso no haga una diferencia.

¿Fue útil?

Solución

Esto, finalmente, da una salida como la que yo esperaría:

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

Tiene sentido, supongo. Agregar esto a mi .bash_profile permite una fácil ejecución (como en mma test.m ):

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

Vea también script de Perl mash de dreeves, que puede ofrecer ventajas sobre este enfoque.

Otros consejos

Con algo de experimentación, encontré que /Applications/Mathematica.app/Contents/MacOS/MathKernel se puede iniciar desde la línea de comandos. Sin embargo, parece que no acepta los indicadores de línea de comando habituales -h o --help .

¡Gracias a Pillsy y Will Robertson por el conector MASH! Aquí está la pregunta relevante de StackOverflow: Llame a un programa de Mathematica desde la línea de comandos, con argumentos de la línea de comandos, stdin , stdout y stderr

Si no usa MASH, es posible que desee usar las siguientes funciones de utilidad que MASH define. Por ejemplo, la impresión estándar imprimirá cadenas con comillas, no normalmente lo que desea en los scripts.

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 *)

Para usar MASH, simplemente tome ese archivo perl, mash.pl , y luego haga su prueba.m como la siguiente:

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

prn["hello"];
x := 1;
y = x+1;
z = y+1;
prn["y=", y];
prn["z=", z];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top