Common Lispにおける例
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/11/26 23:40 UTC 版)
「静的スコープ」の記事における「Common Lispにおける例」の解説
Common Lispは、静的スコープを一般的なルールとし、動的スコープの名前については明示が必要である。 (defvar *a*);; *a* を動的スコープで値なしで宣言する。;; アスタリスクは名前の一部である。;; defvarは、以降のそれに対する束縛が静的なものでなく、;; 動的なものである事を保証する。(setf *a* 5);; 変数 *a* を整数 5 に設定する。(let ((*a* 3)) *a*); --> 3 ;; 明示的にletの中で上書きされた場合、*a*は3*a*; --> 5;; letの外に出るともとに戻る(defvar func-lex)(setf func-lex (let ((a 3))(lambda () a)));; 現在、静的スコープ内の3がlambdaの中に残っている;; したがって、(let ((a 5)) (funcall func-lex)); --> 3;; 外からaを書き換えて呼び出しても、;; 保存された静的な束縛 a = 3 がまだ残っており、;; それが有効になって答えは3となる;; 一方、*a*について考えると、(defvar func-dyn)(setf func-dyn (let ((*a* 3))(lambda () *a*)))(funcall func-dyn); --> 5;; *a*は動的スコープの変数として宣言されているため、;; lambdaの中の *a* は常に;; その時点での最も外側の変数を指すことになる。;; 静的スコープに束縛された *a* = 3 はlambdaの中に保存されない
※この「Common Lispにおける例」の解説は、「静的スコープ」の解説の一部です。
「Common Lispにおける例」を含む「静的スコープ」の記事については、「静的スコープ」の概要を参照ください。
- Common Lispにおける例のページへのリンク