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

Smalltalk (Pharo) How to interface with the user simply

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

但是,我意识到我找不到一种简单的方法来从用户那里获取一些输入,例如我想创建一个带有 REPL 循环的控制台计算器,但我找不到在 Pharo 中执行此操作的方法。我不想要带按钮的图形用户界面,因为那既慢又不方便。

有人能告诉我如何在 Smalltalk 中做一些简单的事情吗,比如让用户输入 10 个数字或命令等?我必须使用不同的实现吗?我的目标是 std::cin/cout 或 python 的 print/input

我知道 Transcript show:,但这只涵盖了输出部分。

提前致谢!

从用户那里获取输入很容易,但模拟基于线路的控制台就没那么容易了。至少比依赖GUI要麻烦一些,毕竟不是那么慢和不方便。

最接近 Transcript show: 的输入是:

UIManager default request: 'Title of the request'

如果您标记此代码段并 "print it" 或 "inspect it",您将看到一个提示对话框并可以在其中输入内容。当您使用 OK 或 return 接受对话框时,您将获得输入的字符串作为 request:.

的 return 值

获取十个数字可以这样完成:

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

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

或者,不使用 collect: 并自行构建集合:

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

您可能也喜欢 UIManager default chooseFrom:。浏览 UIManager class 并尝试各种方法。


请注意,Pharo 的游乐场(在大多数其他 Smalltalk 中称为工作区)已经完成了 REPL 所做的工作,尽管它不限于基于行的输入。您可以键入 Smalltalk 表达式,计算它们并在那里打印结果。我知道此信息不会为您提供从 C++ 移植计算器应用程序的体验。但我想 I/O 的工作方式,或者更确切地说,与用户的交互,并不是您要移植的程序的本质,对吧?因此,您不妨编写一个 class Calculator,在其中实现您的计算器应用程序,将字符串作为输入并 returning 结果数字,然后通过以下方式从操场调用它评估如下表达式:

Calculator new calculate: '3 + 4'

如果您真的非常想坚持使用控制台的东西而错过了通常的 Smalltalk IDE 的好处以及学习和使用它的经验,那么使用 GNU Smalltalk 可能会更好。我认为也有一些方法可以使用 Pharo 创建控制台应用程序,但我不会向 Smalltalk 新手推荐这种方法,我会将这个答案留给已经做过一次的人。

您可以使用 Pharo 并像这样从终端获得即时反馈:

➜  ./pharo Pharo.image eval "6+5"               
11

无论你在这些引号之间有什么被编译器用作源,并且回答的对象将被打印到标准输出。在该示例中,它将在幕后使用 SmallInteger>>asString

对于制作 REPL,您不需要太多。如果你想看一下,我做了 REPLEndpoint using the Zinc HTTP server. In REPLEndpoint >> post 你会发现它使用你发送的要评估的片段的部分:

snippet := '6+5'.
answer := OpalCompiler new evaluate: snippet.
answer

并且 answer 将是您期望的 11 SmallInteger 实例。

有关如何基于命令行的 REPL 的更多提示,请查看 EvaluateCommandLineHandler class,因为它实现了 REPL 的基本步骤。