我喜欢使用自己的数据类型构建一个REPL,但我不喜欢一遍又一遍地编写所有相同的模式函数。
所以这是一个困扰我的坚果。
我有自己的一组原始数据类型(define primitives '("mytrue" "myfalse" "mynumber" ...))
我还有(define primitiveTesters (list "mytrue?" "myfalse?" "mynumber?" ... )
现在的问题是,我只是想应用(map)或宏来获取数据类型?程序,基本上只是检查记录(mynumber . ( . ))
的车是否存在。
最后类似于(mynumber? (car (mynumber.(1.))) => #t
的类似内容。但为此,我需要(define mynumber? (lambda (...)(...))
我的define-batching宏看起来像这样,但我没有运气注入<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))
答案 0 :(得分:2)
如果我理解正确的问题,你需要一个宏 定义自己的类型检查器?
这是一种方法:
(define-syntax define-checker
(syntax-rules ()
[(define-checker name tag)
(define (name object)
(and (list? object)
(not (null? object))
(eq? (car object) 'tag)))]))
(define-checker my-car? car)
(my-car? '(car audi black)) ; evaluates to #t
(my-car? '(truck ford pink)) ; evaluates to #f
附录:
如果你写
(define checker '(audi? volkswagen? mercedes?))
(define datatype '(audi volkswagen mercedes))
这些值将在运行时可用。 因此,您需要采用不同的方法。
你可以写一下:
(define-checker+datatype (audi? audi) (volkswagen? volkswagen?))
以下是代码:
(define-syntax define-checker
(syntax-rules ()
[(define-checker name tag)
(define (name object)
(and (list? object)
(not (null? object))
(eq? (car object) 'tag)))]))
(define-syntax define-checkers+datatype
(syntax-rules ()
[(define-checkers+datatype (name tag) ...)
(begin
(define-checker name tag)
...)]))
(define-checkers+datatype (audi? audi) (wv? wv))
(audi? '(audi black))
答案 1 :(得分:0)
define-syntax
是卫生的,这意味着它不能影响父环境,这意味着它无法在其中定义符号。
您可以尝试使用er-,ir-宏变换器,它允许您显式重命名符号。