Quasisyntax Andre van Tonder 25 Jun 2006 16:33 UTC

Can quasisyntax be written as a macro in terms of syntax-case?  I suspect so,
but if not, I would urge its inclusion.

With-syntax often forces one to break apart the natural shape of the
output code, and introduce names (such as rest) that would not be necessary
otherwise.

Also, I often find myself writing code fragments like this

   (define (helper bindings body)
     (with-syntax ((bindings bindings)  ; !!
                   (body     body))     ; !!
        (syntax (let bindings body)))

This is bothersome, when quasisyntax instead allows

   (define (helper bindings body)
     (quasisyntax (let #,bindings #, body)))

Also compare

   (define-syntax let-in-order
     (lambda (form)
       (syntax-case form ()
         ((_ ((i e) ...) e0 e1 ...)
          (let f ((ies (syntax ((i e) ...)))
                  (its '()))
            (syntax-case ies ()
              (()            (with-syntax ((its its))
                               (syntax (let its e0 e1 ...))))
              (((i e) . ies) (with-syntax ((rest (f (syntax ies)
                                                    (cons (syntax (i t)) its))))
                               (syntax (let ((t e)) rest))))))))))

with the following, which I find easier to write and read, since now the macro
can follow the structure of the output without the order inversions
required above.

   (define-syntax let-in-order
     (lambda (form)
       (syntax-case form ()
         ((_ ((i e) ...) e0 e1 ...)
          (let f ((ies (syntax ((i e) ...)))
                  (its (syntax ())))
            (syntax-case ies ()
              (()            (quasisyntax (let #,its e0 e1 ...)))
              (((i e) . ies) (quasisyntax
                              (let ((t e))
                                #,(f (syntax ies)
                                     (quasisyntax ((i t) #,@its))))))))))))

Regards
Andre