Я создаю Smalltalk API для веб-службы на основе XML. Служба XML настолько регулярна, что вместо написания методов вручную я решил переопределить #doesNotUnderstand:
для динамического добавления методов через MyApi class>>compile:
, затем вызвать все методы один раз в рабочей области, затем удалить DNU У меня есть хороший API.
Это прекрасно работает, но передача гигантской нити на #compile:
просто кажется мне неправильной; в Python и других языках я смог бы присоединить к классу лямбду с проверкой синтаксиса, чтобы добиться аналогичного эффекта более безопасным способом. E.g.:
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)
против
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
Конечно, должно быть что-то такое же чистое, как версия Python?