相关疑难解决方法(0)

"upvalue"在Mathematica中意味着什么以及何时使用它们?

对我来说,g /: f[g[x_]] := h[x]只是冗长等同于f[g[x_]] := h[x].你能提出一个你必须使用的例子/:吗?

wolfram-mathematica

23
推荐指数
3
解决办法
2880
查看次数

防止评估Mathematica表达式

在最近的SO问题中,提供了三个不同的答案,每个答案使用不同的方法来防止Equal[]表达的评估.他们是

  1. Defer[]
  2. Unevaluated[]
  3. HoldForm[]

有时我仍然无法在这些选项之间进行选择(并且根据前面提到的问题的答案判断,对于其他人来说,选择并不总是清楚的).有人能否就这三种方法的使用写清楚的说明?


还有其他三个包装 Hold[], HoldPattern[], HoldComplete[],和各种Attributes的功能 HoldAll,HoldFirst,HoldRest和数字版本,NHold*即也可以讨论,如果你想!

编辑

我只是注意到这基本上是旧问题的重复(我已经投了很多,只是忘了...).在1999年Mathematica开发者大会上,这个讲话被接受的答案Defer与之相关,因为它是"6中的新人".Defer与其他评估控制机制相比,它与前端的联系更紧密.它用于创建未评估的输出,如果提供和Input表达式,将对其进行评估.引用文档中心:

Defer [expr]返回一个保持不变的对象,直到它作为Mathematica输入显式提供,并使用Shift + Enter,就地评估等进行评估.

wolfram-mathematica

15
推荐指数
2
解决办法
3689
查看次数

当DownValues已经存在时,可以阻止OwnValues吗?

对于已经分配了与名称"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猜测......这是可能的,但会有性能受损吗?)

wolfram-mathematica variable-assignment

9
推荐指数
2
解决办法
887
查看次数