グローバル変数とは、値セル(チャプター 8 [シンボル]、ページ 65 参照) に値を持つ (全ての)シンボルのことです。ローカルバインディングがグローバル値を隠す(訳注: shadow) ことがあります。 makunbound は、その値を利用できなくします。
Special Form: defvar symbol [value [doc-string]]
この特殊フォームは、コードを読む人に対し、 symbol が変数として (通常)ロー カルにバインドされずに用いられることを知らせます。 (通常) symbol には、 様々なプログラムで変更される値を与えます。 symbol は評価しません。
上記の宣言に加え、 defvar は(この他に)いくつかの働きをします。
オプショナルなアーギュメントを与えると、 defvar はアーギュメント var を評 価し、 symbol が(そうしなければ) unbound である場合、その結果を symbolのグ ローバル値に設定します。 symbolがバインドされている場合、 value は評価も行 ないません。
doc-string が存在する場合、それは、 (Emacs のヘルプシステムが見る) symbol のプロパティーリスト indicator (??)の variable-documentation の下に置かれ ます。 doc-string の最初の文字が `*' である場合、この変数は (通常)ユーザー が変更を行なうユーザーオプションであるとされます。 user-variable-p がこれ を見ます。 doc-string は評価されません。
defvar はその値として symbol を返します。
以下に示す最初の例では、(ユーザーに対し) foo を宣言します。このフォームは foo の値セルは設定しません。 2 番目のフォームは bar の値に 23 を設定し、ド キュメンテーションストリングを与えます。 bar はユーザーオプションではあり ません。 4 番目のフォームは bar のドキュメンテーションストリングを変更し、 bar をユーザーオプションにしますが、値は変えません(加算 (1+ 23) は実行され ません)。
(defvar foo) => foo
(defvar bar 23 "The normal weight of a bar.") => bar (user-variable-p 'bar) => nil
(defvar bar (1+ 23) "*The normal weight of a bar.") => bar bar => 23 (user-variable-p 'bar) => t
次のフォームは、defvar に等価なものを示しています。
(defvar symbol value doc-string) == (progn (if (not (boundp symbol)) (setq symbol value)) (put 'symbol 'variable-documentation 'doc-string) 'symbol)
Function: user-variable-p variable
この関数は、 variable が (プログラムによってではなく) ユーザーによって設定 /変更されるよう意図されているものである場合、t を返します。この関数は、 variable に対するドキュメンテーションストリングの最初の文字を見ているだけ です。その文字が `*' の場合、結果は t で、そうでない場合、結果は nil にな ります。
Special Form: defconst symbol [value [doc-string]]
この特殊フォームは、コードを読む人に対し、 symbol がローカルにバインドされ ず、 (defvar で宣言される変数とは逆に) プログラムの実行では変更されないこ とを知らせます。 (通常) symbol には、ユーザーが変更することはできるが、プ ログラムが変更してはいけないグローバル値を与えます。
上記の定義に加え、 defconst は(この他に)いくつかの働きをします。
defconst はアーギュメント value を評価し、その結果を symbol のグローバル値 に設定します。 symbol は評価しません。
doc-string が存在する場合、それは (Emacs のヘルプシステムが見る) symbol の プロパティーリスト indicator である variable-documentation の下に置かれま す。 doc-string の最初の文字が `*' の場合、この変数はユーザーオプションで あるとされます。 user-variable-p がこれを見ます。 doc-string は評価されま せん。
以下に示す最初のフォームにおいて、 indent-depth はコンスタントで、プログラ ムがこの値を変えてはいけません。しかし、これはユーザーオプションであるため ユーザーがこの値を変更するのはかまいません。 2 番目の例では、pi は(変更し てはいけない)コンスタントです。しかし、3 番目のフォームが示すように、これ はアドバイスとしてのもの(訳注:advisory)であって、Lisp はこのアドバイスを 無視しています。
(defconst indent-depth 4 "*Indent code this many spaces per level.") => indent-depth
(defconst pi 3 " Pi to one place.") => pi (defconst pi 4 "Pi to one place, very inaccurately.") => pi pi => 4