当笔记本超出一些功能时我遇到的一个典型情况 - 我评估一个表达式,但是我得到了Beep而不是正确的答案,然后是几十个无用的警告,接着是"进一步输出...将被抑制"
我觉得有用的一件事 - 在函数内部使用类似Python的"断言"来强制内部一致性.还有其他提示吗?
Assert[expr_, msg_] := If[Not[expr], Print[msg]; Abort[], None]
Run Code Online (Sandbox Code Playgroud)
编辑11/14 警告雪崩的一般原因是子表达式评估为"坏"值.这会导致父表达式计算为"坏"值,并且此"不良"会一直传播到根目录.内置评估一路上注意到不良并产生警告."坏"可能意味着表达错误的头部,列表中的元素数量错误,负的确定矩阵而不是正定义等等.一般来说,它不适合父表达式的语义.
解决这个问题的一种方法是重新定义所有函数,以便在"输入错误"时返回未评估的值.这将处理内置函数生成的大多数消息.执行像"Part"这样的结构操作的内置函数仍将尝试评估您的值并可能产生警告.
将调试器设置为"中断消息"可以防止出现大量错误,尽管将其一直打开似乎有点过头了
所以一般来说,如果你有两个函数f,g:X - > Y,并且如果在Y上定义了一些二元运算+,那么f + g的规范定义为函数x - > f(x)+ G(X).
在Mathematica中实现这个的最佳方法是什么?
f[x_] := x^2
g[x_] := 2*x
h = f + g;
h[1]
Run Code Online (Sandbox Code Playgroud)
产量
(f + g)[1]
Run Code Online (Sandbox Code Playgroud)
作为输出
当然,
H = Function[z, f[z] + g[z]];
H[1]
Run Code Online (Sandbox Code Playgroud)
收益率为3.
对于已经分配了与名称"a"关联的DownValues的情况,是否有可接受的方法来阻止将OwnValues分配为相同的名称?(我最初在玩某人试图实现数据字典的时候遇到过这个问题.)
这就是我要避免的意思:
Remove[a];
a[1] := somethingDelayed
a[2] = somethingImmediate;
DownValues[a]
a[1]
a[2]
Run Code Online (Sandbox Code Playgroud)
返回...
{HoldPattern[a[1]] :> somethingDelayed,
HoldPattern[a[2]] :> somethingImmediate}
somethingDelayed
somethingImmediate
Run Code Online (Sandbox Code Playgroud)
现在,如果我们要评估:
a = somethingThatScrewsUpHeads;
(* OwnValues[a] above stored in OwnValues *)
a[1]
a[2]
Run Code Online (Sandbox Code Playgroud)
我们得到......
somethingThatScrewsUpHeads[1]
somethingThatScrewsUpHeads[2]
Run Code Online (Sandbox Code Playgroud)
是否有一种简单/灵活的方法来防止DownValues中任何名称的OwnValues?(Lemme猜测......这是可能的,但会有性能受损吗?)
我希望能够拥有一个模式,该模式只匹配某些其他元素的子项(可选地:不是).
例如,匹配List不在Graphics对象内的所有s 的模式:
{ {1,2,3}, Graphics[Line[{{1,2},{3,4}}]] }
Run Code Online (Sandbox Code Playgroud)
这种模式会匹配{1,2,3}但不匹配{{1,2},{3,4}}.
有相对简单的方法来提取符合这些条件的表达式,但模式不仅用于提取,还用于替换,这是我的主要用例here(ReplaceAll).
你知道任何简单,简洁和一般的方法吗?
只用模式就可以做到这一点吗?
我想重载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)