У меня проблемы с написанием функции, которая принимает параметры.Одним из значений параметра является функция.Я один, чтобы получить на это значение, но держать его недооцененным.Я перепробовал все, что мог придумать, но пока ничего не получалось.
В основном, чтобы проиллюстрировать это, я попытался:
SetAttributes[Foo, HoldRest];
Options[Foo] = {Blah -> None}
Foo[x_, OptionsPattern[]] :=
Module[{blah},
blah = OptionValue[Automatic, Automatic, Blah, Hold];
.
.
.
Затем, когда у меня есть:
func[a_, b_, c_] := a + b + c;
Я бы хотел позвонить в Foo:
Foo[2, Blah -> func[1, 2, 3]]
И нужно, чтобы переменная "blah" (внутри Foo) была недооценена, т.е. blah = func [1, 2, 3].
Заранее благодарю за помощь!
Редактировать:
По причинам, которые слишком длинны для разработки, я не могу использовать RuleDelayed (:>).Я пытаюсь написать функцию, которая будет в пакете, которая будет использоваться другими людьми, которые на самом деле не знают Mathematica, поэтому они понятия не имеют, что:> is.Использование правил (->) для задания опций и их значений является стандартным способом, и они знакомы с этим.
Итак, для дальнейшей иллюстрации, скажем, я пытаюсь написать функцию генератора чисел, которая принимает функциюкоторый генерирует фактическое число как одну из его опций:
Options[GenerateNumbers] = {GeneratorFunction -> None};
GenerateNumbers[n_, OptionsPattern[]] :=
Module[{func},
func = OptionValue[GeneratorFunction];
Table[func, {n}]
]
]
Теперь, если бы я вызвал эту функцию со значениями следующим образом:
GenerateNumbers[5, GeneratorFunction -> RandomReal[10]]
Он бы возвратил список из 5 чисел, которыеодинаковы, поскольку RandomReal [10] вычисляется один раз, а не на каждой итерации таблицы.Я хочу предотвратить это.Проблема более сложная, но она такова.
Спасибо!