diff options
author | Hugo Hörnquist <hugo@lysator.liu.se> | 2023-09-10 17:07:56 +0200 |
---|---|---|
committer | Hugo Hörnquist <hugo@lysator.liu.se> | 2023-09-11 18:00:15 +0200 |
commit | 5672d44892c4010cdfbdc46f5fb29259fa51e076 (patch) | |
tree | 3afc2ee6dac2d17746014f7f73a704d793336bc1 /module | |
parent | Add documentation and tests for xdg basedir. (diff) | |
download | calp-5672d44892c4010cdfbdc46f5fb29259fa51e076.tar.gz calp-5672d44892c4010cdfbdc46f5fb29259fa51e076.tar.xz |
Add `break` and `continue` support in `for`.
Diffstat (limited to '')
-rw-r--r-- | module/hnh/util.scm | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/module/hnh/util.scm b/module/hnh/util.scm index 6fe9b371..a6581158 100644 --- a/module/hnh/util.scm +++ b/module/hnh/util.scm @@ -5,6 +5,7 @@ :use-module ((sxml fold) :select (fold-values)) :use-module ((srfi srfi-9 gnu) :select (set-fields)) :use-module ((ice-9 copy-tree) :select (copy-tree)) + :use-module ((ice-9 control) :select (call/ec)) :re-export (fold-values) :export (aif awhen @@ -114,14 +115,37 @@ -(define-syntax for - (syntax-rules (in) +(define-syntax (for stx) + (syntax-case stx (in) ((for (<var> <vars> ...) in <collection> b1 body ...) - (map ((@ (ice-9 match) match-lambda) [(<var> <vars> ...) b1 body ...]) - <collection>)) + (with-syntax ((break (datum->syntax stx 'break)) + (continue (datum->syntax stx 'continue))) + #'(call/ec + (lambda (break) + (map ((@ (ice-9 match) match-lambda) + [(<var> <vars> ...) + (call/ec + (lambda (raw-continue) + (let ((continue + (case-lambda + (() #f) + (args (apply raw-continue args))))) + b1 body ...)))]) + <collection>))))) + ((for <var> in <collection> b1 body ...) - (map (lambda (<var>) b1 body ...) - <collection>)))) + (with-syntax ((break (datum->syntax stx 'break)) + (continue (datum->syntax stx 'continue))) + #'(call/ec + (lambda (break) + (map (lambda (<var>) + (call/ec (lambda (raw-continue) + (let ((continue + (case-lambda + (() #f) + (args (apply raw-continue args))))) + b1 body ...)))) + <collection>))))))) |