On this page:
case
case-match
cond
if
let
let*
mv-let
Version: 4.1

2.2 Expressions

Dracula supports these built-in expression forms.

(<function-name> expr ...)

Call a function by writing a sequence starting with its name, followed by expressions to compute its arguments. See Functions and Macros for a list of the functions provided by Dracula, or Events and Definitions to learn how to define your own.

Examples:

  > (identity 'VALUE)

  VALUE

  > (reverse "a man a plan a canal panama")

  "amanap lanac a nalp a nam a"

(case expr (x1 val1) ...)

Checks the value of expr against x1 using eql. If it matches, val1 is returned. Otherwise, it checks any the subsequent branches. The optional otherwise branch is evaluated whenever all the ones before it failed. If no branches match (and an otherwise branch is not given), the case statement returns nil.

Examples:

  > (case (+ 6 4)

          (11 10)

          (10 7)

          (otherwise 'error))

  7

  > (case 6 (5 'match))

  ()

(case-match expr)

(cond (x1 y1)...)

Checks the xs in the given order, and returns the corresponding y for the first x to not evaluate to nil. If no xs match, the cond statement returns nil.

Examples:

  > (cond

     ((< -5 0) (* -1 -5))

     (t -5))

  5

  > (cond (nil 'no) (t 'yes))

  yes

  > (cond (nil 'no))

  ()

(if p q r)

Returns r if p evaluates to nil; otherwise returns q.

Examples:

  > (if (< 0 3) 'yes 'no)

  yes

  > (if (< 3 0) 'yes 'no)

  no

  > (if 5 'yes 'no)

  yes

  > (if 'blah 'yes 'no)

  yes

  > (if nil (+ "str" 'sym) 5)

  5

(let ((var1 term1)...)  body)

Used for binding local variables. All terms are effectively evaluated in parallel; no term may refer to a variable that is bound in the same let expression.

Examples:

  > (let ((x 4)) (+ x 6))

  10

  > (let ((a 1) (b 2)) (+ a b))

  3

  > (let ((a 1) (b (1+ a))) b)

  eval:2230:0: a: undefined in: a

(let* ((var1 term1)...)  body)

Used for binding local variables. All terms are evaluated sequentially, so they may refer to other variables defined in the same let expression

Examples:

  > (let* ((x 4)) (+ x 6))

  10

  > (let* ((a 1) (b 2)) (+ a b))

  3

  > (let* ((a 1) (b (1+ a))) b)

  2

(mv-let x ...)

Examples:

  > (mv-let (x y z)

            (mv 1 2 3)

            (list x y z))

  (1 2 3)