define
(define placeholder exp)
.
Why define
is a special form: What if we tried this as
a normal function, which evaluates all its arguments first?
(define (placeholder ..args..)
body-exp)
. define
). cond
(cond [question-a answer-a] [question-b answer-b] ... [question-z answer-z])Meaning: Evaluate question-a. If it is
true
(or, the
keyword else
), then the value of the entire cond is what we get
by evaluating the expression answer-a. If question-a
evaluated to false, then the value of the entire cond is:
(cond [question-b answer-b] ... [question-z answer-z])(Cf. Recurring on a list.) It is an error to have a
cond
with
no question/answer pairs, or if question-a doesn't evaluate to
a be boolean.
cond
a special form?cond
be a regular function, where
we evaluate all questions and all answers, before even invoking cond
.
What would happen to the following code?:
(define some-list ...) (cond [(empty? some-list) 0] [(cons? some-list) (first some-list)]) ;;;;; Or, consider: (define n ...) (define sum ...) ; Find the average of "n" things adding to "sum": ; (cond [(zero? n) 'average-not-defined] [else (/ sum n)])
define-struct
(define-struct struct-name (field-1 ..
field-n))
, where the struct-name
and each field-i
are placeholders. As mentioned,
this just causes Scheme to create the constructor make-struct-name
,
the selectors struct-name-field-1
, .. struct-name-field-n
,
and the predicate struct-name?
. and
, or
(and arg1 arg2)
. Meaning: Evaluate
arg1
first. If it is false
, return false
.
Otherwise, evaluate arg2
, and return it. (Similarly
for or
, but replace false
with true
.)
This is called "short-circuiting" -- returning an answer even before evaluating
all their arguments. *
could have been
specially written so that if its first argument is 0, then it returns 0
without evaluating further arguments. But that's not what is does. and
a special form: consider
(and (symbol? a-fo) (symbol=? a-fo 'gnat))
a-fo
is not a symbol, what happens?