これは簡単な質問のように思えます。おそらく、答えを見つけるための検索を見つけるのが難しいほど単純です。Scheme (具体的には、それが違いを生む場合は Guile の実装) では、引用されたものをどのように評価しますか?
これが私がやろうとしていることです。
基本的に、定義した関数が特定の順序で引数を評価されるようにする必要があります。これは、1 つの引数を評価することによって引き起こされる副作用が、他の引数の評価中に依存するためです。ただし、Scheme では、引数は任意の順序で評価できると述べているため、引数を引用符で囲み、必要な順序で手動で評価することにより、手動で強制的に評価したいと考えています。
「eval」は私がやりたいことをするはずですが、2つの問題があります:
- その使用はお勧めできないので、ここでやりたいことを達成するためのより良い方法があるはずだと感じています.
- Scheme では、eval は環境である 2 番目のパラメータを取るようです。これは私を混乱させます。ステートメントが表示されるのと同じ環境で評価したいのに、なぜ2番目のパラメーターが必要なのですか? これは可能ですか?私は eval で少し遊んでみましたが、実装によっては異なるパラメーターが必要なようです (たとえば、mit-scheme は (interaction-environment) が何であるかさえ知りません!!!)
ラムダを構築するなど、他のトリックを試しました:
(list 'lambda '() '(car (b c)))
しかし、プロシージャを生成するには、これを評価する必要があるようです。私も試しました:
(list lambda '() '(car (b c)))
しかし、これはどちらも機能しない「プリミティブ組み込みマクロ」を返します。
編集:評価の順序を制御するためにマクロが機能するように見えます: (defmacro test1 (ab) `(begin ,b ,a))