1

#newのメッセージを上書きしようとしていますMyObject。問題は、テキストがコンパイルされると、ローカル変数、dispおよびoldNewがそれぞれに変更されt1t2私はSqueak 4.3を使用しています)、に送信できないことoldNewですself
名前を変更することはできますが、それが良い考えかどうかはわかりません。これが私が持っているものの基本的な概要です:

MyObject class methodDict at: #new put:
    (Object compilerClass new
    compile: 'new
        | disp oldNew |
        oldNew := MyObject class methodDict at: #new.
        disp := Dispatcher new.
        ^disp xxxViewedObject: self oldNew'
    in: MyObject
    notifying: nil
    ifFail: []) generate

私がしていることが正しい方法であるかどうかは100%わかりませんので、他のアイデアを歓迎します。

oldNew編集:OK、それでメッセージとして探していたことがわかりましMyObjectたが、コンパイルされたメソッドを実行するにはどうすればよいですか?

4

3 に答える 3

1

どうやら私の問題は、それMyObjectが のサブクラスでProtoObjectあり、現在は のサブクラスになっていることでしたObject
この変更後に動作するように見えるコードは次のとおりです。

MyObject class methodDict at: #new put:
    (Object compilerClass new
    compile: 'new
        | disp |
        disp := Dispatcher new.
        ^disp xxxViewedObject: self basicNew initialize'
    in: MyObject
    notifying: nil
    ifFail: []) generate
于 2012-12-17T12:53:33.677 に答える
0

生成されたメソッドは、他のメソッドと同じです。したがって、メソッドのセレクターを送信して呼び出すだけです。

var := MyObject new. 
于 2013-07-28T11:10:54.543 に答える
0

新しく生成されたコンパイル済みメソッドを評価するには、次を使用できます。

aCompiledMethod valueWithReceiver: nil arguments: #()

これは良い方法ですが、問題を実験している場合は、Grease と呼ばれる Smalltalk 間のライブラリに基づいた「コード ジェネレータ」を作成しました。これは役に立ちます。自動コメント、RBParser と Parser、オーサリング、および基本的なテンプレートを管理します。もちろん、誰でもすべてを拡張できます。

于 2012-12-17T05:28:41.383 に答える