Схема: чтение файлов во время расширения макроса - PullRequest
1 голос
/ 05 июня 2019

Я использую схему Chez, и я хотел бы представить некоторые привязки верхнего уровня, основанные на содержимом каталога.Использование этого гипотетического макроса может выглядеть следующим образом:

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

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

Я освоился с syntax-case, datum->syntax и with-syntax, как описано в примерах Scheme book ,Но я не могу представить, как можно создать идентификаторы на основе результата чего-то «runtime-y», например (directory-list "~/") - возможно ли это?

(Кстати, это для живого кодированиямузыкальное приложение, поэтому нет необходимости комментировать, что это плохая идея для надежного программного обеспечения - для очень специфического интерактивного контекста.)

1 Ответ

1 голос
/ 05 июня 2019

Вы можете использовать что-то вроде этого макроса:

#!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.
|#
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...