Подробно останавливаясь на точке @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
Это, наконец, дает результат, как я и ожидал:
/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
, который может иметь преимущества перед этим подходом.
Поэкспериментировав, я обнаружил, что /Applications/Mathematica.app/Contents/MacOS/MathKernel
можно запустить из командной строки. Однако, похоже, он не принимает обычные флаги командной строки -h
или - help
.
Спасибо Пилси и Уиллу Робертсону за вилку 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];