7

私は最初のコードのいくつかをemacslispで書き込もうとしていますが、次の動作を理解できません

(defun sq (x) (* x x))

(member 9 '(1 2 3 4 (sq 3)))

これは評価されnilますが、私が期待していた値は(9)

今、私は* emacs lispが適用順序評価を使用していると思いますが、関数が適用される前にリストが評価されなかったのはなぜですか?

非ゼロ状態をテストするためだけに必要だったので、最終的に次のように機能させることができました。

(member 9 (cons (sq 3) '(1 2 3 4)))

これはに評価されます(9 1 2 3 4)

私の質問は(sq 3)、引数内の要素であった前の例とは異なり、関数(短所)への「直接」引数であるため、これは機能しますか?ここで許容可能な回避策を使用しconsていますか、それとも目的の動作を取得するためのより良い/正しい方法がありますか?

* emacs lispが使用する順序評価を確実に見つけることはできませんでしたが、schemeインタープリターで同じ式を試し、同じ答えを得ました。SICPから、schemeが適用可能な順序評価を使用していることがわかりました。今、私は本当に混乱しています!

助けていただければ幸いです。

4

1 に答える 1

17

問題は、リストを引用しているため、その要素は評価され、文字通りの記号として渡されるだけであるということです。リストの特定の要素を評価し、他の要素をリテラルとして渡したい場合、最も便利な形式は、バッククォートを使用することです。

(member 9 `(1 2 3 4 ,(sq 3)))

バッククォートは通常のクォートと同じように動作しますが、コンマが前に付いたリスト要素が評価され、評価の結果がリストに戻される点が異なります。

listまたは、 (明示的に引用されていない限り)パラメーターを評価する関数を使用することもできます。

(member 9 (list 1 2 3 4 (sq 3)))
于 2012-06-25T18:29:24.767 に答える