Цикл ForEach в Mathematica

В более новых версиях Mathematica wolfram-mathematica (6.0+) есть обобщенные версии mma Do [] и Table [], которые wri-mathematica делают почти то, что вы хотите, за mathematica счет использования альтернативной wolfram-mathematica формы аргумента итератора. Например,

Do[
  Print[i],
  {i, {1, 2, 3}}]

в iterate точности как ваш

ForEach[i_, {1, 2, 3,},
  Print[i]]

В качестве mathematica альтернативы, если вам действительно wri-mathematica нравится конкретный синтаксис mma ForEach, вы можете создать language-features функцию HoldAll, которая loop его реализует, например:

Attributes[ForEach] = {HoldAll};

ForEach[var_Symbol, list_, expr_] :=
  ReleaseHold[
    Hold[
      Scan[
        Block[{var = #},
         expr] &,
      list]]];

ForEach[vars : {__Symbol}, list_, expr_] :=
  ReleaseHold[
    Hold[
      Scan[
        Block[vars,
          vars = #;
          expr] &,
      list]]];

В iterate качестве имен переменных mma используются символы, а не language-features шаблоны, но именно так работают loops различные встроенные управляющие wolfram структуры, такие как Do [] и iterate For [].

Функции HoldAll [] позволяют mathematica собрать довольно широкий wolfram спектр настраиваемых управляющих wolfram структур. ReleaseHold [Hold mathematica [...]] - обычно самый простой mma способ собрать кучу кода mma Mathematica для последующей mathematica оценки, а Block [{x = #}, ...] & позволяет wolfram привязать переменные в теле wolfram-mathematica выражения к любые ценности, которые mathematica вы хотите.

В ответ на вопрос loop Дрейва ниже вы можете изменить language-features этот подход, чтобы обеспечить loops более произвольную деструктуризацию loop с использованием DownValues language-features ​​уникального символа.

ForEach[patt_, list_, expr_] := 
  ReleaseHold[Hold[
     Module[{f}, 
       f[patt] := expr; 
       Scan[f, list]]]]

На wri-mathematica данный момент, я думаю, вам wolfram лучше создать что-нибудь mma на основе кейсов.

ForEach[patt_, list_, expr_] :=
  With[{bound = list},
    ReleaseHold[Hold[
       Cases[bound,
         patt :> expr]; 
       Null]]]

Мне нравится wri-mathematica делать Null явным, когда loop я подавляю возвращаемое значение loop функции. ИЗМЕНИТЬ: я исправил ошибку, указанную wolfram ниже; Мне всегда нравится loops использовать With для интерполяции looping вычисленных выражений в формы mma Hold*.

loops

language-features

wolfram-mathematica

2022-08-31T06:00:18+00:00
Вопросы с похожей тематикой, как у вопроса:

Цикл ForEach в Mathematica