Mathematica в пакетном режиме из командной строки на Mac OS X

Подробно останавливаясь на точке @Cory Foy и @Charles Bretana, где существует различие между объектами и значениями. Принимая во внимание, что объекты значения должны всегда быть неизменными, я действительно не думаю, что объект должен быть в состоянии заморозить себя или позволить себе быть замороженными произвольно в кодовой базе. Это имеет действительно неприятный запах к нему, и я волнуюсь, что могло стать трудным разыскать, где точно объект был заморожен, и почему это было заморожено, и то, что между вызовами к объекту это могло изменить состояние от таявшего до замороженного.

, Который не должен говорить, что иногда Вы хотите дать (изменяемый) объект чему-то и гарантировать его, не будет измененным.

Так, вместо того, чтобы заморозить сам объект, другая возможность состоит в том, чтобы скопировать семантику ReadOnlyCollection< T>

List list = new List { 1, 2, 3};
ReadOnlyCollection readOnlyList = list.AsReadOnly();

Ваш объект может принять участие как изменяемое, когда этому нужен он, и затем быть неизменным, когда Вы требуете, чтобы он был.

Примечание это ReadOnlyCollection< T> также реализует ICollection< T>, который имеет Add( T item) метод в интерфейсе. Однако существует также bool IsReadOnly { get; } определены в интерфейсе так, чтобы потребители могли проверить прежде, чем назвать метод, который выдаст исключение.

различие - то, что Вы не можете только установить IsReadOnly на ложь. Набор или или не только для чтения, и это никогда не изменяется в течение времени жизни набора.

было бы хорошо во время иметь правильность константы, которую C++ дает Вам во время компиляции, но это начинает иметь свой собственный набор проблем, и я - довольный C#, не идет туда.

ICloneable - я думал, что просто вернусь к следующему:

не реализуют ICloneable

, не используют ICloneable в общедоступных API

Brad Abrams - Руководство по проектированию, Управляемый код и Платформа.NET

6
задан Will Robertson 22 October 2009 в 05:31
поделиться

3 ответа

Это, наконец, дает результат, как я и ожидал:

/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" ; }

См. Также Perl-скрипт dreeves mash , который может иметь преимущества перед этим подходом.

3
ответ дан 17 December 2019 в 04:48
поделиться

Поэкспериментировав, я обнаружил, что /Applications/Mathematica.app/Contents/MacOS/MathKernel можно запустить из командной строки. Однако, похоже, он не принимает обычные флаги командной строки -h или - help .

2
ответ дан 17 December 2019 в 04:48
поделиться

Спасибо Пилси и Уиллу Робертсону за вилку MASH! Вот соответствующий вопрос StackOverflow: Вызов программы Mathematica из командной строки с аргументами командной строки, stdin, 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];
0
ответ дан 17 December 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: