Re: Choose-Your-Own-Ellipsis Taylor Campbell 15 Oct 2003 20:30 UTC
Hmm. I just found a problem with this 'choose-your-own-ellipsis' device. In improving Andre van Tonder's monadic CPS macro stuff, I wrote an MSYNTAX-RULES. When this discussion came up, I changed it to work with the 'choose-your-own-ellipsis' thing (with the first option -- optionally specify it before the list of literals --). MSYNTAX-RULES is defined to expand (msyntax-rules ellipsis () ((ignored . pattern) (macro . args)) <real ellipsis, i.e. any number of the clauses>) to (syntax-rules ellipsis () ((ignored (k ellipsis) . pattern) ;; Allow for multiple continuations, for possible branches. (macro (k ellipsis) . pattern))) and expand (msyntax-rules () clause <real ellipsis>) to (msyntax-rules ... () clause <real ellipsis>) But I found this problem: should the user not specify the ellipsis, and let it default to ..., how will MSYNTAX-RULES deal with it? I can't have one of the clauses in the macro be ((_ ?literals ((?ignored . ?pattern) (?macro . ?args)) :::) ;; we specified ::: for the ellipsis of the definition of ;; the MSYNTAX-RULES macro (msyntax-rules ... ?literals ((?ignored . ?pattern) (?macro . ?args)) :::)) because then the ... that might be in ?PATTERN or ?ARGS would be hygienically renamed. I could, of course, use Al* Petrofsky's hack to substitute an identifier in a syntax object(? list? expression? what do you call those things in SYNTAX-RULES? 'Syntax object' is what you call the first-class Scheme values that represent syntactic things in SYNTAX-CASE, but that doesn't seem right for SYNTAX-RULES, where it's not first-class Scheme values that I'm talking about), but that would not let anything else generate MSYNTAX-RULES macros (as with the LOOP-WHILE problem of Al* Petrofsky's LOOP example). Am I missing some macro magic here, is there a problem with choose- your-own-ellipsis, or should the implicit ... stuff be thrown away? The last option would break lots of macros, and it would look rather ugly to me, but I can't think of a better way to solve this. Opinions or comments, anyone?