Цикл 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
Цикл ForEach в Mathematica
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.