簡體   English   中英

如何使用宏在Racket中實現define-type和type-case?

[英]How to implement define-type and type-case in Racket using macros?

在plai方案中提供了define-type和type-case,但由於某種原因它們不存在於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 ())

這是我迄今取得的成就。 它是不正確的,並且由racket編譯器給出的錯誤消息也沒有幫助。

#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] ...))
     ...)]))

請指導我。 謝謝!

你好像問了不止一個問題。

首先,Typed Racket有一個define-type但它可能與#lang plai的版本略有不同。 你可以看到普拉伊的的實現define-typetype-case 在這里

其次,你的宏存在一些問題。

1) syntax-rules子句的右側是將define-type的結果應用為函數,這將不起作用。 嘗試使用begin來組合表達式。

2)您對def-user-type宏的使用不遵循定義。 該定義需要零個或多個(field-name type)對,但在Blah你給() ,它不是一對。

3) radius是未定義的類型

以下是宏的一個版本,其中包含建議的更改:

#lang typed/racket

(define-syntax def-user-type
  (syntax-rules ()
    [(_ type-name [sub-type ((field-name type) ...)] ...)
     (begin
       (define-type type-name (U sub-type ...))
       (struct: sub-type ([field-name : type] ...)) ...)]))

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

這是一個使用Rectangle作為Shape的示例:

> ((λ: ([x : Shape]) x) (Rectangle 1 2))
- : Shape
#<Rectangle>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM