Control Structures

Variables

To reference a variable, simply use its name (a symbol). To assign a variable, use setq.

(setq x 17)        ; assign 17 to variable x
x ⇒ 17             ; value of variable x

To make temporary variables that are in effect only in a certain region of code, use let.

(let ((var1 value1)
      (var2 value2)
       ...)
   body1 body2 ...)

In a let, all the values are computed in an unspecified order before any of the vars are assigned. The variant let* (whose syntax is identical to let) evaluates valuei and assigns it to vari before evaluating valuei+1.

Sequencing

To evaluate a sequence of expressions where only a single expression is allowed, use progn.

(progn expr1 expr2 ...)

Evaluates each expr in turn. Returns the value of the last expr.

To evaluate a sequence of expressions and return the value of the first subexpression instead of the last, use prog1.

Conditionals

Emacs Lisp has two kinds of conditional expression: if and cond.

(if test
    then
else1 else2 ...)

Evaluates test. If the result is non-nil, evaluates then. Otherwise, evaluates each else expression in turn. Returns the value of the last expression it evaluates.

(cond ((test1 body11 body12 ...)
       (test2 body21 body22 ...)
       ...))

Evaluates test1. If the result is non-nil, evaluates each body1 in turn. Otherwise evaluates test2. If the result is non-nil, evaluates each body2, and so on with each "cond clause." Returns the value of the last expression it evaluates.

A common practice is to place a catch-all clause at the end like this:

(cond ((test ...

Get Writing GNU Emacs Extensions now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.