diff options
Diffstat (limited to 'base.lisp')
| -rw-r--r-- | base.lisp | 31 |
1 files changed, 19 insertions, 12 deletions
@@ -15,6 +15,13 @@ (deftype parser () `(function (cursor cursor) result)) +(defmacro lazy (parser &rest args) + (let ((start (gensym)) + (input (gensym))) + `(the parser + (lambda (,start ,input) + (funcall (,parser ,@args) ,start ,input))))) + (defun line-and-column (str index) (let ((line 1) (column 1)) (dotimes (i index) @@ -56,22 +63,22 @@ (if (null bindings) `(new (progn ,@body)) (let ((var (first (car bindings))) - (parser (second (car bindings))) - (unused (gensym))) + (parser (second (car bindings)))) (cond ((symbolp var) (if (string= (symbol-name var) "_") `(bind ,parser - (lambda (&rest ,unused) - (declare (ignore ,unused)) - (comp ,(cdr bindings) ,@body))) + (the (function (result) parser) + (lambda (,var) + (declare (ignore ,var)) + (comp ,(cdr bindings) ,@body)))) `(bind ,parser - (lambda (,var &rest ,unused) - (let ((,var (parsing-tree ,var))) - (declare (ignore ,unused)) - (comp ,(cdr bindings) ,@body)))))) + (the (function (result) parser) + (lambda (,var) + (let ((,var (parsing-tree ,var))) + (comp ,(cdr bindings) ,@body))))))) ((and (listp var) (= (length var) 1) (symbolp (car var))) `(bind ,parser - (lambda (,(first var) &rest ,unused) - (declare (ignore ,unused)) - (comp ,(cdr bindings) ,@body)))) + (the (function (result) parser) + (lambda (,(first var)) + (comp ,(cdr bindings) ,@body))))) (t (error "Binding must be either a symbol or a list of one symbol.")))))) |
