(通常)変数を参照するためには、その変数を名指すシンボルを(評価可能な) フォーム の中に書きます。以下に示すものは、シンボルの値や関数セルを参照/変更するための (別の)方法を提供しています。
Function: symbol-value symbol
この関数は、 symbol の値を返します。これは(そのシンボルの)最もローカルなバ インディングか、 (バインドされてない場合は)そのグローバル値になります。
symbol がバインディングもグローバル値も持たない場合、エラーになります。
(setq abracadabra 5) => 5
(let ((abracadabra 'foo)) (symbol-value 'abracadabra)) => foo (symbol-value 'abracadabra) => 5
Function: set symbol object
この関数は、 symbol の値に object を設定します。 (set は関数であるため) symbol を評価し、その値(シンボルでなくてはいけません)に object を設定しま す。通常、これは(その)変数に設定された最もローカルなバインディングになりま す。
(set one 1) -> ERROR Symbol's value as variable is void: one (set 'one 1) => 1 (set 'two 'one) => one (set two 2) => 2 ;two は one に評価されるため one の値に one ;2 が設定される。 => 2 (let ((one 1)) ;グローバル値ではなく、 (set 'one 3) ;one の(この)バインディングが設定される。 one) => 3 one => 2
----------------
CN: Common Lisp では、set は(常に)グローバル環境に対し操作を行ない、シンボルの グローバル値は変更しますが、ローカルバインディングは変更しません。 GNU Emacs Lisp はそうではありません。
----------------
Special Form: setq [symbol object]*
この特殊フォームは、シンボルの値を変える (最も)普通の方法です。各 symbol に対し、(symbol の評価は行なわず) object の評価結果をその symbol の値(その ローカルバインディングか、それが存在しない場合グローバル値) に設定します。 symbol と object の pair が 2 つ以上存在する場合、順に設定を行ない、最後の object の値を返します。
(setq x (1+ 2)) => 3 (setq x 10 y (1+ x)) ;x は前に設定されていて、(訳注:結果は?) y => 11 ;y は その値を用いている点に注意。 (let ((x 5)) (setq x 6) x) => 6 ;x のローカルバインディングが設定されている。 x => 11 ;グローバル値は変更されていない。