Smalltalk语法错误

时间:2012-02-23 03:53:57

标签: smalltalk

我正在学习smalltalk,我正在尝试创建一个非常简单的程序,创建一个数字数组,然后找到最大的数字。我的代码如下所示:

| list max |
list := #(1 8 4 5 3).
    1 to: list size do: [:i |
    max < (list at: i)
        ifTrue: [max := (list at: i)].
        ifFalse: [max := max].
    ].

当我运行此代码时,我得到“stdin:7:解析错误,预期']'”。我对这导致什么感到困惑。它看起来像我的所有方括号对应。帮助

3 个答案:

答案 0 :(得分:5)

亚历山大告诉你,很可能该集合提供了一种最大方法。您可能会对如何操作感兴趣。

使用collection max(所有元素的最大值)

#(1 8 4 5 3) max

使用数字最大值:(两个数字中的哪一个更大)

#(1 8 4 5 3) inject: 0 into: [:max :elem|
     max max: elem ]

或仅使用内部迭代器

#(1 8 4 5 3) inject: 0 into: [:max :elem|
    max < elem 
       ifTrue: [ elem ]
       ifFalse:[ max ] ]

与您使用外部迭代的解决方案一起,您可以看到有很多可能性。

希望它增加一些东西

答案 1 :(得分:4)

行号似乎已关闭,但查看您的代码似乎错误可能是由ifTrue: [max := (list at: i)]之后的时段引起的。 #ifTrue:ifFalse是一个单一的方法选择器,将它分成两个语句是没有意义的。

实际上,您可以完全删除代码的ifFalse部分。为自己分配最大值无效。此处不需要循环索引。您可以使用list do: […]直接处理这些值。

还应初始化max变量。零似乎是与数组中的正数进行比较的好选择。

但不是做所有调查Collection类。您的Smalltalk方言可能已经为此任务提供max方法。

答案 2 :(得分:3)

您的立即问题是您使用句点终止ifTrue部分。您通常可以删除句点,但由于您的ifFalse部分实际上是非操作,因此最好删除该位。

但即使你修复了这个问题,你仍然需要初始化max,这样就不会向<对象发送nil消息。您可以将其初始化为第一个元素,如果有,则可以将循环更改为从第二个元素开始。

当然,当列表为空时初始化到第一个元素是有问题的,所以你也应该处理它。在下面的代码中,我将它设置为一个合适的小值,然后只有在它可用时才从列表的第一个元素初始化它。

更正后的代码是:

| list max |
list := #(1 8 4 5 3).
max := -99999.
(list size) > 0 ifTrue: [max := (list at: 1)].
2 to: list size do: [:i |
    max < (list at: i) ifTrue: [max := (list at: i)].
]
(max) displayNl

这会按预期输出8,也可以在边缘情况下正常工作(列表大小为零和一)。