Initial comments & questions campbell@xxxxxx 18 Mar 2004 23:20 UTC
First, thanks for designing a comprehensive interface to this -- you beat me to it before I completed syntax-lib... --. Second, I've got a lot of comments and questions. These are just my initial thoughts on the SRFI. I'll likely have many more later, but I thought these were plenty for now... Some of them are directly related to SRFI 46 -- which, mumble, I ought to finish up at some point --, or have come up on the SRFI 46 mailing list: - Having a new top-level definition form, DEFINE-SYNTAX-COMPUTATION, is cumbersome and shouldn't be necessary; DEFINE-SYNTAX should be universal for introducing syntax transformers, and the same should go for LET-SYNTAX and LETREC-SYNTAX. Yes, it's true, you can't implement COMPUTATION-RULES to be a valid transformer keyword like SYNTAX-RULES in straight R5RS, but I think that small price to pay is OK, because, after all, this is a request for implementors to implement what you propose here. - You're going to hit the _exact_ same ellipsis problems that are fixed by SRFI 46. (My plans for SRFI 46 are to use CYOE, by the way.) Why not specify CYOE from the start? - Does COMPUTATION-RULES support tail patterns? Issues regarding the document: - Could you move the reference implementation into a separate file? It's a bit of a bother to have it within the document text; it's pretty big. - More examples, please! For instance, a LETREC implementation that is much cleaner than R5RS's, or Oleg's example of a record definer that 'generates identifiers' (cf. that thread somewhere on c.l.s). - Very little is mentioned about hygiene, which I'm worried about. - Very little is mentioned about shadowing. - I'd like some comments on the topic of efficiency of the system. Technical issues unrelated to SRFI 46: - Is SYNTAX-INVOKE/C really necessary? Couldn't the continuations be regular syntax computations that just ignore their continuation? - Is pattern matching available in SYNTAX-DO's bindings? - Are there provisions for multiple return values? (This would be unnecessary with 'yes' to the previous question.) - If the answer to those last two questions is 'no,' then why? - Couldn't SYNTAX-ERROR be a _lot_ simpler? -- (define-syntax syntax-error (syntax-rules ())) - I fear that the syntactic list-processing routines may turn into a complete reinvention of SRFI 1. This is a much bigger issue that I haven't thought much about yet. More on this later... - Are there any operations on syntactic vectors? - I'm not entirely sure if it's a good idea, but I have a nagging suspicion that macro writers may want a utility for generating debugging messages. It of course can't be implemented in terms of plain SYNTAX-RULES, but it can trivially be defined with other macro systems, e.g.: (define-syntax syntax-debug-message (lambda (stx) (syntax-case stx () ((syntax-debug-message ?k ?message ?irritant ...) (display "Syntax debug: ") (display (syntax-object->datum (syntax ?message))) (newline) (for-each (lambda (irr) (display " ") (write irr) (newline)) (syntax-object->datum (syntax (?irritant ...)))) (syntax (syntax-bind ?k ())))))) (define-syntax syntax-debug-message (transformer ; Explicit renaming (lambda (form rename compare) (destructure ; Scheme48 extension -- whatever (((#f stx-k message . irritants) form)) (display "Syntax debug: ") (display message) (for-each (lambda (irr) (display " ") (write irr)) irritants) `(,(rename 'syntax-bind) ,stx-k ()))))) Some naming quibbles: - COMPUTATION-RULES -- I'd prefer SYNTAX-COMPUTATIONS or something. - SYNTAX-DO -- I don't like this at all. It's not very descriptive and it clashes with the DO syntax in regular Scheme. While it may be a good point that it does nothing more than 'do' a computation, and this is also what Haskell uses, it still isn't descriptive to just say 'do,' and it still has the clash. - I _loathe_ the <- bit of SYNTAX-DO. It's there seemingly _only_ for consistency with Haskell; it serves no useful purpose other than to bother people like me, and that purpose isn't very useful, so it doesn't count. - SYNTAX-EQ? -- why that and not SYNTAX-EQUAL? ? The name EQ? has connotations of that of the Scheme procedure EQ?, which compares for identity, so I'd avoid it for structural comparison. - SYNTAX-FOLDL & SYNTAX-FOLDR: SRFIs 1, 13, and 43 all use FOLD & FOLD-RIGHT; SRFI 44 uses FOLD-LEFT & FOLD-RIGHT. Given these traditions, I'd prefer FOLD & FOLD-RIGHT, or at worst FOLD-LEFT & FOLD-RIGHT. - Why abbreviate 'continuation' everywhere? If you want brevity, how about SYNTAX-CATCH & SYNTAX-THROW instead of the much longer SYNTAX-LET-CURRENT-CONTINUATION and SYNTAX-INVOKE-CONTINUATION? (And SYNTAX-INVOKE/C may not even be necessary, either.) - I don't like the name SYNTAX-LET/CC. It implies that it's letting the current continuation _be_ something, when in fact it's _capturing_ the current continuation.