以下は明らかに機能しないため、この質問です。
の値がsomelist
なるように以下のコードを修正するにはどうすればよい'(("abc" . 123))
ですか?
(setq x "abc")
(setq y 123)
(setq somelist nil)
(add-to-list 'somelist '(x . y))
(add-to-list 'somelist '(,x . ,y))
たが、逆引用符を忘れました。
以下は明らかに機能しないため、この質問です。
の値がsomelist
なるように以下のコードを修正するにはどうすればよい'(("abc" . 123))
ですか?
(setq x "abc")
(setq y 123)
(setq somelist nil)
(add-to-list 'somelist '(x . y))
(add-to-list 'somelist '(,x . ,y))
たが、逆引用符を忘れました。
回答:
一般的な問題は、あなたが必要だということですx
し、y
彼らが挿入されます前に評価されますsomelist
。問題(引用符で囲んでリスト'
として読者の構文が)つまりquote
その引数を評価しない特殊な形式です。docstringによると:
(quote ARG)
引数を評価せずに返します。
(quote x)
収量x
。警告:quote
戻り値を構築するのではなく、Lispリーダーによって事前に構築された値を返すだけです...
したがって、逆引用符を付けるか、引数を評価する関数を使用する必要があります。
逆引用符を使用すると、,
構文を使用して、逆引用符付きリストの要素を選択的に評価できます。
(setq x "x-val" y "y-val" z "z-val" somelist nil)
'(x y z) ; => (x y z)
`(x ,y z) ; => (x "y-val" z)
(add-to-list 'somelist `(x y ,z)) ; => ((x y "z-val"))
または、cons
(@ tarsiusが彼の答えで示唆しているように)または、任意の数の要素に対して、次を使用できますlist
。
(add-to-list 'somelist (cons x y)) ; => (("x-val" . "y-val"))
(setq somelist nil) ; reset
(add-to-list 'somelist (list x y z)) ; => (("x-val" "y-val" "z-val"))
どちらを使用するかは、要素をどうするかによって異なります。
コンスセルは引用符で囲まないでください。引用符で囲まれた式は評価されません。それがまさに評価の理由-引用する理由です。しかし、それはあなたが望むものではないので、そうしないでください。
代わりに、2つの評価された値、その引数からコンスセルを作成するフォームを使用します。
(cons x y)
もちろん、準クォートすることもできますが、それはここではあまり意味がなく、さらに悪く見えます。読みやすさを改善する場合、つまり、コンスセルの構築や既存のリストの先頭にアトムやリストを追加するよりも複雑なことをする場合にのみ使用`
して,
ください。
準引用を使用すると、次のようになります。
`(,x . ,y)
この場合はまったく必要のない追加の構文をcons
使用し、使用されている難読化のため、これはさらに悪いことです。
cons
ingの良い点。準クォートは読みやすさよりもリストの内容のきめ細かな制御に関するものだと思いますが、ユースケースはに意味があることに同意しcons
ます。
cons
、list
とnconc
。きれいであることを除いて。「リストの内容をきめ細かく制御する」(「最初にアトムやリストを追加するよりも複雑なことをする」など)が必要な場合に便利なのは構文糖です。そして、その構文糖を使用する追加の利点は、読みやすさです。準クォートは、よりきめ細かな制御を提供するものではありません-最初の試行で、より少ないバグで同じことを行うことができます。:-)
`(,x . ,y)
。