Next: Comments, Up: Scheme Syntax
An expression to be evaluated takes one of the following forms.
(define x 123) x => 123
(
proc args...)
The order in which proc and the arguments are evaluated is unspecified, so be careful when using expressions with side effects.
(max 1 2 3) => 3 (define (get-some-proc) min) ((get-some-proc) 1 2 3) => 1
The same sort of parenthesised form is used for a macro invocation,
but in that case the arguments are not evaluated. See the
descriptions of macros for more on this (see Macros, and
see Syntax Rules).
123 => 123 99.9 => 99.9 "hello" => "hello" #\z => #\z #t => #t
Note that an application must not attempt to modify literal strings,
since they may be in read-only memory.
(quote
data)
'
data'
is simply a shorthand for a quote
form.
For example,
'x => x '(1 2 3) => (1 2 3) '#(1 (2 3) 4) => #(1 (2 3) 4) (quote x) => x (quote (1 2 3)) => (1 2 3) (quote #(1 (2 3) 4)) => #(1 (2 3) 4)
Note that an application must not attempt to modify literal lists or
vectors obtained from a quote
form, since they may be in
read-only memory.
(quasiquote
data)
`
dataquote
, but selected
sub-expressions are evaluated. This is a convenient way to construct
a list or vector structure most of which is constant, but at certain
points should have expressions substituted.
The same effect can always be had with suitable list
,
cons
or vector
calls, but quasi-quoting is often easier.
(unquote
expr)
,
exprunquote
or ,
indicates
an expression to be evaluated and inserted. The comma syntax ,
is simply a shorthand for an unquote
form. For example,
`(1 2 ,(* 9 9) 3 4) => (1 2 81 3 4) `(1 (unquote (+ 1 1)) 3) => (1 2 3) `#(1 ,(/ 12 2)) => #(1 6)
(unquote-splicing
expr)
,@
exprunquote-splicing
or
,@
indicates an expression to be evaluated and the elements of
the returned list inserted. expr must evaluate to a list. The
“comma-at” syntax ,@
is simply a shorthand for an
unquote-splicing
form.
(define x '(2 3)) `(1 ,@x 4) => (1 2 3 4) `(1 (unquote-splicing (map 1+ x))) => (1 3 4) `#(9 ,@x 9) => #(9 2 3 9)
Notice ,@
differs from plain ,
in the way one level of
nesting is stripped. For ,@
the elements of a returned list
are inserted, whereas with ,
it would be the list itself
inserted.