Mik*_*ley 4 wolfram-mathematica lazy-evaluation
在Mathematica,我想做一些基本的事情:
f[Rational[a_, b_], Rational[c_, d_]] := {a+c, b+d}
Run Code Online (Sandbox Code Playgroud)
但是,如果我用以下形式的表达式来评估它,我会得到错误的结果:
In: f[Rational[50, 100], Rational[4, 10]]
Out: {3, 7}
(* Expected: 54 / 110 -> 27 / 55 *)
Run Code Online (Sandbox Code Playgroud)
有什么方法可以强迫Mathematica立即停止简化表达式吗?我可以暂时保留我传入的内容,然后让有问题的函数只需调用ReleaseHold [..]就可以传入任何内容.
这个解决方案非常难看,我不想这样做.我知道Mathematica中的一些函数会自动保存传入的内容并因某种原因延迟评估它,我想在此处执行此操作.
简而言之:我怎样才能强迫Mathematica懒惰地评估传递给函数的东西,而不必手动持有它?
在标准评估过程中,依次评估函数的每个参数.通过设置HoldFirst,HoldRest和HoldAll属性可以防止这种情况.这些属性使Mathematica以未评估的形式"持有"特定的参数.
例如
SetAttributes[yourFunction, HoldFirst]文档说,任何自动保持参数在您第一次在函数体中使用时会自动进行评估.但是,如果由于某种原因你想继续使用Hold表单中的参数(例如,如果你想对表达式的未评估形式进行模式匹配和重写),那么也许你可以重新Hold开始.