level 9
x = 1;
y = 1;
F[x_, y_] := x + y
F[3, 3] // Trace
他的输出是6。
但是F没有HoldAll Attribute,为什么在F代入3,3之前x+y并未被计算为6呢?(SetDelayed有holdall我清楚,那F没有啊)
ReplaceAll没有HoldAll属性,所以他在模式匹配之前计算了待匹配的式子。
如果我们理解函数为一个模式匹配的话,那么应当是在代入之前函数自己偷偷算一遍才对,可为什么输出不是2而是6呢?
2023年12月18日 13点12分
1
吧务
level 10
楼上提到的「replaceall是先赋全局值计算再赋局部值计算」是错误的,是否先求值再替换,取决于你是否使用延迟规则。
2023年12月23日 07点12分
5
吧务
level 10
我不清楚你有怎样的误解,不过你可以用DownValues来看看各种情况下系统中所存储的是怎样的定义规则。
2023年12月23日 07点12分
7
吧务
level 15
为避免引发误解,这帖下面错误的回复我全砍了,还请理解。(删帖理由是随便填的。)
2024年01月06日 04点01分
14
吧务
level 15
还有,解释问题时不要乱用自己也搞不清楚的概念。你是觉得世界上只有OwnValues还是怎么的?
2024年01月06日 04点01分
16