summaryrefslogtreecommitdiff
path: root/base.lisp
diff options
context:
space:
mode:
authorJuan Manuel Tomás <jtomas1815@gmail.com>2026-01-15 01:55:29 -0300
committerJuan Manuel Tomás <jtomas1815@gmail.com>2026-01-15 01:55:29 -0300
commitf753bfdffbd7ce0975b97ad44098b857f25c39a9 (patch)
tree1c6e82febdadc583eb86da2f38625d4f508a47c7 /base.lisp
parent9566e92321a1ed29a7f5903a3ba4ab16de3783b9 (diff)
downloadmonparser-f753bfdffbd7ce0975b97ad44098b857f25c39a9.tar.gz
monparser-f753bfdffbd7ce0975b97ad44098b857f25c39a9.zip
Improve usability
Diffstat (limited to 'base.lisp')
-rw-r--r--base.lisp31
1 files changed, 19 insertions, 12 deletions
diff --git a/base.lisp b/base.lisp
index fe28cd0..0599a3c 100644
--- a/base.lisp
+++ b/base.lisp
@@ -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."))))))