注文

2012-06-25 15 views
7

をLISP私はlispのemacsの中で私の最初のコードの一部を記述しようとしていますし、私は次の動作を理解することはできません注文

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

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

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

私は* emacs lispがアプリケーショナルオーダーの評価を使用していると思いますので、その機能が適用される前にリストが評価されなかったのはなぜですか? (sq 3)があるので(9 1 2 3 4)

と評価さ

私は非nilの条件をテストするためにそれを必要とするので、次のように、私はついにそれを動作させることができ、

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

は、私の質問は、この仕事んです引数の中の要素であった以前の例とは違って、関数(cons)への "直接"引数? consをここで許容される回避策を使用しているか、望ましい動作を得るためのより良い/正しい方法がありますか?

* emacs lispがどのような評価の評価をしているのかは分かりませんでしたが、私はscheme interpreterで同じ表現を試してみましたが、同じ回答がありました。今私は本当に本当に混乱しています!

助けてください。

答えて

16

問題はあなたがリストを引用しているため、その要素のはありませんは評価されますが、単にリテラルシンボルとして渡されます。あなたはリテラルとしてで他人を通過させながら、リストの特定の要素を評価したい場合は、最も便利な形態、すなわち、バッククォートを使用することです:

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

バッククォートが先行し、そのリストの要素を除いて、通常の引用に同じ動作コンマで区切り、評価結果をリストに戻します。

(member 9 (list 1 2 3 4 (sq 3))) 
+0

どうもありがとう:

代わりに、(明示的に引用されていない限り)そのパラメータを評価list機能を、使用することができます。それは助けになりました:) – naiquevin

+1

@naiquevin、私の喜び。 –