如何使用Smalltalk';是内置解析器还是编译器,用可选参数解析我自己的消息?

如何使用Smalltalk';是内置解析器还是编译器,用可选参数解析我自己的消息?,smalltalk,optional-parameters,Smalltalk,Optional Parameters,我试图在Smalltalk中创建一个实时编码环境。我正在使用的对象有很多复杂的方法,其中包含许多用于创建新实例的参数。我希望能够编写一个非常简短的“命令”,只指定我感兴趣的参数,并为所有其他参数提供默认值 例如,不要写像这样的东西: Polyhedron shape: #cube size: 1 rotationSpeed: 5 rotationDirection: 0.707 color: red texture: false 在我的实时编码环境中,我想写: poly shape: #cub

我试图在Smalltalk中创建一个实时编码环境。我正在使用的对象有很多复杂的方法,其中包含许多用于创建新实例的参数。我希望能够编写一个非常简短的“命令”,只指定我感兴趣的参数,并为所有其他参数提供默认值

例如,不要写像这样的东西:

Polyhedron shape: #cube size: 1 rotationSpeed: 5 rotationDirection: 0.707 color: red texture: false
在我的实时编码环境中,我想写:

poly shape: #cube
有些参数可能很复杂,并且包含它们自己的消息,如:

poly shape: #cube rotationSpeed: ((pot1 max: 0) min: speedLimit)
因此,我认为如果我可以使用Smalltalk的内置解析器或编译器对字符串进行解码,并使用包含默认值的完整创建消息调用
Polyhedron
,而不仅仅是自己尝试解析实时编码字符串,那会更容易

我该怎么做


我已经从解析器中获取了一个令牌数组,但它没有标识消息参数和参数。在我尝试自己实现参数解析之前,我认为Smalltalk中可能有某种东西可以给我一个消息参数和参数列表?

看起来你不必调整编译器。要提供默认值,只需将对象与它们一起生成即可。怎么用?在初始化方法中:

Polyhedron >> initialize
   super initialize.
   shape := #triangle.
   size := 1.
   rotationSpeed := 5.
   rotationDirection := 0.707.
   color: Color red texture: false
当您发送新的多面体时,将发送初始化消息。因此,如果要更改形状,只需发送

Polyhedron new shape: #cube
顺便注意一下,通常最好发送
超级初始化
,以便让超类有机会执行其初始化例程

还要注意,多面体是多面体的复数形式,类名通常是单数


附录


如果您无法编辑类
多面体
,您仍然可以引用它,从而向它发送消息。特别是,您可以创建比现有实例创建方法更短的新实例创建方法。以下是如何做到这一点:

   Polyedron compile: 'shape: aSymbol
   ^self
     shape: aSymbol
     size: 1
     rotationSpeed: 5
     rotationDirection: 0.707
     color: Color rd texture: false'
请注意,
#compile:
的参数是要添加的方法的源代码。通过使用这种新方法,你只需说

Polyedron shape: #cube

得到你想要的。

我还不清楚为什么需要这么复杂。如果
pot1
是一个接受消息
min:
max:
的对象,那么当您调用
poly shape:#立方体旋转速度:((pot1 max:0)min:speedLimit)
时,Smalltalk将计算
((pot1 max:0)min:speedLimit)
,然后将其作为选择器参数传入。我想编写自己的缩写字符串表示形式,并对其进行计算。在本例中,“多边形形状:#立方体”。该字符串是“多面体形状:#立方体旋转速度:…”的缩写形式。我的问题是,当我尝试处理和评估我的缩写字符串时,有没有一种方法可以让我利用编译器免费解析消息?如果我通过“((pot1 max:0)min:speedLimit)”作为rotationSpeed:parameter Smalltalk的参数,您是对的,Smalltalk将做正确的事情并对此进行评估。但是有没有一种简单的方法可以从字符串中提取参数呢?好的,谢谢你的澄清。在你的例子中,你没有把它写成字符串。谢谢你,我从你的回答中学到了很多。不幸的是,在这种情况下它不起作用。我正在使用无法编辑的对象库。我的问题也犯了一个错误(我现在已经改正了)。这些对象不使用“new”,而是有一个包含所有参数的长而复杂的创建方法,并且看起来是不可变的。这就是为什么我认为我需要解析我的缩写字符串表示,添加默认值,并生成大型创建消息的原因。@AlanMJackson感谢您的澄清。请阅读我先前答复的附录。