Как я могу добавить методы в класс во время выполнения в Smalltalk?

Я создаю Smalltalk API для веб-службы на основе XML. Служба XML настолько регулярна, что вместо того, чтобы писать методы вручную, я решил просто переопределить #doesNotUnderstand: для динамического добавления методов через MyApi class >> compile: , затем вызовите все методы один раз в рабочей области, затем удалите DNU и получите мой хороший API.

Это отлично работает, но передача гигантской строки в #compile: кажется мне совершенно неправильной; в Python и других языках я d иметь возможность присоединить к классу лямбду с хорошей синтаксической проверкой для достижения аналогичного эффекта более безопасным способом. Например:

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?

7
задан Benjamin Pollack 16 December 2010 в 12:59
поделиться