1

*var*いくつかのドキュメントでは、答えはグローバル変数を意味すると彼らが言っていることがわかりました。

しかし、私が試したとき、私はそれを確認することができませんでした。

  FIRST-PACKAGE[27]> (defvar b 1)
  B
  FIRST-PACKAGE[28]> b
  1
  FIRST-PACKAGE[29]> (defun add_b (x) (+ x b))
  ADD_B
  FIRST-PACKAGE[30]> (add_b 3)
  4
  FIRST-PACKAGE[31]>

私の例でbは、その答えが正しければ、まだグローバルではありません。

しかし、なぜ関数add_bはまだそれを使用できるのですか?

この例を理解する方法と*var*

ありがとう〜

4

3 に答える 3

1

私はここでCommonLispについて話している:

DEFVARグローバル変数を宣言し、動的バインディングを使用することを宣言します。特殊変数です。慣例として、アスタリスクを使用して、それが特別な変数であること、つまり動的バインディングを使用して*b*いることを思い出させます。他の名前でも構いません。それは単なる慣習です。あなたの例では、名前を使用します。私はそれをお勧めしません。代わりに、 asによって宣言された規則と名前変数に従います。同じルールがに役立ちます。bDEFVAR*b*DEFPARAMETER

あなたの例であなたが何を意味するのかははっきりしていません。もちろん、関数内でグローバル変数を使用することもできます。

于 2012-08-13T11:03:50.623 に答える
0

わかった。Common Lispには、事実上2つのタイプの変数があります。字句的にバインドされる常に使用する変数と動的にバインドされる「特別な」変数です。「特別な」変数は、、、または宣言で作成されdefvarますdefparameter*earmuffs*変数が特別であることをLispプログラマーに思い出させるために存在する規則です。ここではいくつかの例を示します。

(defvar b 3)

(defun add-to-b (x)
  (+ x b))

(add-to-b 1)
  => 4

(let ((b 4))
  (list (add-to-b 1) b))
=> (5 4)

(let ((a 3))
  (defun add-to-a (x)
    (+ x a)))

(add-to-a 1)
  => 4

(let ((a 4))
  (list (add-to-a 1) a))
=> (4 4)

ご覧のとおり、aの特別な変数letの値を変更すると、その中のすべての関数呼び出しに対して値の変更が「トリクルダウン」されますletが、通常の字句結合変数の値の変更は渡されません。実際、字句的にバインドされた変数は、関数が定義された場所にあるスコープを上に移動することによって検索されますが、特別な変数は、関数が呼び出されたスコープを上に移動することによって検索されます。これら*earmuffs*は、特別な変数の外観が異なるため、プログラマーが誤って特別な変数を再バインドするのを防ぐのに役立ちます。

于 2012-08-13T13:42:40.953 に答える
-1

まず最初に:Common Lispで「特別な」変数を宣言するには、次の方法でそれを導入する必要がありますdefvar

(devar *variable* "initial value")

変数名の周りの「イヤーマフ」(*)は、変数が特別であることを人間の読者に伝える単なる慣例です。これは、変数が特殊であることをコンパイラーに通知することとは関係ありません。*文字は変数の名前の一部であることに注意してください(そうです、Common Lisp*はシンボル名を許可します-他の「珍しい」文字の束と一緒に)

于 2012-08-13T11:05:17.430 に答える