Mini Tutorial Special Variables

A global (and special) variable is created with defvar or defparameter:

(defvar *global-var-1*)
(defvar *global-var-2* 42 "With an initial value if it doesn't already have one and a docstring.")
(defparameter *global-var-3* 33 "Defparameter always assigns the value to the variables.")

To use them, just reference them in code:

(defun g () (list *global-var-1* *global-var-2* *global-var-3*))

(defun f ()
  (setf *global-var-1* 1) ; set its value
  (print *global-var-2*) ; get its value
  (let ((*global-var-3* 0)) ; dynamically bind it (shadowing the global for the TIME being):

;; prints: 42
;; returns: (1 42 0)

(let ((*global-var-2* 22))
;; prints: 22
;; returns: (1 22 0)

But you can also have non-global dynamic variables:

(defun h ()
  (declare (special zz))
  (list zz))

;; error: Unbound variable: zz

(defun i ()
  (let ((zz 42))
    (declare (special zz))

;; returns: (42)

(let ((zz 33))
  (declare (special zz))
;; returns: (33)

defvar or defparameter have both compilation-time effects and load-time/execution effects. For their compilation-time effects to be visible, they must be written before the functions that use the variables, otherwise the compiler will signal a warning.

Categories: Online Tutorial Keywords: special variable dynamic binding