変数をリストに追加する前に変数を評価する方法は?


30

以下は明らかに機能しないため、この質問です。

の値がsomelistなるように以下のコードを修正するにはどうすればよい'(("abc" . 123))ですか?

(setq x "abc")
(setq y 123)
(setq somelist nil)
(add-to-list 'somelist '(x . y))

5
準クォートを試しましたか?試してみてください`(,x . ,y)
ダン

ああ、それは私が逃したものです。私は何のためにグーグルにすべきか知りませんでした:)。試しまし(add-to-list 'somelist '(,x . ,y))たが、逆引用符を忘れました。
カウシャルモディ

この質問の重複と見なされる質問は非常に頻繁に繰り返されます。誰かがこの質問/回答が探しているものであることを初心者にもっと明確にする方法を思い付くことができますか?この問題の一部は、この問題の根本的な原因を既に知っている(つまり、答えを知っている)場合にのみ、この質問のタイトルが意味をなすということです。私は、変数を評価する必要があるという考えがなく、「引用」が何を意味するのか少しも知らないが、空になっているユーザーとして自分を想像しようとしています。@ドリュー?
ステファン

@stefan:エラーメッセージ(コミュニティQ + Aの質問タイトルで使用できます)がある場合とは異なり、エラーがある場合は、評価する必要のある何かを引用することから生じます(これは特定の問題です)その場合)引用のサイトから遠く離れている可能性があります。より一般的には、(Emacs)エラーはありません-ユーザーが望んだものに対応しない動作だけです。
ドリュー

@ステファン:このために素晴らしい質問のタイトルが思い浮かぶことはありません。ただし、引用符を削除するだけの「通常の」ケースや、準引用を必要とするケースなど、直接それに取り組む質問を少なくとも作成できます。そのようなケースをカバーする良いQとそれらをカバーする良い答えが役立つでしょう。しかし、重複しているQを見つけるには、Qタイトルにエラーメッセージがなければ、質問全体を読んで、指す重複を見つける方法を知る必要があります。
ドリュー

回答:


30

一般的な問題は、あなたが必要だということです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"))

どちらを使用するかは、要素をどうするかによって異なります。


19

コンスセルは引用符で囲まないでください。引用符で囲まれた式は評価されません。それがまさに評価の理由-引用する理由です。しかし、それはあなたが望むものではないので、そうしないでください。

代わりに、2つの評価された値、その引数からコンスセルを作成するフォームを使用します。

(cons x y)

もちろん、準クォートすることもできますが、それはここではあまり意味がなく、さらに悪く見えます。読みやすさを改善する場合、つまり、コンスセルの構築や既存のリストの先頭にアトムやリストを追加するよりも複雑なことをする場合にのみ使用`して,ください。

準引用を使用すると、次のようになります。

`(,x . ,y)

この場合はまったく必要のない追加の構文をcons使用し、使用されている難読化のため、これはさらに悪いことです。


3
consingの良い点。準クォートは読みやすさよりもリストの内容のきめ細かな制御に関するものだと思いますが、ユースケースはに意味があることに同意しconsます。
ダン

ご回答ありがとうございます。それは私にとって素晴らしいTILの瞬間でした。私は盲目的にリストと短所の前に引用符を付けていました。
カウシャルモディ

@ダン、まあはい-といいえ。Quasiquotingはあなただけで行うことができなかったことを何もできないconslistnconc。きれいであることを除いて。「リストの内容をきめ細かく制御する」(「最初にアトムやリストを追加するよりも複雑なことをする」など)が必要な場合に便利なのは構文糖です。そして、その構文糖を使用する追加の利点は、読みやすさです。準クォートは、よりきめ細かな制御を提供するものではありません-最初の試行で、より少ないバグで同じことを行うことができます。:-)
タリシウス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.