Thu Aug 9 20:41:58 CEST 2007
with the new syntax approach, i can use lexical variables like
(let ((xxx (lambda (a b . stack) (cons (+ a b) stack))))
(base: 1 2 xxx))
Which is convenient. However, i ran into at least 2 cases where the
more convenient thing to do is to insert a constant instead of a
function. However, the semantics of a symbol is always a function in
CAT. Except.. when it is quoted!
So what about this
(let ((yyy 123))
(base: 1 'yyy +))
Meaning (base: 1 '123 +) ???
This is very convenient, but looks a bit weird. The reason is of
course that stuff after base: is NOT SCHEME. Quote in the cat syntax
only means: "this is data".
The benefit of this is that it somehow resembles pattern variable
binding as in syntax-rules.
A better explanation is this:
The scheme and cat namespaces are completely separate: scheme has
toplevel and module namespaces, while cat has everything from a
separate hierarchical namespace. The only way they can interact is
through lexical variables: this is the only set of names that is
In cat expressions:
* free identifiers come from the associated name space
* identifiers bound in scheme are
- used as functions when they occur outside of quote
- used as data when they occur inside of quote
This can be implemented by mapping quote -> quasiquote, and unquote a
symbol whenever it is lexical.
It seems to work fine.
Quote for macros is now also fixed.
Another attempt to justify myself:
The quote operator in cat language is NOT the same as the quote
operator in scheme code. More specificly: lexical variables will be
substituted whether they are quoted or not. i.e. both (base: abc) and
(base: 'abc) will be substituted if the variable abc is bound. The
quoting just indicates the atom is not to be interpreted as a
function, but to be loaded on top of the data stack.
The substitution is there to make metaprogramming easier.