Macros 如何使用宏在球拍中实现定义类型和类型大小写?

Macros 如何使用宏在球拍中实现定义类型和类型大小写?,macros,racket,Macros,Racket,定义类型和类型案例在plai方案中提供,但由于某些原因,它们在类型化/框架中不存在。我想用宏在racket中实现这些构造 我想创建一个宏“def user type”,下面是我想使用的语法 (def-user-type Shape [Rectangle ((l Number) (b Number))] [Circle ((r radius))] [Blah (())]) 它应该大致表现如下 (define-type Shape

定义类型和类型案例在plai方案中提供,但由于某些原因,它们在类型化/框架中不存在。我想用宏在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] ...))
     ...)]))
请引导我。
谢谢

你似乎问了不止一个问题

首先,键入的Racket有一个
定义类型
,但它可能与
#lang plai
中的版本略有不同。您可以看到plai的
define type
type case
的实现

其次,宏有几个问题

1)
语法规则
子句的右侧将
定义类型
的结果作为一个函数应用,这将不起作用。尝试使用
begin
组合表达式

2) 您使用的
def用户类型
宏不符合定义。该定义需要零对或多对
(字段名称类型)
,但在
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      ()])
下面是一个使用
矩形
作为
形状的示例:

> ((λ: ([x : Shape]) x) (Rectangle 1 2))
- : Shape
#<Rectangle>
>((λ:([x:Shape])x)(矩形12))
-:形状
#