From dc6faaf148af72b8186623f9cf24630889309381 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Sat, 13 May 2006 01:13:52 +0100 Subject: [PATCH] infix: Replace multiple-value constructs with a single bind. This lets you do several layers of binding in one swoop, which is quite shiny, really. This covers multiple-value-bind and let (both the single and multiple variable cases, if you're willing to use `values') and multiple-value-setq is unnecessary since values is setf-able. --- infix.lisp | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/infix.lisp b/infix.lisp index 93ec028..5cdd0b9 100644 --- a/infix.lisp +++ b/infix.lisp @@ -34,7 +34,8 @@ #:++ #:-- #:<< #:>> #:if #:then #:else - #:let #:let* #:in)) + #:let #:let* #:in + #:bind)) (defpackage #:infix (:use #:common-lisp #:infix-keywords) @@ -608,18 +609,20 @@ (get-token) (pushval `(loop ,@(strip-progn (parse-infix 0))))) -(defopfunc multiple-value-bind operand - (get-token) - (pushval `(multiple-value-bind - ,(parse-ident-list) - ,(progn (delim '=) (parse-infix)) - ,@(progn (delim 'in) (strip-progn (parse-infix 0)))))) - -(defopfunc multiple-value-setq operand - (get-token) - (pushval `(multiple-value-setq - ,(parse-ident-list) - ,(progn (delim '=) (parse-infix 0))))) +(defopfunc bind operand + (labels ((loop () + (let ((ids (parse-ident-list)) + (valform (progn (delim '=) (parse-infix 0))) + (body (if (delim '|,| nil) + (loop) + (progn + (delim 'in) + (strip-progn (parse-infix 0)))))) + (list (if (and ids (null (cdr ids))) + `(let ((,(car ids) ,valform)) ,@body) + `(multiple-value-bind ,ids ,valform ,@body)))))) + (get-token) + (pushval (car (loop))))) ;;;-------------------------------------------------------------------------- ;;; Parsing function bodies and lambda lists. @@ -799,8 +802,14 @@ (labels ((foo (x) (+ x 1)) (bar (x) (- x 1))) (foo (bar y)))) ("defun foo (x) x - 6" . (defun foo (x) (- x 6))) - ("multiple-value-bind x, y, z = values(4, 6, 8) in x + y + z" . - (multiple-value-bind (x y z) (values 4 6 8) (+ x y z))))) + ("bind x = 3 in x - 2" . (let ((x 3)) (- x 2))) + ("bind x, y = values(1, 2), + z = 3, + docs, decls, body = parse-body(body) in complicated" . + (multiple-value-bind (x y) (values 1 2) + (let ((z 3)) + (multiple-value-bind (docs decls body) (parse-body body) + complicated)))))) ;;;-------------------------------------------------------------------------- ;;; Debugging guff. -- 2.11.0