Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops GNU Smalltalk-从whileTrue循环中断而不返回_Loops_While Loop_Break_Smalltalk_Gnu Smalltalk - Fatal编程技术网

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

Loops GNU Smalltalk-从whileTrue循环中断而不返回,loops,while-loop,break,smalltalk,gnu-smalltalk,Loops,While Loop,Break,Smalltalk,Gnu Smalltalk,在GNU Smalltalk中,什么是一种简单而简洁的方法来打破不需要返回的whileTrue循环 这是我的密码。如果char\u stack为空,我想在末尾第31行中断循环 任何帮助都将不胜感激 一般来说,Smalltalk没有从循环中断的方法,除了从封闭方法返回 尝试将您的循环提取到另一个方法中,从中可以返回以从循环中中断 在某种程度上,Smalltalk语言甚至没有循环。。。但有些方法会多次评估块。因此,它没有终止“循环”的特殊方法。回归才是出路 如果尚未这样做,请熟悉收集的不同迭代方法

在GNU Smalltalk中,什么是一种简单而简洁的方法来打破不需要返回的
whileTrue
循环

这是我的密码。如果
char\u stack
为空,我想在末尾第31行中断循环


任何帮助都将不胜感激

一般来说,Smalltalk没有从循环中断的方法,除了从封闭方法返回

尝试将您的循环提取到另一个方法中,从中可以返回以从循环中中断

在某种程度上,Smalltalk语言甚至没有循环。。。但有些方法会多次评估块。因此,它没有终止“循环”的特殊方法。回归才是出路


如果尚未这样做,请熟悉收集的不同迭代方法:
do:
选择:
收集:
检测:ifNone:
。。。后者是在集合上运行“不完整”循环的另一种方式,但它并不能解决您可能希望“中断”的所有情况。

Byte杂志(1982)的一篇文章,题为《在Smalltalk-80系统中构建控制结构》,作者彼得·德伊奇,显示了在循环内部可能发生的不常见事件的循环中断时实现的容易程度

为了实现这一点,我们只需要一个新类和对
BlockClosure
的扩展,总共有9行代码(!)

BlockWithExit
对象
的子类,具有两个ivar
exit
block
以及以下方法

on: aBlock
  block := aBlock

value
  exit := [^nil].
  ^block value

exit
  exit value
扩展

BlockClosure>>withExit
  ^BlockWithExit new on: self
就这样

示例

查找集合的最大值,直到其耗尽或找到
nil
(罕见事件)

为什么这样做?因为具有非本地返回的块从定义该块的方法中退出

在这种情况下,此方法是
BlockWithExit>>value
,因此当从
循环退出
计算
[^nil]
时,流退出
value
,并在
循环值
之后到达其发送方


Deutsch发现的一个突出推论是异常的整个机制可以使用与在ivar中定义退出块相同的技巧来构建,如:
exit:=[^nil]

感谢您的帮助和彻底的回答。我会记住那件事的。
maxBeforeNil: aCollection
  | max supplier loop |
  max := 0.
  supplier := aCollection readStream.
  loop := [
    [supplier atEnd]
      whileFalse: [
        value := supplier next.
        value isNil ifTrue: [loop exit].
        max := max max: value]] withExit.
  loop value.
  ^max