tipos relacionales programacion operadores operaciones logicos con comparacion asignacion aritmeticos operators iolanguage

operators - programacion - operadores relacionales



¿Cómo se reemplazan los operadores existentes sin invocarlos en Io? (3)

Estoy tratando de completar el segundo ejercicio en el día 2 de IO en el libro Siete idiomas en siete días. En ella, tu preguntabas, "¿Cómo cambiarías / para devolver 0 si el denominador es cero?" He determinado que puedo agregar un método al Número usando:

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

Lo que no estoy seguro es cómo reemplazar el "/" en la tabla del operador. He intentado:

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

Pero recibo una excepción para ambos ya que está intentando invocar "/". ¿Cómo puedo manejar el Número / para poder almacenar una referencia al método anterior y luego redefinirlo para mis propios propósitos? ¿Me estoy equivocando?


¿Qué pasa si usó el operador de energía dentro de su redefinición, entonces no tiene que mantener una referencia al operador de la división anterior?

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


Lo que quieres hacer es ejecutar:

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

Por ejemplo.

Sin embargo, debe tenerse en cuenta que tendrá un bucle infinito en sus manos si usa esa definición de new_div , ya que está llamando al método / dentro de él, y configurar el operador / para usar new_div hará que la llamada, 6/2 para recurse hasta que se quede sin memoria.


Para Eric Hogue (ver pregunta):

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