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:
parent
e057a6b8fe
commit
307240383a
1 changed files with 24 additions and 26 deletions
|
@ -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 ()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue