Go to the first, previous, next, last section, table of contents.

グローバル変数

グローバル変数とは、値セル(チャプター 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


Go to the first, previous, next, last section, table of contents.