Обработка гибких аргументов в функциях Mathematica

Это ответвление и расширение: Безопасно ли отключать Pattern :: patv?

Многие встроенные Mathematica функции допускают гибкие аргументы.В пользовательских функциях я использовал для этой цели Альтернативы , но комментарии и ответы на упомянутый вопрос указывают на то, что это, по крайней мере, нестандартно и, возможно, нежелательно.

Позвольте мне определить фиктивную функцию foo в качестве примера.

Off[Pattern::patv]

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

foo[
  {x : p ..} | x : p,
  {y__} | y__,
  ops : OptionsPattern[]
] /; Max[y] <= 10  :=  bar[#, y, ops] & /@ {x}

foo принимает в следующем порядке:

  • объект, соответствующий шаблону p , или список таких объектов.
  • набор неявно числовых объектов с максимальным значением 10, либо в виде списка, либо в виде последовательности аргументов (как написано, эти объекты сами могут быть числовыми списками с максимальным значением 10)
  • сопоставление параметров OptionsPattern []

Если какое-либо из этих условий не выполняется, foo [args] возвращается без оценки.

Два шаблона с использованием Альтернатив ( | ) являются наиболее распространенными случаями, но не исключительными.

Мне сложно понять, как лучше всего реализовать foo .

  • Каков канонический способ сделать это?

  • Каковы его преимущества перед использованием Альтернатив ?

  • Это объективно легче читать?

6
задан Community 23 May 2017 в 11:48
поделиться