1

我正在尝试#new覆盖MyObject. 问题是当文本被编译时,局部变量dispoldNew分别更改为t1t2(我使用的是 Squeak 4.3),然后它不能发送oldNewself.
我可以更改他们的名字,但我不确定这是个好主意。这是我所拥有的基本概述:

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的消息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

要评估新生成的编译方法,您可以使用:

aCompiledMethod valueWithReceiver: nil arguments: #()

这是一个很好的方法,但是如果你正在试验问题,我编写了一个“代码生成器”,它基于一个名为 Grease 的跨 Smalltalk 库,它对你很有用。它管理自动注释、RBParser 和 Parser、创作和基本模板。当然,任何人都可以扩展所有内容。

于 2012-12-17T05:28:41.383 回答
0

生成的方法与其他方法没有什么不同。所以你只需发送方法的选择器来调用它:

var := MyObject new. 
于 2013-07-28T11:10:54.543 回答