From f753bfdffbd7ce0975b97ad44098b857f25c39a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Manuel=20Tom=C3=A1s?= Date: Thu, 15 Jan 2026 01:55:29 -0300 Subject: Improve usability --- base.lisp | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) (limited to 'base.lisp') 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.")))))) -- cgit v1.2.3