Hi Taylan,
your points are all good and I kind of get the reasoning behind the current
semantics. I'm not trying to start a big discussion here, it's just a
little detail I noticed and that bothered me.
I don't really care what (lambda ()) evaluates to as long as it's
consistent with the rest of the language. But what rubs me the wrong way is
that
(define x (begin))
(lambda () x)
is not the same as
(lambda () (begin))
because one of the strength of functional programming is referential
transparency. Therefore I would expect the definition of x (which has no
side effects) to be substitutable for x itself. This is apparently not the
case as one (begin) has a different meaning than the other because of its
context.
As another data point, this seems to be fine:
(use-modules (oop goops))
(define-method (foo))
So, GOOPS doesn't mind empty method bodies. However
(define-method (foo) (begin))
fails. Not very consistent either, I'm afraid.
Cheers,
Tobias