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