Pergunta

Eu gostaria de começar a escrever alguns testes de unidade para meus programas Mathematica e controlar tudo a partir da linha de comando com algumas Makefiles.

Parece que Mathematica pode ser executado a partir da linha de comando mas eu posso 't ver qualquer instruções básicas sobre como começar com fazer isso no Mac OS X - alguém já fez isso antes

?

Update:

Criando um arquivo de teste como este:

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

E executá-lo com

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

é o mais próximo que posso chegar a algum tipo de processamento em lote. A saída é feio, embora; novas linhas são adicionadas para cada linha do script!

"hello"




"y=2"

"z=3"

Esta é a coisa mais próxima que pode chegar a um script que pode informação ainda saída para a saída do console? Eu só estou usando Mathematica 6, mas espero que não fazer a diferença.

Foi útil?

Solução

Este, finalmente, dá uma saída como eu esperaria que:

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

Faz sentido, eu suponho. Adicionando este à minha .bash_profile permite fácil execução (como no mma test.m):

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

Veja também mash das dreeves script Perl, que pode oferecer vantagens sobre esta abordagem.

Outras dicas

Com algumas experiências, descobri que /Applications/Mathematica.app/Contents/MacOS/MathKernel pode ser iniciado a partir da linha de comando. Não parece aceitar as habituais -h ou de linha de comando --help bandeiras, apesar de tudo.

Graças à Pillsy e Will Robertson para o plug MASH! Aqui está a pergunta StackOverflow relevante: chamar um programa Mathematica na linha de comando, com os argumentos de linha de comando, stdin , stdout, e stderr

Se você não usar MASH, você pode querer usar as seguintes funções utilitárias que define MASH. Por exemplo, o padrão Imprimir imprimirá cordas com aspas - geralmente não o que você quer em 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, basta pegar esse arquivo perl, mash.pl , e, em seguida, fazer o seu test.m como o seguinte:

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

prn["hello"];
x := 1;
y = x+1;
z = y+1;
prn["y=", y];
prn["z=", z];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top