> So what we actually need is a procedure of
> two arguments: `(ellipsis? e ctx)' returns `#t' if the identifier `e'
> is the current ellipsis in the lexical environment of the identifier
> `ctx'.
Hmm. I don't actually see a need for the second argument, do you? I
can't think of a case where I'd want to 'e' to be different from 'ctx'.
Let's assume we are writing a macro that reimplements syntax (or some variation thereof) and which has to check whether identifiers are ellipses. For example, the following could be given:
(with-ellipsis e
(my-syntax a e)
Now, this could be a result of a macro expansion and e could carry different marks than with-syntax or my-syntax. This is why I have been thinking that one also needs the lexical context of my-syntax and not only the context of e.
The issue I raised has to do with the fact that syntax-objects do not
contain their lexical environments. The 'wrap' of a syntax-object
essentially only contains a set of deferred substitutions to be applied
to the identifiers within the syntax object, if they end up outside of a
quoted datum in the expanded code. The wrap is primarily an efficiency
hack, but also enables the implementation of 'datum->syntax'.
If we eliminated the efficiency hack, and also 'datum->syntax', we could
implement identifiers more simply as a record containing two symbols:
the original symbol, and the symbol after all substitutions have been
applied. Identifiers found within quoted datums would be interpreted as
their original symbols, and identifiers found anywhere else would be
interpreted as the symbols with the substitutions applied.
Thanks for the explanation. I have been toying with my own implementation of the syntax-case system. In my implementation the (shared) lexical environments are part of the wraps (so the identifiers are in some way self-contained).
Anyway, as I wrote above, the good news is that we can get 'r' from the
dynamic environment.
Will ellipsis? also work outside of macros? Say, what would be the result of the following (run-time) code?
(with-syntax e
(ellipsis? #'e)
I have a draft patch to add a unary predicate to (system syntax), but
I'd like to work on it a bit more before posting it.
That's great news! Thanks!
Best,
Marc
P.S.: By the way, the module (system syntax) and in particular the procedure syntax-local-binding has already helped me a lot because I needed to attach extra information to symbols and Guile doesn't (yet) support Chez's define-property (well, this would be another feature request).