处理Mathematica函数中的灵活参数

Mr.*_*ard 6 arguments wolfram-mathematica user-defined-functions

这是一个分支和扩展:关闭Pattern :: patv是否安全?

许多内置的Mathematica函数允许灵活的参数.在我Alternatives用于此目的的用户定义函数中,但引用问题的注释和答案表明这至少是非标准的,也许是不合需要的.

让我定义一个虚函数foo作为例子.

Off[Pattern::patv]

p = {_?NumericQ, _?NumericQ};

foo[
  {x : p ..} | x : p,
  {y__} | y__,
  ops : OptionsPattern[]
] /; Max[y] <= 10  :=  bar[#, y, ops] & /@ {x}
Run Code Online (Sandbox Code Playgroud)

foo 接受,按顺序:

  • 一个匹配patten的对象p,或者这些对象的列表.
  • 一组最大值为10的隐式数字对象,作为列表或参数序列(因为这些对象本身可能是最大值为10的数字列表)
  • 选项匹配 OptionsPattern[]

如果不满足任何这些条件,foo[args]则返回未评估.

使用Alternatives(|)的两个模式是最常见的情况,但它们不是唯一的.

我很难看到如何foo最好地实施.

  • 实现这一目标的规范方法是什么?

  • 它比使用有Alternatives什么优势?

  • 它客观上更容易阅读吗?

rco*_*yer 4

我相信存在三种处理灵活论证的规范方法:

  1. 什么都可以:f[x_]
  2. 多种形式:f[{x : p ..}]and f[x:p],其中一个调用另一个,并且
  3. 交替:f[{x : p ..} | x : p].

主要区别在于您处理灵活参数增加的复杂性的位置。每个都有其优点。

任何事情的主要优点是创建可接受模式的简单性,但这将处理留给函数内部,从而增加了其复杂性。有关这方面的一个很好的示例,请参阅ErrorBarPlots .m文件。但最终,ErrorListPlot依赖于隐藏在第一种方法背后的第二种方法。

多种形式的方法将复杂性推给了调度程序以选择正确的替代方案。它具有最简单的功能形式,因为一种形式通常调用另一种具有“正确”数据布局的形式。这种方法的困难在于函数规范随着具有替代项的参数数量呈指数增长。这可以通过采用混合方法来限制,就像在 中发现的那样ErrorListPlot

交替具有最复杂的模式形式,并且可能需要特殊处理来提取类似于任何情况的替代方案。此外,模式本身可能更难以构造,并且由于可能需要额外处理,因此在三种方法中应该最少使用此方法。但是,在某些情况下,例如在您的代码中,此方法可能是最简单的实现。