【问题标题】:How do you replace existing operators without invoking them in Io?如何在不调用 Io 的情况下替换现有的运算符?
【发布时间】:2010-11-23 23:43:06
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我正在尝试解决同样的问题。我做“数字/:=方法(...)”。我被 jer 指出的同一个无限循环困住了。我找不到保留 / 的原始实现并调用它的方法。
  • @Eric Hogue:我没有发布我的答案,因为 jer 击败了我!我现在发布它是因为它确实展示了如何保留原始除法并避免递归循环。

标签: operators iolanguage


【解决方案1】:

对于 Eric Hogue(见问题 cmets):

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

【讨论】:

  • 谢谢。这几乎就是我正在做的事情,除了我试图做自我 origDiv i。没有括号。
  • 我希望解决方案涉及操作员表。感谢您的回答。
【解决方案2】:

你想要做的是运行:

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

例如。

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

【讨论】:

  • 这有什么帮助?你仍然会有一个无限循环。
  • 你读过我写的吗?我明确指出了无限循环的可能性。
  • 这里没有“潜力”。您有一个无限循环,除非您走 Johan 的路线并重新实现部门或走 @draegtun 的路线并保存原始实现。而且您缺少右括号。其他答案提供了完整的实现,而您的答案没有。
  • 在我的回答中我没有说任何关于潜力的事情,是吗?您在抱怨我在答案的第一版中明确指出的一些事情。您不必教我有关 Io 的内部结构,我从 2003 年开始就是该语言的核心开发人员。谢谢。
【解决方案3】:

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

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

【讨论】:

  • 假设旧行为是默认行为。其他人可能已经改变了你。做一个好公民,当你想替换它时,总是查看当前的行为。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
相关资源
最近更新 更多