【发布时间】:2012-05-23 23:07:27
【问题描述】:
我喜欢用我自己的数据类型构建一个 REPL,但我不喜欢一遍又一遍地编写所有相同的模式函数。
所以这是一个疯子,这让我很困扰。
我有自己的一组原始数据类型(define primitives '("mytrue" "myfalse" "mynumber" ...))
我还有(define primitiveTesters (list "mytrue?" "myfalse?" "mynumber?" ... )
现在的问题是,我只想应用(映射)或宏来获取数据类型?程序,它基本上只是检查记录的汽车 (mynumber . ( . )) 是否存在。
最后类似于(mynumber? (car (mynumber.(1.))) => #t。但为此我需要(define mynumber? (lambda (...)(...))
我的定义批处理宏看起来像这样,但我只是没有运气注入<variable>。
(define-syntax define-batching
(syntax-rules ()
((_ value expr)(define value expr))
((_ value) value)
((_ value1 value2 ...) (begin (define value1 expr) (define-batching test2...)))
))
那么我是不是走到了死胡同?
我在 Emacs Lisp 中看到过类似的东西。
我到底要找的是:
(define checker '(audi? volkswagen? mercedes?))
(define datatype '(audi volkswagen mercedes))
(map define-checker checker datatype )
or
(define-checker (car checker) (car datatype))
【问题讨论】:
-
关于 (map define-checker checker datatype ) 你不能在列表上映射宏。在 (define-checker (car checker) (car datatype)) 中,假设 define-checker 是一个宏,扩展发生在 compile-time 那里,因为 checker 还没有值。这发生在运行时。如果您需要在编译时获得列表值(与语法对象相反,那么您需要查看更高级的宏系统。但请参阅下面我的答案的附录。
标签: macros scheme read-eval-print-loop r5rs