私はこのようなものが欲しいです:
each[i_, {1,2,3},
Print[i]
]
または、より一般的には、ループしているリスト内の任意のものを分解するには、次のようにします。
each[{i_, j_}, {{1,10}, {2,20}, {3,30}},
Print[i*j]
]
通常、Map
または他の純粋に機能的な構造を使用し、副作用を使用する非機能的なプログラミング スタイルを避けます。しかし、これは for-each コンストラクトが非常に役立つと私が考える例です。
次のように、シンボルと式をペアにするオプション (ルール) のリストがあるとします。
attrVals = {a -> 7, b -> 8, c -> 9}
ここで、これらのシンボルをそれらの数値に明確にマッピングするハッシュ テーブルを作成したいと考えています。それよりもクリーンな方法はないと思います
each[a_ -> v_, attrVals, h[a] = v]
追加のテスト ケース
この例では、変数のリストを変換します。
a = 1;
b = 2;
c = 3;
each[i_, {a,b,c}, i = f[i]]
上記の後、 に{a,b,c}
評価されるはず{f[1],f[2],f[3]}
です。これは、リストの場合、 の 2 番目の引数が評価されないままにしてeach
おく必要があることを意味することに注意してください。
未評価のフォームがリストでない場合、2 番目の引数を評価する必要があります。例えば:
each[i_, Rest[{a,b,c}], Print[i]]
b
との値が表示されc
ます。
補遺: for-each を適切に行うには、 and をサポートする必要がBreak[]
ありContinue[]
ます。それを実装する方法がわかりません。おそらく、For、While、または Do に関して何らかの方法で実装する必要があります。これは、 Break[]
andをサポートする唯一のループ構造であるためContinue[]
です。
そして、これまでの回答のもう 1 つの問題: 彼らは s を食べReturn[]
ます。つまり、関数で ForEach ループを使用していて、ループ内から関数から戻りたい場合はできません。ForEach ループ内で Return を発行すると、 のように機能するようContinue[]
です。これはちょうど(それを待って)私をループに投げ込みました。