Как заменить существующие операторы, не вызывая их в Io? - PullRequest
31 голосов
/ 24 ноября 2010

Я пытаюсь выполнить второе упражнение во второй день IO в книге «Семь языков за семь дней».В нем вы спросили: «Как бы вы изменили / вернули 0, если знаменатель равен нулю?» Я решил, что могу добавить метод к Number, используя:

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

Что я не уверенкак заменить символ «/» в таблице операторов.Я пробовал:

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

Но я получаю исключение для обоих, так как он пытается вызвать "/".Как получить дескриптор Number /, чтобы я мог сохранить ссылку на старый метод, а затем переопределить его для своих собственных целей?Я все об этом ошибаюсь?

Ответы [ 3 ]

39 голосов
/ 24 ноября 2010

Для Эрика Хога (см. Комментарии к вопросу):

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
4 голосов
/ 08 апреля 2011

Что если вы использовали оператор power внутри своего переопределения, вам не нужно сохранять ссылку на старый оператор деления.

Number / := method(i, if(i==0, 0, self*i**(-1)))
4 голосов
/ 24 ноября 2010

То, что вы хотите сделать, это запустить:

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

Например.

Однако, следует отметить, что у вас будет бесконечный цикл на руках, если вы используете этоопределение new_div, так как вы вызываете метод / внутри него, и если для оператора / будет использоваться new_div, вызов 6 / 2 будет повторяться до тех пор, пока не закончится память.

...