gpt4 book ai didi

oop - 方案 : is OOP possible in Scheme? 中的方法和属性

转载 作者:行者123 更新时间:2023-12-04 22:16:52 24 4
gpt4 key购买 nike

我将用一个简单的例子来说明我的问题。在 Java、C 或任何其他 OOP 语言中,我可以通过类似于以下的方式创建 pie 类:

class Apple{
public String flavor;
public int pieces;
private int tastiness;
public goodness(){
return tastiness*pieces;
}
}

使用 Scheme 做到这一点的最佳方法是什么?我想我可以做这样的事情:
(define make-pie
(lambda (flavor pieces tastiness)
(list flavor pieces tastiness)))

(define pie-goodness
(lambda (pie)
(* (list-ref pie 1) (list-ref pie 2))))

(pie-goodness (make-pie 'cherry 2 5))

;output: 10

...其中樱桃是味道,2 是碎片,5 是味道。然而,没有类型安全性或可见性,一切都被推到了一个未标记的列表中。我该如何改进?

旁注:make-pie 过程需要 3 个参数。如果我想让它们中的一些成为可选的(就像我可以在像 Java 或 C 这样的花括号语言中那样),将参数作为列表(即将参数视为列表)是一种好习惯吗? - 不需要一个列表参数)并以这种方式处理它们?

更新:

我收到了几个答案,其中包含指向各种扩展/库的链接,可以满足我对 OOP 方案的渴望。这很有帮助,所以谢谢你。

但是,尽管我可能没有很好地传达它,但我也想知道在没有此类类或库的情况下实现上面的 pie 对象的最佳方法是什么,以便我可以更好地了解方案最佳实践。

最佳答案

从某种意义上说, closures and objects are equivalent ,所以这当然是可能的。有 a heaping helping of different OO systems for Scheme - 一个更好的问题可能是使用哪个!

另一方面,如果这是一个教育练习,您甚至可以使用闭包对象等效性来推出自己的练习。 (请原谅任何错误,我的计划相当生疏。)

(define (make-pie flavor pieces tastiness)
(lambda (selector)
(cond ((eqv? selector 'flavor) flavor)
((eqv? selector 'pieces) pieces)
((eqv? selector 'tastiness) tastiness)
((eqv? selector 'goodness) (* pieces tastiness))
(else '()))))

这是 pie 对象的简单构造函数。参数变量 flavorpiecestastiness 被 lambda 表达式关闭,成为对象的字段,并且第一个(这里为了简单起见,仅)参数是方法选择器。

完成后,您可以实例化并查看一些内容:
> (define pie1 (make-pie "rhubarb" 8 4))
> (define pie2 (make-pie "pumpkin" 6 7))
> (pie1 'flavor)
"rhubarb"
> (pie1 'goodness)
32
> (pie2 'flavor)
"pumpkin"

关于oop - 方案 : is OOP possible in Scheme? 中的方法和属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2954642/

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