Как заменить существующие операторы, не вызывая их в Io?

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

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

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

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

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

3 ответа

Решение

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

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

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

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

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

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

Например.

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

Другие вопросы по тегам