1

我喜欢用我自己的数据类型构建一个 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))
4

2 回答 2

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))
于 2012-05-24T06:12:48.107 回答
0

define-syntax是卫生的,这意味着它不能影响父环境,这意味着它不能在其中定义符号。您可以尝试使用 er-、ir- 宏转换器,它们允许您显式地重命名符号。

在你的方案文档中谷歌的关键字是“er-macro-transformet”和“ir-macro-transformer”

于 2012-05-24T04:14:26.013 回答