Just as the expression which is function call, without a prior apostrophe represents value of expression, instead of expression, and atoms can be used for the denotation of any values. The attention is already paid that before Lisp constants (numbers and symbols true, false and nil) it is not necessary to put an apostrophe. As constants they designate themselves. If to enter a constant the interpreter as result will produce this constant:
>true ; value of true is itself true >'true ; the apostrophe is not necessary true >nil nil >3.14 3.14
Symbols can be used as variables. In this case they can designate some expressions. Symbols initially do not have any value, as for constants. If, for example, we will enter functions symbol we will receive error message:
>functions Error: Symbol functions have no value
The interpreter here cannot calculate value of the symbol as it for it is not present.
By means of function set the symbol can assign or link to it some value. If, for example, we want, that functions symbol designated base functions Lisp we will enter:
>('functions set '(first rest cons atom eq)) (first rest cons atom eq)
Now between functions symbol and value (first rest cons atom eq) link which is real before the operation termination if, of course, to this name function set will not assign new value is derivated. After assignment the interpreter can already calculate value of symbol functions:
>functions (first rest cons atom eq)
Pay attention, that set calculates both arguments. If before the first argument there is no apostrophe by means of function set it is possible to assign value of a name which turns out by calculation. For example, call
>((functions first) set '(to climb up in a head)) (to climb up in a head)
assigns a variable first expression (to climb up in a head), as call (first) returns to function as value first character which is used as actual argument of function call set:
>(functions first) ; the first argument of the previous call first >first ; assigned by function set value (to climb up in a head) >functions (first rest cons atom eq)
Along with function set to link the character to its value it is possible by means of function setq. This function differs from set that it calculates only the second argument. The q character reminds of automatic blocking of calculation of the first argument in a function name. For example:
>(nil setq functions '(first rest cons atom eq)) nil
At function usage setq need for the apostrophe sign before the first argument passes.
To check up, whether the atom is linked, it is possible by means of a predicate boundp which is true when the atom has any value:
>('withoutvalue boundp) false >('functions boundp) true >('true boundp) ; the constant is always linked true
Functions set and setq differ from other considered functions by that besides they matter, they possess also a by-effect. The effect of function consists in link derivation between the symbol and its value, and value of function is linked value. The symbol remains linked to a defined value until this value will not change.
In Lisp all operations return some value. Value is available even for such operations which main destination consists in realisation of a by-effect, such, for example, as binding of the symbol or output of results to the press. The functions possessing a by-effect, in Lisp name as pseudo-functions. We will be nevertheless both for functions, and for pseudo-functions to use concept of function if only there is no special need to underline by-effect presence.
Pseudo-function call, for example the control transfer operator (and it too call), from the point of view of usage of its value can stand on a place of argument of other function. (In the programming languages grounded on the operator approach, it is usually impossible.)
>(nil list ('a set 3) 4) (3 4) >a 3 >(nil list (('b set 3) + 4) b) ; arguments are calculated in a parallel way Error: Symbol b have no value
In practical programming of pseudo-function are useful and often necessary, though in the theory, pure functional programming, they are not necessary.
Interpreter Lisp is named eval, and it is possible the same as also other functions to call it from the program. At usual programming to call the interpreter it is not necessary, as this call implicitly is present at dialogue of the programmer with Lisp-system.
Superfluous call of the interpreter can to remove, for example, the effect of locking of calculation or allows to find value of expression, i.e. to carry out double calculation:
>'(2 + 3) (2 + 3) >(nil eval '(2 + 3)) 5
Here the interpreter calculates value of the first expression '(2 + 3), receiving as a result (2 + 3). Further call eval allows to start again the interpreter, and value of expression (2 + 3), i.e. 5 will be result. Initial expression is handled in two stages. We will bring some more examples:
>(nil setq x '(a b c)) nil >'x x >(nil eval 'x) (a b c) >(nil eval x) ; value of x is (a b c) Error: have no function link of b for 3 >(nil eval ''(a b c)) (a b c) >'(nil eval x) (nil eval x)
' and eval operate in mutual opposite directions and cancel effect each other.
eval is universal function Lisp which can calculate any correctly made expression. eval defines semantics of forms, i.e. defines, what symbols and forms together with what and that are meant also by what expressions matter.
It is possible compactly enough and to define semantics Lisp neatly on most Lisp. The most part of system programs in Lisp-systems is written on Lisp, and the user can easily change system depending on the requirements.
With interpreter Lisp at the uppermost, command level, it is possible to describe dialogue by a simple cycle:
(cout write '>) ; prompt output (nil setq e (cin read)) ; expression input (nil setq v (nil eval e)) ; calculation of its value (cout print v) ; result output (cout write '>) ; cycle repetition …
Interpreter Lisp answers the question asked to it and new value waits.