Wolfram mathematica 嵌套未赋值问题
当模拟Wolfram mathematica 嵌套未赋值问题,wolfram-mathematica,Wolfram Mathematica,当模拟RuleDelayed的求值行为时,我遇到了嵌套Unevaluated的意外行为。考虑: In[1]:= f[Verbatim[Unevaluated][expr_]] := f[expr] f[Unevaluated[1 + 1]] f[Unevaluated@Unevaluated[1 + 1]] f[Unevaluated@Unevaluated@Unevaluated[1 + 1]] f[Unevaluated@Unevaluated@Unevaluated@Unevaluated
RuleDelayed
的求值行为时,我遇到了嵌套Unevaluated
的意外行为。考虑:
In[1]:= f[Verbatim[Unevaluated][expr_]] := f[expr]
f[Unevaluated[1 + 1]]
f[Unevaluated@Unevaluated[1 + 1]]
f[Unevaluated@Unevaluated@Unevaluated[1 + 1]]
f[Unevaluated@Unevaluated@Unevaluated@Unevaluated[1 + 1]]
Out[2]= f[Unevaluated[1 + 1]]
Out[3]= f[2]
Out[4]= f[Unevaluated[1 + 1]]
Out[5]= f[2]
可以看到,只有偶数个嵌套的
未赋值的包装器被完全删除。为什么?关键在于,在表达式模式匹配之前,有效地删除了一层。从:
f[Unevaluated[expr]]
有效工作
通过临时将属性设置为
f
保持其参数未赋值,
然后计算f[expr]
因此,在第一种情况下,f[Unevaluated[1+1]]
被评估为f[1+1]
,但在模式匹配期间保持未评估状态,即使f
缺少Hold*
属性,并且由于没有匹配的f[1+1]
,原始表达式(预模式匹配)返回未评估状态
在第二种情况下,f[Unevaluated[1+1]]]
在模式匹配器中计算为f[Unevaluated[1+1]]
,它与f
的模式匹配,然后递归计算f[1+1]
,从而得到f[2]
在第三种情况下,f[Unevaluated[Unevaluated[1+1]]]]
计算为f[Unevaluated[Unevaluated[1+1]]]
,匹配并递归计算为f[Unevaluated[1+1]]
,我们回到第一种情况
在第四种情况下,f[Unevaluated[Unevaluated[Unevaluated[1+1]]]]]
与f[Unevaluated[Unevaluated[1+1]]]]]
匹配,递归计算f[Unevaluated[Unevaluated[1+1]]]]
,我们回到第二种情况
嗯 使用跟踪查看原因:
In[1]:= f[Verbatim[Unevaluated][expr_]]:=f[expr]
In[2]:= f[Unevaluated[1+1]]//Trace
Out[2]= {f[1+1],f[Unevaluated[1+1]]}
由于定义了Unevaluated
语言构造的特殊属性,f[Unevaluated[1+1]]
的计算方法与f[1+1]
的计算方法相同,只是1+1
没有计算
f[1+1]
与您为f
给出的定义不匹配
因此,f[Unevaluated[1+1]]
保持未评估状态
鉴于:
In[3]:= f[Unevaluated@Unevaluated[1 + 1]] // Trace
Out[3]= {f[Unevaluated[1+1]],f[1+1],{1+1,2},f[2]}
由于Unevaluated
语言结构的定义特殊属性,f[Unevaluated@Unevaluated[1+1]
的计算方法与f[Unevaluated[1+1]]
类似,只是未计算的[1+1]
未计算
f[Unevaluated[1+1]]
与您为f
给出的定义匹配,并计算为f[1+1]
因此f[Unevaluated@Unevaluated[1+1]
计算结果为f[2]
哇,我真的比你快了几秒钟(是的!一个小时前的问题真是巧合。总的来说,我更喜欢你的答案。解释得很清楚,谢谢!这两个答案都很好,相互补充,但你的解释以评估者做出的一系列决定的形式更具示意性,更容易记住。所以我接受你的回答。