32

我正在尝试在 IO 第 2 天完成《七日之七语言》一书中的第二个练习。在其中,您问:“如果分母为零,您将如何更改 / 以返回 0?” 我已经确定我可以使用以下方法向 Number 添加方法:

Number new_div := method(i, if(i != 0, self / i, 0))

我不确定如何替换运算符表中的“/”。我试过了:

Number / := Number new_div
Number / := self new_div

但是我得到了一个例外,因为它试图调用“/”。如何获取 Number / 的句柄,以便我可以存储对旧方法的引用,然后为自己的目的重新定义它?我对这一切都错了吗?

4

3 回答 3

40

对于 Eric Hogue(见问题评论):

origDiv := Number getSlot("/")

10 origDiv(5) println   # => 2
10 origDiv(0) println   # => inf

Number / := method (i, 
    if (i != 0, self origDiv(i), 0)
)

(10 / 5) println        # => 2
(10 / 0) println        # => 0
于 2010-11-24T12:09:56.513 回答
4

你想要做的是运行:

Number setSlot("/", Number getSlot("new_div")

例如。

但是,应该注意,如果您使用 的定义,您将有一个无限循环new_div,因为您在其中调用/方法,并且设置/要使用的运算符new_div将导致调用,6 / 2递归,直到您内存不足。

于 2010-11-23T23:45:06.047 回答
4

如果您在重新定义中使用幂运算符,那么您不必保留对旧除法运算符的引用。

Number / := method(i, if(i==0, 0, self*i**(-1)))
于 2011-04-08T01:43:33.097 回答