Smalltalk(Pharo)如何简单地与用户交互

smo*_*are 5 stdin smalltalk console-application pharo

我偶然发现了Smalltalk并进一步下载了Pharo,因为它被推荐了.我的第一印象非常积极.我想移植一些我用C++编写的简单程序(我的主要语言),所以我可以感受到Smalltalk.

但是,我意识到我找不到一个简单的方法来从用户那里获得一些输入,例如我想创建一个带有REPL循环的控制台计算器,但我找不到在Pharo中这样做的方法.我不想要带按钮的gui,因为这只是缓慢而且不方便.

有人可以指出我如何在Smalltalk中做简单的事情,比如让用户输入10个数字或命令等?我是否必须使用其他实现?我的目标是std :: cin/cout或python的打印/输入

我知道成绩单显示:,但这只涵盖了输出部分.

提前致谢!

Jay*_*ayK 8

从用户那里获得输入很简单,但不是那么模仿基于行的控制台.至少它比依赖GUI更麻烦,毕竟这不是那么慢和不方便.

最接近的输入相当于Transcript show::

UIManager default request: 'Title of the request'
Run Code Online (Sandbox Code Playgroud)

如果您标记此片段并"打印"或"检查它",您将看到一个提示对话框,可以在其中键入内容.当您接受带有OK或返回的对话框时,您将返回输入的String作为返回值request:.

得到十个数字可以这样做:

(1 to: 10) collect: [:each | (UIManager default request: 'Enter number ', each asString) asNumber ]
Run Code Online (Sandbox Code Playgroud)

结果将是输入数字的数组.

或者,不使用collect:和自己构建集合:

numbers := OrderedCollection new.
10 timesRepeat:
    [ numbers add: (UIManager default request: 'Enter next number') asNumber ].
numbers do: [:each | Transcript show: each ].
Run Code Online (Sandbox Code Playgroud)

你可能也喜欢UIManager default chooseFrom:.浏览UIManager类并尝试各种方法.


请注意,Pharo的游乐场(在大多数其他Smalltalks中称为工作空间)已经完成了REPL所做的工作,尽管它不仅限于基于行的输入.您可以键入Smalltalk表达式,评估它们并在那里打印结果.我知道这些信息并不能让您体验从C++移植计算器应用程序的经验.但我猜I/O的工作方式,或者说与用户的交互方式,并不是您尝试移植的程序的本质,对吧?所以你不妨写一个类Calculator,你在其中实现你的计算器应用程序,将String作为输入并返回结果数字,然后通过评估如下表达式从操场上调用它:

Calculator new calculate: '3 + 4'
Run Code Online (Sandbox Code Playgroud)

如果你真的,真的想坚持使用控制台的东西,并且错过了通常的Smalltalk IDE的好处以及学习和使用它的经验,那么使用GNU Smalltalk可能会更好.我认为有一些方法可以用Pharo创建控制台应用程序,但我不建议那些Smalltalk新手,我会把答案留给已经做过一次的人.