3

define-type と type-case は plai スキームで提供されていますが、何らかの理由で typed/racket には存在しません。マクロを使用して、これらの構造をラケットに実装したいと考えています。

マクロ「def-user-type」を作成したいのですが、使用したい構文は次のとおりです

    (def-user-type Shape
      [Rectangle ((l Number) (b Number))]
      [Circle    ((r radius))]
      [Blah      (())])

そして、大まかに次のように動作する必要があります

    (define-type Shape (U Rectangle Circle Blah))
    (struct: Rectangle ([l : Number] [b Number]))
    (struct: Circle ([r : Number]))
    (struct: Blah ())

これが私がこれまでに達成したことです。これは誤りであり、ラケット コンパイラによって表示されるエラー メッセージも役に立ちません。

#lang typed/racket
(define-syntax define-user-type
  (syntax-rules()
    [(define-user-type type-name
       [sub-type ((field-name type) ...)]
       ...)
     ((define-type type-name (U sub-type ...))
     (struct: sub-type ([field-name : type] ...))
     ...)]))

私を案内してください。ありがとう!

4

1 に答える 1