Common Lisp is a general-purpose programming language, in contrast to Lisp variants such as Emacs Lisp and AutoLISP which are embedded extension languages in particular products. Unlike many earlier Lisps, but like Scheme, Common Lisp uses lexical scoping[?] for variables.
Common Lisp is a multi-paradigm programming language that:
|
Syntax Common Lisp is a Lisp; it uses S-expressions to denote both code and data structure. Function and macro calls are written as lists, with the name of the function first, as in these examples:
(+ 2 2) ; adds 2 and 2, yielding 4 (setq pi 3.1415) ; sets the variable "pi" equal to 3.1415
; Define a function that squares a number (defun square (x) (* x x)) ; Execute the function (square 3) ; Returns "9"
The Common Lisp character type is not limited to ASCII characters; unsurprising, as Lisp predates ASCII. Some modern implementations allow Unicode characters. [1] (http://www.cliki.net/Unicode%20Support)
The symbol type is common to Lisp languages, but largely unknown outside them. A symbol is a unique, named data object. Symbols in Lisp are similar to identifiers in other languages, in that they can be used as variables to hold values; however, they are more general and can be used for themselves as well. Boolean values in Common Lisp are represented by the reserved symbols T and NIL.
As in any other Lisp, lists in Common Lisp are composed of conses, sometimes called cons cells or pairs. A cons is a data structure of two elements, called its car and cdr. A list is a linked chain of conses wherein each cons's cdr points to the next element, and the last cdr points to the NIL value. Conses can also easily be used to implement trees and other complex data structures.
Hash tables store associations between data objects. Any object may be used as key or value. Hash tables, like arrays, are automatically resized as needed.
Conditions are a special type used to represent errors, exceptions, and other "interesting" events to which a program may respond.
For instance, the sort
function takes a comparison operator as an argument. This can be used not only to sort any type of data, but also to sort data structures according to a key.
(sort '(5 2 6 3 1 4) #'>) ; Returns (6 5 4 3 2 1), using the > function as the comparison operator
(sort '((9 a) (3 b) (4 c)) #'(lambda (x y) (< (car x) (car y)))) ; Returns ((3 b) (4 c) (9 a)), i.e. the list sorted by the first element
Common Lisp is a Lisp-2, meaning that there are separate namespaces for defined functions and for variables. (This differs from, for instance, Scheme, which is a Lisp-1.) Lisp-2 has the advantage that a local variable name will never shadow a function name: One can call a variable cons
or even if
with no problems. However, to refer to a function variable one must use the #'
notation, as in the above examples.
Common Lisp also includes a toolkit for object-oriented programming, the Common Lisp Object System or CLOS.
Macros allow Lisp programmers to create new syntactic forms in the language. For instance, this macro provides the until
loop form, which may be familiar from languages such as Perl:
(defmacro until (test &rest body) `(do () (,test) ,@body))
This differs from a function in that it can repeatedly evaluate its arguments. A function's arguments are evaluated only once, before the function is called; a macro controls its arguments' evaluation or other use in the macro-expansion.
Variable capture is sometimes a desired effect; when it is not, it must be avoided using gensyms[?], or guaranteed-unique symbols.
Implementations Common Lisp is defined by a specification (like Ada and C) rather than by a single implementation (like Perl). There are many implementations, and the standard spells out areas in which they may validly differ.
In addition, implementations tend to come with divergent sets of library packages, which provide functionality not covered in the standard. Some of these features have been rolled back into the standard, such as CLOS and the LOOP construct; others remain implementation-specific. Unfortunately, many valuable facilities for the modern programmer -- such as TCP/IP networking -- remain unstandardized.
It is a common misconception that Common Lisp implementations are all interpreters. In fact, compilation is part of the language specification. Most Common Lisp implementations compile functions to native machine code. Others compile to bytecode, which reduces speed but improves portability.
Some Unix-based implementations, such as CLISP, can be used as script interpreters.
Freely redistributable implementations include:
There are also commercial implementations available from Franz, Xanalys, Digitool, Corman and Scieneer.
see also: WCL, Kyoto Common Lisp.
Search Encyclopedia
|
Featured Article
|