我可以自动懒惰地评估Mathematica中的函数参数吗?

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懒惰地评估传递给函数的东西,而不必手动持有它?

nin*_*cko 5

在标准评估过程中,依次评估函数的每个参数.通过设置HoldFirst,HoldRest和HoldAll属性可以防止这种情况.这些属性使Mathematica以未评估的形式"持有"特定的参数.

http://reference.wolfram.com/legacy/v5/TheMathematicaBook/PrinciplesOfMathematica/EvaluationOfExpressions/2.6.5.html

例如

文档说,任何自动保持参数在您第一次在函数体中使用时会自动进行评估.但是,如果由于某种原因你想继续使用Hold表单中的参数(例如,如果你想对表达式的未评估形式进行模式匹配和重写),那么也许你可以重新Hold开始.