gpt4 book ai didi

macros - 如何使用宏在 Racket 中实现 define-type 和 type-case?

转载 作者:行者123 更新时间:2023-12-04 02:49:14 28 4
gpt4 key购买 nike

define-type 和 type-case 在 plai 方案中提供,但由于某些原因它们不存在于 typed/racket 中。我想使用宏在 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 中的版本有点不同。可以看到plai的define-typetype-case的实现here .

其次,您的宏存在一些问题。

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>

关于macros - 如何使用宏在 Racket 中实现 define-type 和 type-case?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18131154/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com