spo*_*ang 6 oop smalltalk metaprogramming squeak
我是Smalltalk的新人,并在Squeak中学到了它.但我发现很多事情在Smalltalk中令人困惑.在佳乐,MetaClass
和MetaClass class
彼此的相互类.如果我想创建对象,MetaClass
我应该向new
它的类发送一条消息MetaClass class
.但它必须首先作为一个对象存在,才能接受这个消息.所以我必须首先创建对象MetaClass class
,这只能通过向尚未创建new
的对象发送消息来完成MetaClass
.所以这是鸡蛋或鸡蛋问题.
当然我现在可以在Squeak中创建对象,因为在打开Squeak时已经自动神奇地创建了MetaClass
和MetaClass class
对象.但我不知道怎么做.也许它们是以某种方式创建而不是通过发送消息.但它与Smalltalk的精神相矛盾:一切都是通过发送消息而发生的,除了几点(变量声明,赋值,返回和原语).
上述推理有什么问题吗?提前致谢.
Tob*_*ias 12
你的问题是双重的,让我们分开回答.
如何创建相互依赖的类?
你是对的,Metaclass
并且Metaclass class
在Smalltalk类和元类的并行层次结构中是一个奇点.它们是如何创建的?
这取决于您使用的Smalltalk.对于GNU Smalltalk,我不确定,但对于原始Smalltalk-80(VisualWorks,VA aka VisualAge,SqueakPharo)的后代,它们是在Bootstrap过程中创建的,用于创建初始图像.
然而,至少对于Squeak来说,这个引导程序至少发生在15年前,如果不是更多的话.Metaclass
它的班级甚至可能长达30年.
简而言之,这两个类都是在典型的图像处理之外创建的,并且手动链接在一起.
但如果物品已经存在多年,那就会产生问题
Smalltalk创业公司会发生什么?
与Ruby或Python等面向对象的语言相反,Smalltalk也不需要像Object
每次启动时那样创建基本的对象环境.为什么?
当Smalltalk保存并关闭时,它基本上会获取其所有对象的快照,并将这些活动对象保存到文件中.当它再次启动时,它只需要从快照中读取对象并"恢复"它们.
因此,对于Metaclass
和Metaclass class
,两个对象都从快照中读取并恢复,从这一点开始,它们完全正常运行; 它们不需要再手动创建.
Joh*_*n B 11
"自动创建"过程实际上称为bootstrapping.这就是鸡蛋问题得到解决的方法.一旦系统被引导,所有其余的都可以用系统本身表示.因此,与Smalltalk的理念并不矛盾,即所有事情都是通过发送消息而发生的,因为一旦它被引导,它就变成了一个Smalltalk系统.
Metaclass class class = Metaclass
是一个奇怪循环的经典学术范例.但是如果你稍微询问一下,你可以在Smalltalk中找到很多其他人.
Object superclass superclass class superclass = Object
)MethodDictionary methodDictionary class = MethodDictionary
)的实例中.ByteSymbol name class = ByteSymbol
).Array superclass subclasses class = Array
)的子类.(Smalltalk globals at: #Smalltalk) = Smalltalk
).我让你自己继续列表.
无论实现什么,最终的问题是你是否可以设计一个像Smalltalk这样的自我描述系统而没有这些奇怪的循环,如果你遵循http://en.wikipedia.org的子链接,你可能会瞥见一个不那么正面的答案./维基/ Kurt_G%C3%B6del#The_Incompleteness_Theorem
与此类系统遇到的引导问题相关,一种有效的方法是克隆自己以改变自己,当您想要更改用于更改/描述类的基类时,在Smalltalk映像中尤其如此.
因此,我的先前和简明的答案通过应用规则的字母(https://stackoverflow.com/help/deleted-answers)而删除,而不是我认为的精神:
以下是解决方法: http ://en.wikipedia.org/wiki/Drawing_Hands
最后一点,我宁愿阅读,Smalltalk的难以置信的一致性,但我绝对有偏见.
归档时间: |
|
查看次数: |
491 次 |
最近记录: |