如何在smalltalk/squeak/pharo中获取给定协议中所有(类)方法的集合?
我正在尝试收集一组方法返回的值.我不想将方法存储在实例或类变量中.所以我虽然可以将它们添加到协议中并以这种方式"标记"它们.
谢谢.
召集Smalltalk宇宙的绝地大师,
我对C++/Python/Perl有所了解,并且已经编写了5年多的编程.
我必须分叉Scratch - MIT的可视化编程语言来增加对机器人工具包的支持.Scratch是使用Squeak创建的,Squeak是Smalltalk的一个实现.
我打算阅读A Little Smalltalk - 由Timothy budd跟随Sqeak By Examples - 作者:Oscar Nierstrasz [http://squeakbyexample.org/]
你认为这是个好主意吗?你会建议什么?我可以看免费视频教程吗?
最终目标是能够理解临时代码库.在我能够理解(截至目前)奇怪的Squeak开发环境及其方式之前,我想先了解一下smalltalk.
卢克小行者
捕获每个Smalltalk新手的东西是add:不会返回"自我"但是添加的对象.
例如,使用此代码:
myCollection := OrderedCollection new
add: 'Peter';
add: 'John';
add: 'Paul'.
Run Code Online (Sandbox Code Playgroud)
myCollection将包含字符串"保罗",而不是集合本身.
这是因为add:返回正在添加的对象,整个级联表达式的计算结果是最后发送的消息.
相反,它应该写yourself在最后:
myCollection := OrderedCollection new
add: 'Peter';
add: 'John';
add: 'Paul';
yourself.
Run Code Online (Sandbox Code Playgroud)
add:这种行为有什么好处?我在Pharo Smalltalk中使用过pragma,并了解它们是如何工作的,并且已经看到了Pharo中使用它们的例子.
我的问题是:
我是Pharo的新手,我正在尝试迭代OrderedCollection,但是从最后开始.
例如:
| c |
c := OrderedCollection new.
c add: (1).
c add: (2).
c add: (3).
c do: [ :each | Transcript show: each ; cr ]
Run Code Online (Sandbox Code Playgroud)
结果却是1 2 3我想要的3 2 1.
是否有可能或者我必须使用其他类型的收藏?
我一直在学习Squeak Smalltalk,并注意到它有一个非常忠实的社区,并且在一些大型的学术和开源项目中使用,但我没有找到任何在商业上以任何重要方式使用它的例子.我很好奇这个环境在世界范围内的商业运作方式.也许接管旧的Smalltalk项目?有人知道吗?
我试图将squeakSSL与WebClient一起使用,squeakSSL页面说:
要安装SqueakSSL,您需要下载并安装该插件的二进制版本,然后通过以下方式安装SqueakSSL:
(Installer ss)
project: 'SqueakSSL';
install: 'SqueakSSL-Core';
install: 'SqueakSSL-Tests';
Run Code Online (Sandbox Code Playgroud)
我下载了提到的包,它只是一个DLL文件.我在网上找不到你如何安装吱吱声插件.我尝试将它放在VM和Image目录中,但squeakSSL测试失败了.
你如何安装一个吱吱声插件?
上下文
作为一个大学项目,我们想要改变pharo vm以使用对象表,看看会发生什么.
我们使用来自github和VMMaker 的pharo-vm克隆.构建VM工作正常.
为了开始,我们添加了一个返回增量Integer的原语:
InterpreterPrimitives>>primitiveIntegerIncrement
"increments an integer"
self pushInteger: self popInteger + 1 .
Run Code Online (Sandbox Code Playgroud)
并StackInterpreter class>>initializePrimitiveTable据此修改
MaxPrimitiveIndex := 576.
"... and so on ..."
(575 primitiveFail)
(576 primitiveIntegerIncrement))
Run Code Online (Sandbox Code Playgroud)
它有效.
问题
当我们对VM进行更改时,我们想要在SmalltalkImage中进行测试运行,因此我们不需要编译并看到它不起作用.
就像是:
StackInterpreter test: '1 inc'
Run Code Online (Sandbox Code Playgroud)
如果原语错误或发生错误,我可以调试.当然需要做得更多,但我怎样才能做到这一点?
我们尝试了什么
类VMMaker-InterpreterSimulation类StackInterpreterSimulator.尝试评论中的代码
DoIt
^ (StackInterpreterSimulator new openOn: Smalltalk imageName) test
Run Code Online (Sandbox Code Playgroud)
错误:
displayForm := 'Display has not yet been installed' asDisplayText form.
Run Code Online (Sandbox Code Playgroud)
ByteString不明白 asDisplayText
(CogVMSimulator new openOn: Smalltalk imageName) test
(InterpreterSimulator …Run Code Online (Sandbox Code Playgroud)在Smalltalk(特别是Pharo/Squeak)中,我想知道是否可以省略"["和"]"作为消息的参数,如:ifAbsent:如果你不需要一个块,就像这样;
^ bookTitles at: bookID ifAbsent: ''.
Run Code Online (Sandbox Code Playgroud)
和
^ books at: bookID ifAbsent: nil.
Run Code Online (Sandbox Code Playgroud)
代码有效,因为(在Pharo/Squeak中)对象>>值只返回self.但我想知道这种用法是如何接受的,或者你是否应该总是键入[和],即使你不关心参数是否被快速评估或多次评估.