gpt4 book ai didi

wolfram-mathematica - 持有任何论据

转载 作者:行者123 更新时间:2023-12-03 14:54:38 25 4
gpt4 key购买 nike

是否可以定义一个在给定位置保存参数的函数?

或者做一些像 HoldLast 这样的事情作为 HoldFirst 的对应物?

最佳答案

据我所知,在没有 HoldN 的意义上,您不能直接执行此操作。属性。
但是,下面有一个解决方法,应该按照您的要求进行。

建议的解决方案
一种简单的方法是定义一个辅助函数来完成主要工作,而你的“主”函数(实际被调用的函数)为 HoldAll ,像这样:

In[437]:= 
SetAttributes[f, HoldAll];
f[a_, b_, c_] :=
faux[a, Unevaluated[b], c];
faux[a_, b_, c_] := Hold[a, b, c]

In[440]:= f[1^2, 2^2, 3^2]
Out[440]= Hold[1, 2^2, 9]
您不必暴露 faux到顶层,可以将所有内容包裹在 Module[{faux}, your definitions] 中反而。

通过元编程实现自动化
该过程可以自动化。这是一个简单的函数签名解析器,用于提取模式名称(注意 - 它确实很简单):
splitHeldSequence[Hold[seq___], f_: Hold] := List @@ Map[f, Hold[seq]];

getFunArguments[Verbatim[HoldPattern][Verbatim[Condition][f_[args___], test_]]] :=
getFunArguments[HoldPattern[f[args]]];

getFunArguments[Verbatim[HoldPattern][f_[args___]]] :=
FunArguments[FName[f], FArgs @@ splitHeldSequence[Hold[args]]];

(*This is a simplistic "parser".It may miss some less trivial cases*)

getArgumentNames[args__FArgs] :=
args //. {
Verbatim[Pattern][tag_, ___] :> tag,
Verbatim[Condition][z_, _] :> z,
Verbatim[PatternTest][z_, _] :> z
};
使用它,我们可以编写以下自定义定义运算符:
ClearAll[defHoldN];
SetAttributes[defHoldN, HoldFirst];
defHoldN[SetDelayed[f_[args___], rhs_], n_Integer] :=
Module[{faux},
SetAttributes[f, HoldAll];
With[{heldArgs =
MapAt[
Unevaluated,
Join @@ getArgumentNames[getFunArguments[HoldPattern[f[args]]][[2]]],
n]
},
SetDelayed @@ Hold[f[args], faux @@ heldArgs];
faux[args] := rhs]]
这将分析您的原始定义,提取模式名称,将感兴趣的参数包装在 Unevaluated 中。 ,介绍本地 faux ,并进行两步定义 - 基本上是我们手动完成的步骤。我们需要 SetDelayed @@ ..愚弄 With的变量重命名机制,这样它就不会在 l.h.s. 上重命名我们的模式变量。例子:
In[462]:= 
ClearAll[ff];
defHoldN[ff[x_,y_,z_]:=Hold[x,y,z],2]

In[464]:= ?ff
Global`ff
Attributes[ff]={HoldAll}

ff[x_,y_,z_]:=faux$19106@@Hold[x,Unevaluated[y],z]

In[465]:= ff[1^2,2^2,3^2]
Out[465]= Hold[1,2^2,9]

笔记
请注意,将其概括为需要保存参数的位置列表是微不足道的。一般来说,您需要一个更好的模式解析器,但上面的简单解析器可能是一个好的开始。另请注意,此构造会引起一些运行时开销,还有 Module -生成的辅助函数 faux不会被垃圾回收 ClearRemove主要的 - 您可能需要为使用 defHoldN 生成的函数引入一个特殊的析构函数.有关此问题的替代方法,请参阅我在 this 中的帖子线程(我在其中引入了 makeHoldN 函数的那个​​)。

关于wolfram-mathematica - 持有任何论据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7255999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com