If a form is a symbol, then it is either a symbol macro or a variable.
The symbol names a symbol macro if there is a binding of the symbol as a symbol macro in the current lexical environment (see define-symbol-macro and symbol-macrolet). If the symbol is a symbol macro, its expansion function is obtained. The expansion function is a function of two arguments, and is invoked by calling the macroexpand hook with the expansion function as its first argument, the symbol as its second argument, and an environment object (corresponding to the current lexical environment) as its third argument. The macroexpand hook, in turn, calls the expansion function with the form as its first argument and the environment as its second argument. The value of the expansion function, which is passed through by the macroexpand hook, is a form. This resulting form is processed in place of the original symbol.
If a form is a symbol that is not a symbol macro, then it is the name of a variable, and the value of that variable is returned. There are three kinds of variables: lexical variables, dynamic variables, and constant variables. A variable can store one object. The main operations on a variable are to read[1] and to write[1] its value.
An error of type unbound-variable should be signaled if an unbound variable is referenced.
Non-constant variables can be assigned by using setq or bound[3] by using let. The next figure lists some defined names that are applicable to assigning, binding, and defining variables.
boundp let progv defconstant let* psetq defparameter makunbound set defvar multiple-value-bind setq lambda multiple-value-setq symbol-value
Figure 3-1. Some Defined Names Applicable to Variables
The following is a description of each kind of variable.
3.1.2.1.1.3 Constant Variables
3.1.2.1.1.4 Symbols Naming Both Lexical and Dynamic Variables