Gab*_*bor 4 wolfram-mathematica
我在编写一个带选项的函数时遇到了一些问题.其中一个选项值是一个函数.我是一个得到这个值,但保持它没有评价.我尝试了所有我能想到的东西,但到目前为止没有任何效果.
基本上,为了说明这是我试过的:
SetAttributes[Foo, HoldRest];
Options[Foo] = {Blah -> None}
Foo[x_, OptionsPattern[]] :=
Module[{blah},
blah = OptionValue[Automatic, Automatic, Blah, Hold];
.
.
.
Run Code Online (Sandbox Code Playgroud)
然后当我有:
func[a_, b_, c_] := a + b + c;
Run Code Online (Sandbox Code Playgroud)
我希望能够通过以下方式致电Foo:
Foo[2, Blah -> func[1, 2, 3]]
Run Code Online (Sandbox Code Playgroud)
并且让"blah"变量(在Foo内部)得到重新评估,即blah = func [1,2,3].
感谢您提前获得所有帮助!
编辑:
由于原因太长而无法详细说明,我无法使用RuleDelayed(:>).我正在尝试编写一个函数,这个函数将放在一个包中,由其他不熟悉Mathematica的人使用,所以他们不知道是什么:>是.使用规则( - >)来指定选项及其值是标准方法,他们熟悉它.
所以为了进一步说明,让我说我正在尝试编写一个数字生成器函数,该函数将生成实际数字的函数作为其中一个选项:
Options[GenerateNumbers] = {GeneratorFunction -> None};
GenerateNumbers[n_, OptionsPattern[]] :=
Module[{func},
func = OptionValue[GeneratorFunction];
Table[func, {n}]
]
]
Run Code Online (Sandbox Code Playgroud)
现在,如果我使用以下值调用此函数:
GenerateNumbers[5, GeneratorFunction -> RandomReal[10]]
Run Code Online (Sandbox Code Playgroud)
它将返回5个相同的数字列表,因为RandomReal [10]被评估一次而不是每次迭代表.我想阻止这个.问题更复杂,但它是沿着这些方向发展的.
谢谢!
使用一个名称OptionsPattern
,然后用a List
和a包装捕获的序列对象Unevaluated
.捕获右侧的最小方法Blah
是:
SetAttributes[Foo, HoldRest]; Options[Foo] = {Blah -> None};
Foo[x_, opts : OptionsPattern[]] :=
Module[{blah},
blah = OptionValue[Foo, Unevaluated[{opts}], Blah, Hold];
blah]
Run Code Online (Sandbox Code Playgroud)
测试出来:
In[2]:= Foo[x, Blah -> (1 + 1)]
Out[2]= Hold[1 + 1]
Run Code Online (Sandbox Code Playgroud)