[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Scheme BNF
Date: Mon, 31 Mar 86 11:14 EST
From: Guy Steele <gls@THINK-AQUINAS.ARPA>
Date: Sat, 29 Mar 86 17:41:34 EST
From: Jonathan A Rees <JAR@MC.LCS.MIT.EDU>
... But in order to allow (BEGIN) to work,
we have to add an exception to the description "BEGIN evaluates the
forms sequentially, and returns the value of the last form" - you have
to say "...except that if there are no forms, the value is unspecified".
I have written interpreters and compilers that deal with (BEGIN) and
they always have an extra conditional in them to be able to deal with
that as a special case. ...
The problem is with the form of the English; it blithely assumes that
there is a last form. This is actually a fencepost error; we should
focus on the spaces between the forms, and not the forms themselves.
After the word BEGIN there is an <unspecified>, and after each subform
the value of that form appears. BEGIN forms a sequence r of the
<unspecified> value and the values of all the forms, and then returns
(reduce #'(lambda (x y) y) r). Clear?
I second GLS's motion to make (BEGIN) and (LAMBDA ()) legal. The problem is
no worse than explaining why (AND) and (OR) are valid.
This same issue has come up in a number of Lisp dialects I've worked with.
I've never had a need for (BEGIN), (LAMBDA ()), etc. in a situation where
I cared about the value, so I'd be quite happy to leave the value undefined
as long as side-effects happen correctly. The situation where it comes up
a lot is in program-writing programs. I end up writing:
`(LAMBDA () ,@(IF (NOT THE-FORMS) '(NIL) THE-FORMS))
when I wish I could write:
`(LAMBDA () ,@THE-FORMS)
- References:
- Scheme BNF
- From: Guy Steele <gls@THINK-AQUINAS.ARPA>