summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ccwl/ccwl.scm82
1 files changed, 39 insertions, 43 deletions
diff --git a/ccwl/ccwl.scm b/ccwl/ccwl.scm
index 9b5132f..d251409 100644
--- a/ccwl/ccwl.scm
+++ b/ccwl/ccwl.scm
@@ -351,49 +351,45 @@ RUN-ARGS. If such an input is not present in RUN-ARGS, return #f."
   "Return a list of run arguments specified in @var{run}
 syntax. @var{defined-input-identifiers} is the list of input
 identifiers defined in the commands."
-  (let ((ensure-input-is-defined
-         ;; Ensure that specified input is defined in #:inputs of
-         ;; command definition.
-         (lambda (input)
-           (unless (memq (syntax->datum input)
-                         defined-input-identifiers)
-             (raise-exception
-              (condition (ccwl-violation input)
-                         (formatted-message "Undefined input ~a"
-                                            (syntax->datum input))))))))
-    (append-map (lambda (x)
-                  (syntax-case x ()
-                    ;; Replace input symbol with quoted symbol.
-                    (input (identifier? #'input)
-                           (begin
-                             (ensure-input-is-defined #'input)
-                             (list #''input)))
-                    ;; Leave string as is.
-                    (string-arg (string? (syntax->datum #'string-arg))
-                                (list #'string-arg))
-                    ;; Replace prefixed input symbol with quoted symbol.
-                    ((prefix input) (and (string? (syntax->datum #'prefix))
-                                         (identifier? #'input))
-                     (begin
-                       (ensure-input-is-defined #'input)
-                       (list #''input)))
-                    ;; Flatten prefixed string arguments. They have no
-                    ;; special meaning.
-                    ((prefix string-arg) (and (string? (syntax->datum #'prefix))
-                                              (string? (syntax->datum #'string-arg)))
-                     (list #'prefix #'string-arg))
-                    ;; Prefixes that are not strings
-                    ((prefix _)
-                     (raise-exception
-                      (condition (ccwl-violation #'prefix)
-                                 (formatted-message "Invalid prefix ~a. Prefixes must be strings."
-                                                    (syntax->datum #'prefix)))))
-                    (_
-                     (raise-exception
-                      (condition (ccwl-violation x)
-                                 (formatted-message "Invalid command element ~a. Command elements must either be input identifiers or literal strings."
-                                                    (syntax->datum x)))))))
-                run)))
+  (define (syntax->run-arg x)
+    (syntax-case x ()
+      ;; Replace input symbol with quoted symbol.
+      (input (identifier? #'input)
+             ;; Ensure that specified input is defined in #:inputs of
+             ;; command definition.
+             (begin
+               (unless (memq (syntax->datum #'input)
+                             defined-input-identifiers)
+                 (raise-exception
+                  (condition (ccwl-violation #'input)
+                             (formatted-message "Undefined input ~a"
+                                                (syntax->datum #'input)))))
+               (list #''input)))
+      ;; Leave string as is.
+      (string-arg (string? (syntax->datum #'string-arg))
+                  (list #'string-arg))
+      ;; Flatten prefixed string arguments. They have no
+      ;; special meaning.
+      ((prefix string-arg) (and (string? (syntax->datum #'prefix))
+                                (string? (syntax->datum #'string-arg)))
+       (list #'prefix #'string-arg))
+      ;; Recurse on prefixed inputs.
+      ((prefix input) (string? (syntax->datum #'prefix))
+       (syntax->run-arg #'input))
+      ;; Prefixes that are not strings
+      ((prefix _)
+       (raise-exception
+        (condition (ccwl-violation #'prefix)
+                   (formatted-message "Invalid prefix ~a. Prefixes must be strings."
+                                      (syntax->datum #'prefix)))))
+      (_
+       (raise-exception
+        (condition (ccwl-violation x)
+                   (formatted-message "Invalid command element ~a. Command elements must either be input identifiers or literal strings."
+                                      (syntax->datum x)))))))
+
+  (append-map syntax->run-arg
+              run))
 
 ;; TODO: Add fine-grained syntax checking.
 (define-syntax command