From 928af4355700271bd16dc99ab702360fcf25c503 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Mon, 8 Apr 2019 11:56:16 +0200 Subject: Add mulit-set! --- module/util.scm | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'module/util.scm') diff --git a/module/util.scm b/module/util.scm index 249e2de2..25be0389 100644 --- a/module/util.scm +++ b/module/util.scm @@ -6,7 +6,7 @@ define-quick-record mod! sort* sort*! find-min) - #:replace (let*) + #:replace (let* set!) ) (define-public upstring->symbol (compose string->symbol string-upcase)) @@ -136,6 +136,21 @@ +;; Allow set to work on multiple values at once, +;; similar to Common Lisp's @var{setf} +;; @example +;; (set! x 10 +;; y 20) +;; @end example +;; Still requires all variables to be defined beforehand. +(define-syntax set! + (syntax-rules () + ((_ field val) + ((@ (guile) set!) field val)) + ((_ field val rest ...) + (begin ((@ (guile) set!) field val) + (set! rest ...))))) + ;; Like set!, but applies a transformer on the already present value. (define-syntax-rule (mod! field transform-proc) (set! field (transform-proc field))) -- cgit v1.2.3