方案:在宏扩展时读取文件

时间:2019-06-05 08:48:17

标签: scheme

我正在使用Chez Scheme,我想基于目录的内容引入一些顶级绑定。该假设宏的用法可能如下所示:

(bind-files f "~/my-dir/")

;; Expanding to:
(begin (define f0 "~/my-dir/a.wav")
       (define f1 "~/my-dir/b.wav"))

我对Scheme book's examples中所述的syntax-casedatum->syntaxwith-syntax感到满意。但是我无法想象人们如何基于诸如(directory-list "~/")之类的'runtime-y'的结果来创建标识符-甚至可能吗?

(顺便说一句,这是用于现场编码的音乐应用程序,因此无需评论这对于可靠的软件来说是个坏主意-它是针对非常特定的交互式环境的。)

1 个答案:

答案 0 :(得分:1)

您可以使用类似此宏的内容:

#!r6rs
(import (rnrs) (chezscheme))

(define-syntax bind-file
  (lambda (x)
    (define (name&file k dir)
      (define (->fn i)
        (string->symbol (string-append "f" (number->string i))))
      (let ((files (directory-list (syntax->datum dir))))
        (datum->syntax k (do ((i 0 (+ i 1)) (files files (cdr files))
                              (r '() (cons (list (->fn i) (car files)) r)))
                             ((null? files) r)))))
    (syntax-case x ()
      ((k dir)
       (string? (syntax->datum #'dir))
       (with-syntax ((((name file) ...) (name&file #'k #'dir)))
         #'(begin (define name file) ...))))))

(bind-file ".")

#|
;; depending on the number of files
f0 ... fn variables are defined.
|#