我喜歡用自己的數據類型構建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))
對於(地圖定義檢查器檢查數據類型),你不能在一個列表映射宏。在(define-checker(car checker)(car datatype))中假設define-checker是一個宏,擴展發生在* compile-time *之前,checker還沒有值。這發生在*運行時*。如果你需要在編譯時使用列表值(而不是語法對象,那麼你需要查看更高級的宏系統,但請參閱下面我的答案的附錄。 – soegaard