如何使DownValues不重新排序函数定义
如何防止DownValues重新排序函数定义?有没有简单的方法来修复它?任何建议都将不胜感激。
解答动态
您可以更改系统选项以实现您的目标目标:
设置系统选项[quot;-gt;打印[x],HoldPattern[f[x\u]]:gt;x^2,HoldPattern[f[x\u List]]:quot;definitionsrorderingquot;DEFINITIONSREORDINGgt;None],defs,SetSystemOptions[old]]] (如果使用版本12.2,则将内部`WithLocalSettings替换为WithCleanup)
然后:
清除[f] 无序定义?EvenQ]:=x^2;f[x\u List]:=Length[x]]DownValues[f] {HoldPattern[f[x\u]]:gt;x,HoldPattern[f[x\u]?EvenQ]]:gt;Length[x]}
一个想法和一个简单的实现 这里有一个可能的方法来实现您想要的:定义一个包含所有定义的包装器,记住它们的原始顺序,并在它们完成后重新排序评估:
ClearAll[defineOrdered]集合属性[defineOrdered,HoldAll];defineOrdered[func\u Symbol,definitions\u SetDelayed]:=Module[{defIndex},MapIndexed[Function[{def,pos},With[{index=pos[[1]]},Replace[Unevaluated[def],Verbatim[SetDelayed][lhs,rhs]:amp;@SortBy[First]@Replace[DownValues[func],Verbatim[RuleDelayed][lhs,defIndex[index,rhs]]:gt;20],g[x琰]:=10](*{HoldPattern[g[x琰]:]:=带[{y=x^2},x/;y]:=10DownValues[g](*{HoldPattern[g[x_3;]:gt;20],HoldPattern[g[x_3;]:gt;3,HoldPattern[ff[2]]:gt;1} *) 发生这种情况的原因是,这些定义由DownValues单独存储在内部哈希表中,并自动重新排序,无论发生什么。
如果出于某种原因,在这种情况下需要原始顺序,则可以使用Sort-gt;False](*{HoldPattern[ff[3]]:gt;2,HoldPattern[ff[1]]:>;3}*) 尽管在这种情况下,它通常也不重要,因为这样的定义通常不会相互影响。- End
免责声明:
本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。