我被搞糊涂了所有内置在声称为防止评价在某种程度上数学函数:Unevaluated,Defer,Hold,以及超过一半的形式的打Hold*.Mathematica文档只是单独解释了每个函数,但没有解释为什么要选择其中一个函数.任何人都可以对所有这些功能提供一致的解释吗?整件事对我来说似乎是一个令人费解的混乱.将它全部与Lisp宏相关可能是一个很好的起点.
大多数Mathematica语言都设计得非常好,但看起来Wolfram真的把自己描绘成了这方面的一个角落.或者我可能会遗漏一些东西.
当数学计算一个细胞,它给人的输入单元和输出单元的CellLabel小号In[$Line]:=和Out[$Line]=其中$线是从每输入计算递增的计数器.
如果您输入类似TraditionalForm[expr]或TeXForm[expr](或任何其他*表格$OutputForms)的内容,则表单的名称也会添加到输出单元格的标签中.例如Out[1]//TraditionalForm=.
我找不到任何自定义这些标签的方法.
可以在"首选项"对话框中禁用它们.
它们似乎不在输入和输出单元格的StyleSheet选项中 - 尽管有与CellLabel行为相关的选项.
也不在Notebook选项中 - 尽管在Option Inspector中:Notebook Options> Evaluation Options> EvaluationCompletionAction可以通过添加TimeStamp来修改CellLabel.它还可以在StatusArea中显示Timing,一旦打印出其他内容,它就会被删除.
也不是任何init.m类型的 配置文件.
那么,有谁知道这些CellLabel的生成位置?
特别是,我有兴趣将TimingCellLabel 添加到输出单元格.
我需要在一个大的Mathematica代码库(数十万行代码)上做一些元编程,并且不想编写一个完整的解析器,所以我想知道如何最好地从Mathematica笔记本中获取代码用一种易于解析的语法.
是否可以在FullForm语法中导出Mathematica笔记本,或者在语法中保存所有定义FullForm?
该文档的Save说,它可以在唯一的出口InputForm语法,这是不平凡的解析.
到目前为止,我所拥有的最佳解决方案是评估笔记本,然后使用DownValues参数提取重写规则(但这会错过符号定义),如下所示:
DVs[_] := {}
DVs[s_Symbol] := DownValues[s]
stream = OpenWrite["FullForm.m"];
WriteString[stream,
DVs[Symbol[#]] & /@ Names["Global`*"] // Flatten // FullForm];
Close[stream];
Run Code Online (Sandbox Code Playgroud)
到目前为止,我尝试了各种方法,但没有一种方法效果很好.Mathematica中的元编程似乎非常困难,因为它一直在评估我想要保持不被评估的事物.例如,我想获取无穷大符号的字符串名称,SymbolName[Infinity]但是将Infinity得到的值计算为非符号,并且调用SymbolName带有错误的die.因此,我希望用更合适的语言进行元编程.
编辑
最好的解决方案似乎是手动将笔记本保存为包(.m)文件,然后使用以下代码进行翻译:
stream = OpenWrite["EverythingFullForm.m"];
WriteString[stream, Import["Everything.m", "HeldExpressions"] // FullForm];
Close[stream];
Run Code Online (Sandbox Code Playgroud) 我想重载Mathematica的Set函数(=),这对我来说太棘手了(参见下面的代码示例).我成功地重载了其他函数(例如代码示例中的Reverse).有什么建议?
In[17]:= ClearAll[struct];
In[18]:= var1=struct[{1,2}]
Out[18]= struct[{1,2}]
In[19]:= Reverse@var1
Out[19]= struct[{1,2}]
In[20]:= Head[var1]
Out[20]= struct
In[21]:= struct/:Reverse[stuff_struct]:=struct[Reverse@stuff[[1]]]
In[22]:= Reverse@var1
Out[22]= struct[{2,1}]
In[23]:= struct/:Set[stuff_struct,rhs_]:=Set[struct[[1]],rhs]
In[24]:= var1="Success!"
Out[24]= Success!
In[25]:= var1
Out[25]= Success!
In[26]:= Head[var1]
Out[26]= String
In[27]:= ??struct
Global`struct
Reverse[stuff_struct]^:=struct[Reverse[stuff[[1]]]]
(stuff_struct=rhs_)^:=struct[[1]]=rhs
Run Code Online (Sandbox Code Playgroud)