编译文本流中的局部变量(smalltalk)

时间:2012-12-16 23:03:13

标签: smalltalk squeak

我正在尝试覆盖#new中的MyObject消息。问题是,当文本被编译时,局部变量dispoldNew分别变为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作为MyObject中的消息,但是我如何运行已编译的方法呢?

3 个答案:

答案 0 :(得分:1)

显然我的问题是MyObjectProtoObject的子类,现在是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

答案 1 :(得分:0)

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

aCompiledMethod valueWithReceiver: nil arguments: #()

这是一个很好的方法,但是如果你正在试验问题,我会在一个名为Grease的跨Smalltalk库中编写一个“code generator”,它对你有用。它管理自动注释,RBParser和Parser,创作和基本模板。当然,所有人都可以延长。

答案 2 :(得分:0)

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

var := MyObject new.