なぜレキシカルスコープのlet-bound変数に対してsetqとset quoteの動作が異なるのですか?


14

拡張機能の1つにバグがあり、最終的にsetは期待どおりに機能しなかったことが原因であることが判明しました。

;; -*- lexical-binding: t -*-

(let ((a nil))
  (setq a t)
  (print a))


(let ((a nil))
  (set 'a t)
  (print a))

emacs -Q --batch -l temp.elプリントで実行した場合:

t

nil

これは私には非常に奇妙に思えます。私(setq a b)は略記の印象を受けていました(set 'a b)。どうしたの?

回答:


14

これは文書化された動作です。Emacs 25.1 elispマニュアルの(非常に改善された)説明は次のとおりです。

シンボルオブジェクト自体に関連付けられている動的変数とは異なり、字句変数とシンボルの関係はインタプリタ(またはコンパイラ)にのみ存在することに注意してください。したがって、シンボル引数(「symbol-value」、「boundp」、「set」など)をとる関数は、変数の動的バインディング(つまり、そのシンボルの値セルの内容)のみを取得または変更できます。

C-hig (elisp) Lexical Binding

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.