Memoize

BasicWerk   EC Support   Technique   Facebook  

20140908154624_Common_Lisp_defvar_defparameter

Common_Lisp_defvar_defparameter

 

 

  • defvar は変数が未定義のときだけ評価される
  • defparameter は呼ばれる度に評価される

 

 
;; SBCL の REPL を起動した直後 = まっさらの状態
 
;; シンボル foo は未定義なのでエラーになる
* foo
 
debugger invoked on a UNBOUND-VARIABLE: The variable FOO is unbound.
 
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
 
restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.
 
(SB-INT:SIMPLE-EVAL-IN-LEXENV FOO #<NULL-LEXENV>)
0] :a
 
;; defvar で値を代入
* (defvar foo 1)
 
FOO
 
* foo
 
1
 
;; foo はもう未定義ではないので、
;; もう一度別の値で defvar しても・・・
* (defvar foo 100)
 
FOO
 
* foo
 
1
;; 未定義の状態から最初にバインドされた値を保持している
 
 
;; defparameter は単純に呼ばれる度に評価されて
;; 変数に都度代入される
* bar
 
debugger invoked on a UNBOUND-VARIABLE: The variable BAR is unbound.
 
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
 
restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.
 
(SB-INT:SIMPLE-EVAL-IN-LEXENV BAR #<NULL-LEXENV>)
0] :a
 
* (defparameter bar 1)
 
BAR
 
* bar
 
1
 
* (defparameter bar 100)
 
BAR
 
* bar
 
100
 
 
;; スペシャル変数としての振る舞いは同じ
* (let ((foo 8)(bar 8)) (format t "foo: ~D, bar: ~D~%" foo bar))
foo: 8, bar: 8
NIL
 
* foo
 
1
 
* bar
 
100
 

 


© Shin Nakamura/BasicWerk 2014