1

私は自分のデータ型でREPLを作成するのが好きですが、同じパターン関数を何度も何度も書くのは好きではありません。

だから、これは私を悩ませているナッツです。

独自のプリミティブデータ型のセットを取得しました(define primitives '("mytrue" "myfalse" "mynumber" ...))

また、私は持っています(define primitiveTesters (list "mytrue?" "myfalse?" "mynumber?" ... )

問題は、データ型を取得するために(マップ)またはマクロを適用したいだけですか?基本的に、記録された車が存在するかどうかをチェックするだけの手順(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...)))
))

それで、私は計画の行き止まりに達しましたか?

私はEmacsLispで似たようなものを見たと思います。

私が最終的に探しているのは:

 (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

質問を正しく理解した場合、独自のタイプチェッカーを定義するためのマクロが必要ですか?

これを行う1つの方法は次のとおりです。

(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 に答える