[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

quasiquote syntax



Hello,

I am trying to understand the quasiquote example implementation given in
\"Writing Hygienic Macros in Scheme with Syntax-Case\".

The paper states, \"a much simpler version could be defined by replacing calls to
gen-cons, gen-append, and gen-vector with syntax for calls to cons, append, and
list->vector.\" But I am uncertain as to how to do this. I\'ve appended a version
below, which I have simplified as much as I can. I can\'t seem to get much
further and any help would be greatly appreciated.

Thanks,
David

--
dvanhorn at cs dot uvm dot edu
http://www.cs.uvm.edu/~dvanhorn


-- simple quasiquote --
(define-syntax quasiquote
  (letrec
      ((gen-cons
        (lambda (x y)
          (syntax-case x ()
            [x
             (syntax-case y ()
               [y (syntax (cons x y))])])))
       
       (gen-append
         (lambda (x y)
           (syntax-case x ()
             [x
              (syntax-case y (quote)
                [y (syntax (append x y))])])))
       
        (gen-vector
          (lambda (x)
            (syntax-case x ()
              [x (syntax (list->vector x))])))
        
        (gen
          (lambda (p lev)
            (syntax-case p (unquote unquote-splicing quasi)
              [(unquote p)
               (if (= lev 0)
                   (syntax p)
                   (gen-cons (syntax (quote unquote))
                             (gen (syntax (p)) (- lev 1))))]
              [((unquote-splicing p) . q)
               (if (= lev 0)
                   (gen-append (syntax p) (gen (syntax q) lev))
                   (gen-cons (gen-cons (syntax (quote unquote-splicing))
                                       (gen (syntax p) (- lev 1)))
                             (gen (syntax q) lev)))]
              [(quasi p)
               (gen-cons (syntax (quote quasi))
                         (gen (syntax p) (+ 1 lev)))]
              [(p . q)
               (gen-cons (gen (syntax p) lev) (gen (syntax q) lev))]
              [#(x ...) (gen-vector (gen (syntax (x ...)) lev))]
              [p (syntax (quote p))]))))
      (lambda (x)
        (syntax-case x ()
          [(_ e) (gen (syntax e) 0)]))))