簡體   English   中英

如何使用 Smalltalk 的內置解析器或編譯器來解析我自己的帶有可選參數的消息?

[英]How do I use Smalltalk's built in Parser or Compiler to parse my own messages with optional parameters?

我正在嘗試在 Smalltalk 中創建一個實時編碼環境。 我正在使用的對象有很長很復雜的方法,其中包含許多用於創建新實例的參數。 我希望能夠編寫一個非常短的“命令”,它只指定我感興趣的參數並為所有其他參數提供默認值。

例如,而不是寫類似:

Polyhedron shape: #cube size: 1 rotationSpeed: 5 rotationDirection: 0.707 color: red texture: false

在我的實時編碼環境中,我想寫:

poly shape: #cube

一些 arguments 可能很復雜並包含自己的消息,例如:

poly shape: #cube rotationSpeed: ((pot1 max: 0) min: speedLimit)

因此,與其自己嘗試解析實時編碼字符串,我認為如果我可以使用 Smalltalk 的內置解析器或編譯器來解碼字符串並使用包含默認值的完整創建消息調用Polyhedron會更容易。

我該怎么做?

我已經從解析器中獲取了一組令牌,但這並不能識別消息參數和 arguments。 在我嘗試自己實現參數解析之前,我認為 Smalltalk 中可能有一些東西可以給我一個消息參數列表和 arguments?

看起來您不必調整編譯器。 要提供默認值,只需讓您的對象與它們一起出生。 如何? 在初始化方法中:

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通常是一個好主意,以便讓超類有機會執行其初始化例程。

另請注意,Polyhedra 是 Polyhedron 的復數,class 名稱通常是單數。


附錄


如果您無法編輯 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

得到你想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM