From d48ed19e43e8c01ed6ba6b3ea25eebdc646555d7 Mon Sep 17 00:00:00 2001 From: Linus Date: Thu, 28 Jan 2021 20:37:05 +0100 Subject: [PATCH] Fix the previous commit. Now also the simple loops are ensured to execute once if no for-clauses are given. Instead of throwing a syntax-error... --- goof-impl.scm | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/goof-impl.scm b/goof-impl.scm index 784d341..2db65cc 100644 --- a/goof-impl.scm +++ b/goof-impl.scm @@ -441,33 +441,39 @@ . body))) (intermediate-loop accvar ... step ...)))))))))) - (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* (syntax-rules (:for :acc :when :unless :break :final :subloop :let :let* %acc) - ((forify o n done-clauses () . body) + ((_ o n done-clauses () . body) (%loop o n done-clauses . 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 ... :when expr) (clauses ...) . body)) + (forify* o n (s ... :when 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 ...) (:subloop clauses ...) . body) - (forify o n (s ... :subloop) (clauses ...) . body)) + (forify* o n (s ... :subloop) (clauses ...) . body)) ((_ o n (s ...) ((:let id id* ... expr) clauses ...) . body) - (forify o n (s ... (:let id id* ... expr)) (clauses ...) . body)) + (forify* o n (s ... (:let id id* ... expr)) (clauses ...) . body)) ((_ o n (s ...) ((:let* id id* ... expr) clauses ...) . body) - (forify o n (s ... (:let* id id* ... expr)) (clauses ...) . body)) + (forify* o n (s ... (:let* id id* ... expr)) (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 ()