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.
This commit is contained in:
Linus 2021-05-23 22:10:23 +02:00
parent e057a6b8fe
commit 307240383a

View file

@ -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 ()