在SmallTalk中解析字符串

时间:2011-11-06 23:49:45

标签: string parsing smalltalk

我在尝试将字符串中的每个字符切换为下一个(a-> b,y - > z等)。虽然我不知道如何在Smalltalk中做到这一点,并试图像这样结合:

x := 'costam'.
y := x asArray.
y do: [:charr | charr := charr + 1. ].
y do: [:char | Transcript show: char printString; cr].

我所做的是:迭代数组并增加每个字符..虽然它不起作用。我得到错误:尝试存储到参数中。我如何解决这个问题并以正确的方式做到这一点?

现在我有这样的事情:

x := 'costam'.
y := x asArray.
b := y at: 2.


n := 1.
m := 5.

[ n < m ] whileTrue: [
n := n + 1.
y at: n put: 'a'.
Transcript show: (y printString).
].

剩下的问题是我如何'增加'字符,如a - &gt; b g - &gt;等等? 解决

2 个答案:

答案 0 :(得分:2)

来自“Smalltalk-80”:

  

由于参数名称是伪变量名称,因此它们可用于访问变量名称之类的值,但它们的值不能通过赋值来更改。在spend:for:的方法中,形式为

的声明
amount =: amount * taxRate
     

在语法上是非法的,因为无法重新分配金额的值。

您可以使用collect:消息创建新集合:

z =: y collect: [:char | (ch asciiValue + 1) asCharacter ].

Character不响应+,因此您需要转换为Integer并返回。请注意,由于String是集合,因此它们也会响应collect:

x collect: [:ch | (ch asciiValue + 1) asCharacter ]

如果您只想要ASCII字符,请在转换回字符之前取余数模128.

x collect: [:ch | (ch asciiValue + 1 \\ 128) asCharacter ]

如果您只想增加字母而不是其他字符,请在块中添加条件。

x collect: [:ch | ch isLetter
                      ifTrue: [(ch asciiValue + 1) asCharacter]
                      ifFalse: [ch] ]

请注意,最后一个块不处理连续范围末尾的字母(例如$z,或者,如果解释器支持扩展ASCII或Unicode,$<16rD6>),则作为确切方法取决于系统的功能(基本上,这是一个字母)。

答案 1 :(得分:1)

试试这个:

x := 'costam'
answer := (x asIntegerArray collect: [ :c | c + 1]) asString.
Transcript show: answer
相关问题