Dynamic and Lexical variables in Common Lisp

前端 未结 5 1518
予麋鹿
予麋鹿 2020-12-07 16:25

I am reading the book \'Practical Common Lisp\' by Peter Seibel.

In Chapter 6, "Variables" sections "Lexical Variables and Closures" and "Dyn

5条回答
  •  再見小時候
    2020-12-07 17:28

    Maybe this example will help.

    ;; the lexical version
    
    (let ((x 10)) 
      (defun lex-foo ()
        (format t "Before assignment~18tX: ~d~%" x)
        (setf x (+ 1 x))
        (format t "After assignment~18tX: ~d~%" x)))
    
    (defun lex-bar ()
      (lex-foo)
      (let ((x 20)) ;; does not do anything
        (lex-foo))
      (lex-foo))
    
    ;; CL-USER> (lex-bar)
    ;; Before assignment X: 10
    ;; After assignment  X: 11
    ;; Before assignment X: 11
    ;; After assignment  X: 12
    ;; Before assignment X: 12
    ;; After assignment  X: 13
    
    ;; the dynamic version
    
    (defvar *x* 10)
    (defun dyn-foo ()
      (format t "Before assignment~18tX: ~d~%" *x*)
      (setf *x* (+ 1 *x*))
      (format t "After assignment~18tX: ~d~%" *x*))
    
    (defun dyn-bar()
      (dyn-foo)
      (let ((*x* 20))
        (dyn-foo))
      (dyn-foo))
    
    ;; CL-USER> (dyn-bar)
    ;; Before assignment X: 10
    ;; After assignment  X: 11
    ;; Before assignment X: 20
    ;; After assignment  X: 21
    ;; Before assignment X: 11
    ;; After assignment  X: 12
    
    ;; the special version
    
    (defun special-foo ()
      (declare (special *y*))
      (format t "Before assignment~18tX: ~d~%" *y*)
      (setf *y* (+ 1 *y*))
      (format t "After assignment~18tX: ~d~%" *y*))
    
    (defun special-bar ()
      (let ((*y* 10))
        (declare (special *y*))
        (special-foo)
        (let ((*y* 20))
          (declare (special *y*))
          (special-foo))
        (special-foo)))
    
    ;; CL-USER> (special-bar)
    ;; Before assignment X: 10
    ;; After assignment  X: 11
    ;; Before assignment X: 20
    ;; After assignment  X: 21
    ;; Before assignment X: 11
    ;; After assignment  X: 12
    

提交回复
热议问题