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..
|
;; 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)
|
;; Copyright 2000-2015 Alex Shinn (original author of chibi-loop)
|
||||||
;; All rights reserved.
|
;; All rights reserved.
|
||||||
;;
|
;;
|
||||||
|
@ -62,12 +62,14 @@
|
||||||
((%loop o name () body ...)
|
((%loop o name () body ...)
|
||||||
(%loop o name ((:for ensure-once (up-from 0 1))) body ...))
|
(%loop o name ((:for ensure-once (up-from 0 1))) body ...))
|
||||||
((%loop o (clauses ...) body ...)
|
((%loop o (clauses ...) body ...)
|
||||||
(ensure-for-clause #f () (clauses ...) o
|
(cl o outer-loop
|
||||||
loop-name
|
(()) (()) (()) (()) (()) () ((() ())) (())
|
||||||
body ... (loop-name)))
|
(clauses ...) body ... (outer-loop)))
|
||||||
((%loop o name (clauses ...) . body)
|
((%loop o name clauses . body)
|
||||||
(ensure-for-clause #f () (clauses ...) o name
|
(cl o name
|
||||||
. body))))
|
(()) (()) (()) (()) (()) () ((() ())) (())
|
||||||
|
clauses . body))))
|
||||||
|
|
||||||
|
|
||||||
;; This ensures that the first subloop has at least ONE for clause. If none is found
|
;; This ensures that the first subloop has at least ONE for clause. If none is found
|
||||||
;; we add a dummy one!
|
;; we add a dummy one!
|
||||||
|
@ -437,39 +439,35 @@
|
||||||
(us-next ...)
|
(us-next ...)
|
||||||
. body)))))))))
|
. 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)
|
(syntax-rules (:for :acc :when :unless :break :final :subloop :bind :do %acc)
|
||||||
((_ o n done-clauses () . body)
|
((_ o n done-clauses () body ...)
|
||||||
(%loop o n done-clauses . body))
|
(ensure-for-clause #f () done-clauses o
|
||||||
|
n
|
||||||
|
body ...))
|
||||||
((_ o n (s ...) ((:for c-rest ...) 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)
|
((_ 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)
|
((_ 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)
|
((_ 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)
|
((_ 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)
|
((_ 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)
|
((_ 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)
|
((_ 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)
|
((_ 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)
|
((_ o n (s ...) ((:acc c-rest ...) clauses ...) . body)
|
||||||
(syntax-error "Accumulating clauses are not allowed in simplified loop forms." o))
|
(syntax-error "Accumulating clauses are not allowed in simplified loop forms." o))
|
||||||
((_ o n (s ...) ((id id* ... (iterator source ...)) clauses ...) . body)
|
((_ 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
|
(define-syntax loop/list
|
||||||
(syntax-rules ()
|
(syntax-rules ()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue