From db56b1cc0ab8d62d0ba7c49ee1bc3fd6f3c0ea1d Mon Sep 17 00:00:00 2001 From: Timothy Sample Date: Tue, 16 Oct 2018 15:26:40 -0400 Subject: [PATCH] Add for-loop semantics * geesh/shell.scm (sh:for): New public function. * .dir-locals.el: Indent it nicely. --- .dir-locals.el | 1 + geesh/shell.scm | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/.dir-locals.el b/.dir-locals.el index 10deffe..c5c6695 100644 --- a/.dir-locals.el +++ b/.dir-locals.el @@ -9,6 +9,7 @@ (eval . (put ' 'scheme-indent-function 1)) (eval . (put 'call-with-backquoted-input-port 'scheme-indent-function 1)) (eval . (put 'make-script 'scheme-indent-function 1)) + (eval . (put 'sh:for 'scheme-indent-function 2)) (eval . (put 'sh:subshell 'scheme-indent-function 1)) (eval . (put 'sh:substitute-command 'scheme-indent-function 1)) (eval . (put 'sh:with-redirects 'scheme-indent-function 2))))) diff --git a/geesh/shell.scm b/geesh/shell.scm index 10e6f84..b42eb78 100644 --- a/geesh/shell.scm +++ b/geesh/shell.scm @@ -8,6 +8,7 @@ #:export (sh:and sh:exec-let sh:exec + sh:for sh:not sh:or sh:pipeline @@ -294,3 +295,16 @@ run @var{thunk2}." (if (string=? (var-ref* env "?") "0") (set-var! env "?" "1") (set-var! env "?" "0"))) + + +;;; Loops. + +(define (sh:for env bindings thunk) + "Run @var{thunk} for each binding in @var{bindings}. The value of +@var{bindings} have the form @code{(@var{name} (@var{value} ...))}." + (set-var! env "?" "0") + (match-let (((name (values ...)) bindings)) + (for-each (lambda (value) + (set-var! env name value) + (thunk)) + values)))