Как заменить существующие операторы, не вызывая их в 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
повторять до тех пор, пока у вас не закончится память.