如何在不调用Io的情况下替换现有的运算符?

时间:2010-11-23 23:43:07

标签: operators iolanguage

我正在尝试在七天七语中的第二天完成第二次练习。在你的问题中,“如果分母为零,你会如何改变/返回0?”我已经确定我可以使用以下方法为Number添加方法:

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

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

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

但是当我试图调用“/”时,我得到两个例外。如何处理Number /所以我可以存储对旧方法的引用,然后为自己的目的重新定义它?我是不是错了?

3 个答案:

答案 0 :(得分:39)

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

答案 1 :(得分:4)

您要做的是运行:

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

例如。

然而,应该注意的是,如果你使用new_div的定义,你手上会有一个无限循环,因为你在其中调用/方法,并设置使用/的{​​{1}}运算符会导致调用new_div递归,直到内存不足为止。

答案 2 :(得分:4)

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

Number / := method(i, if(i==0, 0, self*i**(-1)))