XML ベースの Web サービスに対する Smalltalk API を作成しています。XML サービスは非常に規則的であるため、手動でメソッドを記述するのではなく、 を#doesNotUnderstand:
介してメソッドを動的に追加するようにオーバーライドしMyApi class>>compile:
、ワークスペースですべてのメソッドを 1 回呼び出してから、DNU を削除して素敵な API を用意することにしました。
これはうまく機能しますが、巨大な文字列を渡す#compile:
だけで、私には本当に間違っているように感じます。Python や他の言語では、適切に構文チェックされたラムダをクラスにアタッチして、より安全な方法で同様の効果を得ることができます。例えば:
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バージョンと同じくらいきれいなものがあるに違いない?