smalltalk - 我如何使用 Smalltalk 的内置解析器或编译器来解析我自己的带有可选参数的消息?

标签 smalltalk optional-parameters

我正在尝试在 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 会更容易。带有完整的创建消息,包括默认值。
我该怎么做?
我已经从解析器中获取了一组 token ,但这并不能识别消息参数和参数。在我尝试自己实现参数解析之前,我认为 Smalltalk 中可能有一些东西可以给我一个消息参数和参数列表?

最佳答案

看起来您不必调整编译器。要提供默认值,只需让您的对象天生就有。如何?在初始化方法中:

Polyhedron >> initialize
   super initialize.
   shape := #triangle.
   size := 1.
   rotationSpeed := 5.
   rotationDirection := 0.707.
   color: Color red texture: false
#initialize当您发送 Polyhedron new 时发送消息.因此,如果你想改变形状,你只需要发送
Polyhedron new shape: #cube
顺便说一下,发送 super initialize 通常是个好主意。所以给父类(super class)一个机会来执行它们的初始化例程。
另请注意,Polyhedra 是 Polyhedron 的复数形式,类名通常是单数形式。

附录

如果您无法编辑类(class) Polyhedron ,您仍然可以引用它并因此向它发送消息。特别是,您可以创建新的实例创建方法,比您已有的方法更短。以下是如何执行此操作:
   Polyedron compile: 'shape: aSymbol
   ^self
     shape: aSymbol
     size: 1
     rotationSpeed: 5
     rotationDirection: 0.707
     color: Color rd texture: false'
注意#compile:的参数是您要添加的方法的源代码。通过使用这种新方法,您将能够说
Polyedron shape: #cube
得到你想要的。

关于smalltalk - 我如何使用 Smalltalk 的内置解析器或编译器来解析我自己的带有可选参数的消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62608963/

相关文章:

GNU Smalltalk - 格式化输出并禁用 GC 消息

java - GOF 中提到的可插拔适配器

objective-c - 还有哪些其他编程语言具有类似 Smalltalk 的消息传递语法?

c# - 在可选参数中设置 DateTime 的默认值

c++ - 如何将 C 中声明的可选参数方法转换为 C++

重写方法的 C# 可选参数

smalltalk - GNU Smalltalk 中的图像或文件?

uml - 从 Smalltalk 代码生成 UML 类图

swift - 是否可以使用不用作参数的参数?

javascript - 有没有办法在js中将特定参数传递给函数(无顺序)?