Ich baue eine Smalltalk-API zu einem XML-basierten Webdienst. Der XML-Dienst ist so regelmäßig, dass ich, anstatt die Methoden von Hand zu schreiben, einfach #doesNotUnderstand:
überschreiben würde, um Methoden dynamisch über MyApi class>>compile:
hinzuzufügen, dann alle Methoden einmal in einem Arbeitsbereich aufzurufen, dann die DNU zu entfernen und meine nette API zu haben .Wie kann ich einer Klasse zur Laufzeit in Smalltalk Methoden hinzufügen?
Das funktioniert gut, aber eine riesige Zeichenfolge zu #compile:
passiert nur fühlt sich wirklich falsch zu mir; In Python und anderen Sprachen wäre es mir möglich, ein schön Syntax-geprüftes Lambda an eine Klasse anzuhängen, um einen ähnlichen Effekt in einer sichereren Weise zu erzielen. Z.B .:
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)
gegen
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
Es muss doch etwas so sauber wie der Python-Version sein?
Nun machen himaker, ich möchte auch einen Parameter ändern; nicht einfach kopieren. Sean schlug vor, diese allgemeine Idee etwas zu modifizieren, indem er 'decompileWithTemps 'aufruft, um eine Zeichenfolge zu erhalten, mit der ich Ersetzungen durchführen kann, die aber immer noch einen Textaustausch beinhaltet. Es scheint mir, dass "String >> format:" wahrscheinlich wirklich der beste Weg ist, um dies an dieser Stelle aufzuräumen. –