26

我可以将 Squeak 作为 REPL(无 GUI)启动,我可以在其中输入和评估 Smalltalk 表达式吗?我知道默认图像不允许这样做。是否有关于如何构建可以从命令行 shell 访问的最小映像的文档?

4

4 回答 4

15

这是一个(hackish)解决方案:首先,您需要 OSProcess,所以在工作区中运行它:

Gofer new squeaksource:'OSProcess'; package:'OSProcess';load.

接下来,将其放入文件 repl.st 中:

OSProcess thisOSProcess stdOut 
  nextPutAll: 'Welcome to the simple Smalltalk REPL'; 
  nextPut: Character lf; nextPut: $>; flush.
[ |input|
  [ input := OSProcess readFromStdIn.
    input size > 0 ifTrue: [
      OSProcess thisOSProcess stdOut 
        nextPutAll: ((Compiler evaluate: input) asString; 
        nextPut: Character lf; nextPut: $>; flush 
    ]
  ] repeat.
]forkAt: (Processor userBackgroundPriority)

最后,运行以下命令:

squeak -headless path/to/squeak.image /absolute/path/to/repl.st

您现在可以享受 Smalltalk REPL 的乐趣。不要忘记输入命令:

Smalltalk snapshot:true andQuit:true

如果要保存更改。

现在,解释这个解决方案:OSProcess 是一个允许运行其他进程、从标准输入读取、写入标准输出和标准错误的包。您可以使用OSProcess thisOSProcess(当前进程,又名 squeak)访问标准输出 AttachableFileStream。

接下来,您在 userBackgroundPriority 上运行一个无限循环(让其他进程运行)。在这个无限循环中,您使用Compiler evaluate:执行输入。

然后你在一个带有无头图像的脚本中运行它。

于 2011-05-24T09:00:21.840 回答
8

从 Pharo 2.0(和 1.3/1.4 以及下面描述的修复程序)开始,不再需要 hack。以下代码段会将您的原版 Pharo 图像转换为 REPL 服务器...

来自https://gist.github.com/2604215

"Works out of the box in Pharo 2.0. For prior versions (definitely works in 1.3 and 1.4), first file in https://gist.github.com/2602113"

| command |
[
    command := FileStream stdin nextLine.
    command ~= 'exit' ] whileTrue: [ | result |
        result := Compiler evaluate: command.
        FileStream stdout nextPutAll: result asString; lf ].

Smalltalk snapshot: false andQuit: true.

如果您希望图像始终是 REPL,请将代码放在 #startup: 方法中;否则,当您需要 REPL 模式时,请在命令行中传递脚本,例如:

"/path/to/vm" -headless "/path/to/Pharo-2.0.image" "/path/to/gistfile1.st"
于 2012-05-23T14:27:19.273 回答
7

请访问: http: //map.squeak.org/package/2c3b916b-75e2-455b-b25d-eba1bbc94b84在没有 GUI 的服务器上运行 Smalltalk?

于 2010-06-18T06:50:36.560 回答
0

该项目http://www.squeaksource.com/SecureSqueak.html包含一个 REPL 包,它可以提供您正在寻找的大部分内容。

于 2011-05-19T14:37:33.557 回答