From 307240383a9aa4e9bdd130d109806eb481f53785 Mon Sep 17 00:00:00 2001 From: Linus Date: Sun, 23 May 2021 22:10:23 +0200 Subject: [PATCH] Changed semantics of pure loop form Now an empty clause list means execute body once. any kind of clause means: loop. regardless of for or no for clause. --- goof-impl.scm | 50 ++++++++++++++++++++++++-------------------------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/goof-impl.scm b/goof-impl.scm index 5813ab5..b0f730f 100644 --- a/goof-impl.scm +++ b/goof-impl.scm @@ -1,6 +1,6 @@ ;; goof-impl.scm - portable parts of goof loop.. ;; -;; Copyright 2020 Linus Björnstam +;; Copyright 2020-2021 Linus Björnstam ;; Copyright 2000-2015 Alex Shinn (original author of chibi-loop) ;; All rights reserved. ;; @@ -62,12 +62,14 @@ ((%loop o name () body ...) (%loop o name ((:for ensure-once (up-from 0 1))) body ...)) ((%loop o (clauses ...) body ...) - (ensure-for-clause #f () (clauses ...) o - loop-name - body ... (loop-name))) - ((%loop o name (clauses ...) . body) - (ensure-for-clause #f () (clauses ...) o name - . body)))) + (cl o outer-loop + (()) (()) (()) (()) (()) () ((() ())) (()) + (clauses ...) body ... (outer-loop))) + ((%loop o name clauses . body) + (cl o name + (()) (()) (()) (()) (()) () ((() ())) (()) + clauses . body)))) + ;; This ensures that the first subloop has at least ONE for clause. If none is found ;; we add a dummy one! @@ -437,39 +439,35 @@ (us-next ...) . body))))))))) -(define-syntax forify - (syntax-rules (%acc) - ((_ orig name () ((%acc . acc-rest) . argsrest) . body) - (forify* orig name () ((:for ensure-once (up-from 0 1)) (%acc . acc-rest) . argsrest) . body)) - ((_ . rest) - (forify* . rest)))) -(define-syntax forify* +(define-syntax forify (syntax-rules (:for :acc :when :unless :break :final :subloop :bind :do %acc) - ((_ o n done-clauses () . body) - (%loop o n done-clauses . body)) + ((_ o n done-clauses () body ...) + (ensure-for-clause #f () done-clauses o + n + body ...)) ((_ o n (s ...) ((:for c-rest ...) clauses ...) . body) - (forify* o n (s ... (:for c-rest ...)) (clauses ...) . body)) + (forify o n (s ... (:for c-rest ...)) (clauses ...) . body)) ((_ o n (s ...) ((:when expr) clauses ...) . body) - (forify* o n (s ... (:when expr)) (clauses ...) . body)) + (forify o n (s ... (:when expr)) (clauses ...) . body)) ((_ o n (s ...) ((:unless expr) clauses ...) . body) - (forify* o n (s ... (:unless expr)) (clauses ...) . body)) + (forify o n (s ... (:unless expr)) (clauses ...) . body)) ((_ o n (s ...) ((:break expr) clauses ...) . body) - (forify* o n (s ... (:break expr)) (clauses ...) . body)) + (forify o n (s ... (:break expr)) (clauses ...) . body)) ((_ o n (s ...) ((:final expr) clauses ...) . body) - (forify* o n (s ... (:final expr)) (clauses ...) . body)) + (forify o n (s ... (:final expr)) (clauses ...) . body)) ((_ o n (s ...) ((:do expr ...) clauses ...) . body) - (forify* o n (s ... (:do expr ...)) (clauses ...) . body)) + (forify o n (s ... (:do expr ...)) (clauses ...) . body)) ((_ o n (s ...) (:subloop clauses ...) . body) - (forify* o n (s ... :subloop) (clauses ...) . body)) + (forify o n (s ... :subloop) (clauses ...) . body)) ((_ o n (s ...) ((:bind pairs ...) clauses ...) . body) - (forify* o n (s ... (:bind pairs ...)) (clauses ...) . body)) + (forify o n (s ... (:bind pairs ...)) (clauses ...) . body)) ((_ o n (s ...) ((%acc c-rest ...) clauses ...) . body) - (forify* o n (s ... (:acc c-rest ...)) (clauses ...) . body)) + (forify o n (s ... (:acc c-rest ...)) (clauses ...) . body)) ((_ o n (s ...) ((:acc c-rest ...) clauses ...) . body) (syntax-error "Accumulating clauses are not allowed in simplified loop forms." o)) ((_ o n (s ...) ((id id* ... (iterator source ...)) clauses ...) . body) - (forify* o n (s ... (:for id id* ... (iterator source ...))) (clauses ...) . body)))) + (forify o n (s ... (:for id id* ... (iterator source ...))) (clauses ...) . body)))) (define-syntax loop/list (syntax-rules ()