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?