标签: gnu-smalltalk

GNU Smalltalk - 从 whileTrue 循环中断而不返回

whileTrue在不需要返回的 GNU Smalltalk 循环中,有什么简单而简洁的方法可以中断?

这是我的代码。如果char_stack为空,我想在第 31 行结束时中断循环。

https://gist.github.com/SYZYGY-DEV333/ea3f5eeb3473927c8faa294bb72a8858

任何帮助将非常感激。

loops smalltalk break while-loop gnu-smalltalk

2
推荐指数
2
解决办法
1208
查看次数

Smalltalk - 用条件迭代字典数组

我正在研究一个 Smalltalk 小方法,我希望这个方法迭代字典数组并根据条件返回 True 或 False。

字典数组是一个实例变量,名称为 dictArray。

看起来像: [{'name': toto, 'age': 12}, {'name': tata, 'age': 25}]

所以我想遍历 dictArray 并验证每个项目的名称和年龄。如果匹配,我返回 true else false 和迭代结束。

在python中它应该是这样的:

for item in dictArray:
    if item['name'] == aName and item['age'] == aAge:
        return True
return False
Run Code Online (Sandbox Code Playgroud)

我找不到这种特殊情况的文档(数组迭代 + 条件 + 返回)

希望可以有人帮帮我!

smalltalk gnu-smalltalk

2
推荐指数
1
解决办法
441
查看次数

Smalltalk拥有自己的新方法

Object subclass: Node [     

    |value|

    new [
        Transcript show: 'Test'.
            value := 6.
    ]

    getValue [
        ^value.
    ]

    set:sth [
        value := sth.
    ]

]

|data|
data := Node new.
Transcript show: (data getValue) printString ; cr. "nil"
data set:5.
Transcript show: (data getValue) printString. "5"
Run Code Online (Sandbox Code Playgroud)

问题是new永远不会调用方法,所以我不能设置值或调用initialize函数.此外之后:

object := Node new. "Not called"
object new. "Here is called"
Run Code Online (Sandbox Code Playgroud)

该方法被调用.如何解决?

smalltalk gnu-smalltalk

1
推荐指数
1
解决办法
468
查看次数

如何在smalltalk中根据类获取超类的名称

我知道如何在SMALLTALK中获取类的元类(with class message ).

但是我如何得到SuperClass一个类(或获得SuperClass某个类的实例)?

smalltalk squeak gnu-smalltalk

1
推荐指数
1
解决办法
371
查看次数

无法在 GNU Smalltalk 中调用“函数”

我想定义块并以这种方式调用它:

add := [ :a :b |
    ^(a+b).
].

n := add value: 1 value: 2.
Run Code Online (Sandbox Code Playgroud)

但是当我尝试时,我收到一个错误:

$ gst 3.1.st 
Object: 3 error: return from a dead method context
SystemExceptions.BadReturn(Exception)>>signal (ExcHandling.st:254)
SystemExceptions.BadReturn class(Exception class)>>signal (ExcHandling.st:151)
SmallInteger(Object)>>badReturnError (Object.st:1389)
UndefinedObject>>executeStatements (3.1.st:3)
Run Code Online (Sandbox Code Playgroud)

如何调用 GNU Smalltalk 中的函数?

好吧,我删除了 return 语句,并且这段代码工作正常。但是当我尝试定义更复杂的函数时,例如:

nod := [ :a :b |
    (a=b) ifTrue: [a].
    (a>b) ifTrue: [nod value: (a-b) value: b].
    (a<b) ifTrue: [nod value: a value: (b-a)].
].

n := nod value: 1 value: 2.
n printNl.
Run Code Online (Sandbox Code Playgroud)

它打印为零。如果我用“提前退出”来定义: …

smalltalk gnu-smalltalk

1
推荐指数
1
解决办法
316
查看次数

在Smalltalk的同一语句中分配和比较的效率

一个以前的SO问题提出了有关这成语是在执行efficency方面更好的时间问题:

[ (var := exp) > 0 ] whileTrue: [ ... ]
Run Code Online (Sandbox Code Playgroud)

[ var := exp. 
  var > 0 ] whileTrue: [ ... ]
Run Code Online (Sandbox Code Playgroud)

直观地看,第一种形式似乎在执行期间更有效,因为它节省了一个额外的声明(第二种形式).在大多数Smalltalks中都是如此吗?

试着用两个愚蠢的基准测试:

| var acc |
var := 10000.
[ [ (var := var / 2) < 0  ] whileTrue: [ acc := acc + 1 ] ] bench.

| var acc |
var := 10000.
[ [ var := var / 2. var < 0  ] whileTrue: [ acc := acc + …
Run Code Online (Sandbox Code Playgroud)

benchmarking smalltalk visualworks pharo gnu-smalltalk

1
推荐指数
1
解决办法
86
查看次数