提问人:kamkow1 提问时间:6/25/2022 更新时间:6/25/2022 访问量:53
在自定义解释的编程语言中实现“this”/“self”
implementing "this" / "self" in a custom interpreted programming language
问:
我正在开发一个自定义解释器,以提供有趣的;) 到目前为止,我所拥有的是分配变量、定义和调用函数、数组、循环、if 块等...... 我已经开始在我的语言中添加 OOP 元素,但我在实现“this”/“self”关键字时遇到了麻烦。 我只是无法找到解决这个问题的方法。 我想了几个解决方案:
- 类存储其实例(作为字典),当“this”关键字出现时,解释器忽略“private”和“public”关键字(从公共方法调用私有方法),创建对“this”引用的方法的调用并返回。
- “this”关键字是一个引用,在后台是实例本身,但该调用删除了方法访问修饰符。这与第一个相似,但我想不出更好的方法。
另外,如果您知道 C#(主要)或 C++,那就太好了,因为我严重依赖 OOP 来创建我的解释器。
下面是我想实现的一小段代码示例:
struct Dog has
pub prop age;
prv def bark() do
println "woof woof";
end
pub def run(dist) do
loop 0 to $dist with "d" do
println ("the dog ran " + string $d) + " meters";
$self.bark();
end
end
end
def main(args) do
new Dog -> $dog;
7 -> $dog.age;
println $dog.age;
$dog.run 30;
end
请注意,bark() 方法是 “prv” (private)。我想知道如何让结构体知道它的实例,这样我就可以让狗在每次运行时吠叫(从公共方法调用私有方法)。
提前致谢
答:
0赞
Adam Kotwasinski
6/25/2022
#1
你的解释器将需要保留一个执行堆栈和环境(否则你不知道在方法完成后返回到哪里,等等)。
在此执行堆栈/环境中,除了函数指针/签名外,您还将保留正在调用方法的对象(如果有的话,请记住类似静态的函数)。
然后,在取消引用时,也会访问您存储的此引用。实际上,这既是你想法的第 1 部分,也是第 2 部分——你可以在那里放置某种检查,比如方法的可见性等。$this
祝你好运,听起来像是一个有趣的项目!
评论
instance.method()
instance
method
this