peg: use quasisyntax instead of safe-bind
authorNoah Lavine <nlavine@haverford.edu>
Sat, 29 Jan 2011 18:30:48 +0000 (13:30 -0500)
committerAndy Wingo <wingo@pobox.com>
Wed, 16 Jan 2013 09:11:27 +0000 (10:11 +0100)
* module/ice-9/peg.scm (syntax-for-non-cache-case): Use quasisyntax
  instead of safe-bind.

module/ice-9/peg.scm

index e767f2a..20f9edc 100644 (file)
 (define *cache-size* 512)
 
 (define (syntax-for-non-cache-case for-syntax matchf accumsym symsym)
-  (datum->syntax for-syntax (safe-bind
-   (str strlen at res body)
-   `(lambda (,str ,strlen ,at)
-      (let ((,res (,matchf ,str ,strlen ,at)))
+  (let ((m-syn (datum->syntax for-syntax matchf))
+        (a-syn (datum->syntax for-syntax accumsym))
+        (s-syn (datum->syntax for-syntax symsym))
+        (str-syn (syntax str))
+        (strlen-syn (syntax strlen))
+        (at-syn (syntax at))
+        (res-syn (syntax res))
+        (body-syn (syntax body)))        
+   #`(lambda (#,str-syn #,strlen-syn #,at-syn)
+      (let ((#,res-syn (#,m-syn #,str-syn #,strlen-syn #,at-syn)))
         ;; Try to match the nonterminal.
-        (if ,res
+        (if #,res-syn
             ;; If we matched, do some post-processing to figure out
             ;; what data to propagate upward.
-            (let ((,at (car ,res))
-                  (,body (cadr ,res)))
-              ,(cond
-                ((eq? accumsym 'name)
-                 `(list ,at ',symsym))
-                ((eq? accumsym 'all)
-                 `(list (car ,res)
-                        (cond
-                         ((not (list? ,body))
-                          (list ',symsym ,body))
-                         ((null? ,body) ',symsym)
-                         ((symbol? (car ,body))
-                          (list ',symsym ,body))
-                         (#t (cons ',symsym ,body)))))
-                ((eq? accumsym 'none) `(list (car ,res) '()))
-                (#t (begin res))))
+            (let ((#,at-syn (car #,res-syn))
+                  (#,body-syn (cadr #,res-syn)))
+              #,(cond
+                 ((eq? accumsym 'name)
+                  #`(list #,at-syn '#,s-syn))
+                 ((eq? accumsym 'all)
+                  #`(list (car #,res-syn)
+                          (cond
+                           ((not (list? #,body-syn))
+                            (list '#,s-syn #,body-syn))
+                           ((null? #,body-syn) '#,s-syn)
+                           ((symbol? (car #,body-syn))
+                            (list '#,s-syn #,body-syn))
+                           (#t (cons '#,s-syn #,body-syn)))))
+                 ((eq? accumsym 'none) #`(list (car #,res-syn) '()))
+                 (#t #`(begin #,res-syn))))
             ;; If we didn't match, just return false.
-            #f))))))
+            #f)))))
 
 ;; Defines a new nonterminal symbol accumulating with ACCUM.
 (define-syntax define-nonterm