方案 - 关于新类型的一般问题

发布于 2024-11-03 05:49:10 字数 123 浏览 0 评论 0原文

我们能否在Scheme中定义新类型,以便Scheme能够识别它们并 强制执行它们的不变量?

换句话说,当我定义圆的ADT(make_circle、get_radious等)时,我可以在Scheme中将它用作新类型吗?

Can we define new types in Scheme such that Scheme will recognize them and
enforce their invariants?

In other words, when I define, for example, ADT for circle (make_circle, get_radious, etc..), I can use it in Scheme as a new type?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

秋千易 2024-11-10 05:49:10

SRFI-9 定义 Define-record-type 宏。大多数方案都有定义记录、定义结构或类似的变体,我认为这是定义记录类型的简化。

然后许多方案都有某种类型的类似 CLOS 的对象系统,例如 tinyclos 或 Chicken 的 < a href="http://wiki.call-cc.org/eggref/4/coops" rel="nofollow">Coops - 两者都实现了多种方法,这非常好。

使用 SRFI-9 的示例:

(define-record-type circle
    (make-circle r)
    circle?
    (r get-radius))

然后在您的 REPL 中:

>> (define c (make-circle 12))
>> c
#<circle>
>> (get-radius c)
12
>> 

SRFI-9 defines the define-record-type macro. Most schemes have a variant of define-record, define-struct or something similar which I believe is a simplification of define-record-type.

And then many schemes have some type of CLOS-like object system, such as tinyclos or Chicken's Coops - both of which implement multimethods, which is quite nice.

Example Using the SRFI-9:

(define-record-type circle
    (make-circle r)
    circle?
    (r get-radius))

Then in your REPL:

>> (define c (make-circle 12))
>> c
#<circle>
>> (get-radius c)
12
>> 
淡淡绿茶香 2024-11-10 05:49:10

球拍具有强大的类型系统。此外,define-struct 在方案中也得到了很好的支持。

Racket has powerfull type system. Also define-struct is well supported among schemes.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文