Estoy creando una API Smalltalk para un servicio web basado en XML. El servicio XML es tan regular que, en lugar de escribir los métodos a mano, pensé que simplemente anularía #doesNotUnderstand:
para agregar métodos dinámicamente a través de MyApi class>>compile:
, luego llamar a todos los métodos una vez en un área de trabajo, luego eliminar el DNU y tener mi API agradable .¿Cómo puedo agregar métodos a una clase en tiempo de ejecución en Smalltalk?
Esto funciona muy bien, pero pasar una cuerda gigante al #compile:
me parece realmente malo; en Python y en otros idiomas, podría adjuntar una lambda bien revisada por sintaxis a una clase para lograr un efecto similar de una manera más segura. Ej .:
def himaker(name):
def hello(self, times):
for x in xrange(times):
print "Hi, %s!" % name
return hello
class C(object): pass
C.bob = himaker('Bob')
C.jerry = himaker('Jerry')
a = C()
a.bob(5)
frente
SomeObject>>addHello: name
| source methodName |
methodName := 'sayHello', name, 'Times:'.
source := String streamContents: [ :s |
s nextPutAll: methodName, ' count'.
s nextPut: Character cr.
s nextPut: Character tab.
s nextPutAll: 'count timesRepeat: [ Transcript show: ''Hi, ', name, '!'' ].' ]
SomeObject class compile: source
Seguramente debe ser algo tan limpia como la versión de Python?
Bueno, también quiero cambiar un parámetro; no solo copiar Sean sugirió modificar ligeramente esta idea general, llamando a 'decompileWithTemps' para obtener una cadena en la que pueda realizar sustituciones, pero que todavía implique un reemplazo textual. Me parece que el formato 'String >>:' probablemente sea la mejor manera de solucionar esto en este punto. –