在Mathematica中保留未评估选项的值

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]被评估一次而不是每次迭代表.我想阻止这个.问题更复杂,但它是沿着这些方向发展的.

谢谢!

Pil*_*lsy 5

使用一个名称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)