我正在使用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-case
,datum->syntax
和with-syntax
感到满意。但是我无法想象人们如何基于诸如(directory-list "~/")
之类的'runtime-y'的结果来创建标识符-甚至可能吗?
(顺便说一句,这是用于现场编码的音乐应用程序,因此无需评论这对于可靠的软件来说是个坏主意-它是针对非常特定的交互式环境的。)
答案 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.
|#