18

我发现 2004 年的一篇(可能已过时且不正确)博客文章声称无法从命令行运行 Smalltalk 脚本。从那以后有什么变化吗?是否可以从命令行运行 Smalltalk 脚本?我做了很多谷歌搜索,我根本没有找到关于这个主题的信息。

有没有办法将 Smalltalk 脚本(例如这个)保存为文件,然后从命令行运行脚本?

Transcript show: 'This should be printed to the standard output.' printString; cr.
4

5 回答 5

17

Pharo has decent command line support and a simple zeroconf script to install it:

curl get.pharo.org | bash
./pharo Pharo.image --help
./pharo Pharo.image eval "1+2"

We use these tools on a regular basis on our ci servers.

New command line handles can be installed easily by subclassing. You will find a partial documentation here.

Coral aims at more complex interfaces and supports complex parameter parsing. The default command line tools shipped with Pharo follow a rather simplistic approach and you have to check and process parameters manually.

于 2013-06-23T09:29:55.833 回答
12

使用 gst,这很简单。将其放入 hi.st:

Transcript show: 'Hi!'

然后运行gst hi.st,你就完成了。

要从命令行传递参数,请执行以下操作:

Transcript show: 'Hi ' , Smalltalk arguments first , '!'

然后运行gst hi.st -a World

于 2013-06-23T10:45:48.987 回答
0
gst - <<<"'hello' printNl"

这是在命令行上提供脚本的通用模式。它被称为here字符串。破折号将文件名设置为标准输入,三倍小于使以下字符串成为标准输入的就地文件。您仍然可以获得命令行参数扩展。

您可以通过此处的文档获得更多乐趣,这些文档可让您在脚本中输入多行命令,或者直接在命令行中输入双倍小于。

这里的文档可以移植到任何 Bourne shell;这里的字符串是一个 Bash 扩展。

于 2013-11-05T19:53:45.473 回答
0

没有太大变化,那篇博文现在比当时更错误。现在我们在 Pharo 中有一个真正的无头虚拟机和图像,我们可以通过仅使用所需的类引导它们来制作更小的图像。

于 2020-09-11T13:23:35.583 回答
0

从命令行运行脚本对于几乎任何 Squeak 版本都是微不足道的,当然是 5.3 或更高版本。

基本上 {path/to/myVM} {path/to/myscript}

myscript 参数可以是指向 smalltalk 代码文件的 URL,也可以是简单的文件名。由于 Smalltalk 可以读取要安装的代码和直接从文件运行的代码,因此您可以添加一些新代码 - 如果您愿意,可以将其视为“脚本函数” - 然后运行您想要的任何内容。因此,至少在 unix 机器上,您可以制作一个运行您的虚拟机并附加您预期脚本的文件名的 shell 脚本,从而执行类似的操作 myshellscript mystuff.st

例如,考虑一个脚本来计算和打印第一个需要一百万位数字的斐波那契数。

#!/usr/bin/squeak /home/pi/Squeak/Squeak5.3-18560.image

!Integer methodsFor: 'mathematical functions' stamp: 'tpr 5/6/2019 12:22'!
fibonacci
"derived from https://www.nayuki.io/page/fast-fibonacci-algorithms"
"(1 to: 20) collect:[:i| i fastDoublingFib]"
"testing a quite large one - "
"8577 fibonacci= 13724780954457889052017147206983806244049002655849289934662148526555403650297300643609932653364630032094175733360509578504423049114004867523161091564824674600978308740378989479162611031273424686573759784740689516901416473328655422390895971263265867635819510949686102571388751758998017349379498918930220900180038324615253426530740473855269056304380498630108126734047701362218655030270360608989081398866489746698916626888016696892691933237089180504631788915650757757515944644732966345269202761471025651071790297611079540881155092137592980230998234868586211881093892491570520577408961869977892273540956424095750855208529072246641778982103984467921868950012668004047986803017482248992968482737462668300684879633714025755790485860328854796518843956263863014632532331145699658530054942590047273403691531821918862996422405159427262092477196755988981309029424760342802374213122162727840557722145891090413688461745240415668189577836068480363407847582529735341950500636735281963089675493707159434777756081146452522323681782226760627277553296721358921412115264845467834979154061137421532609247762981818564578019888974692581079593575783553856910367568474613323528337733872069223030834774749130478360574004172522316484339530942110067893000847800932306298725285623628731149337468217751734165148732164148285915275115006479682658150442259002271790547596033006363411193653337536041106069912826015502035140618407668385378737477702597473151509972754111640855347958033314453349633268543893894677097708945041254623018915871109789412793709229204261914803477697183287924195770678873001065036313926288444791424871512110658175954743584548831946767673488152740675550518235698898217693311515366329280005757014637854214769152690638778904780724293185353992279724740604674926819294787586671833537117545443846365508358918882"
    | a b c |
    a :=  0.
    b := 1.
    self highBit to: 1 by: -1 do:[:i||d e|
        d := ((b bitShift: 1) - a) * a.
        e := a squared + b squared.
        a := d.
        b := e.
        (self bitAt: i) = 1  ifTrue:[
            c := a + b.
            a := b.
            b := c]
        ].
    ^a! !


| t f|
t:= [f := 4784969 fibonacci] timeToRun.
FileStream stdout
    nextPutAll: 'fib(4784969) = '; 
    "nextPutAll: f asString; "
    cr; 
    nextPutAll: 'time = '; 
    nextPutAll: t asString; 
    nextPutAll: ' mS'; 
    cr.
Smalltalk snapshot: false andQuit: true

如果您保存它并将其设置为可执行,则第一行将运行脚本(这是来自 Raspberry Pi 并且 /usr/bin/squeak 是发行版的标准部分),并将脚本名称作为参数。它加载了一些代码来实现一个有趣的聪明算法,运行测试,输出到标准输出,最后退出。在 Pi 4 上大约需要 3 秒。现在只需运行 .st 文件即可 - ./myscript

显然,也可以做一些巧妙的技巧并使用 binfmt_misc 工具注册一个魔术模式,这样就可以使 st 文件有自己的 #! 令牌。

于 2022-02-15T02:30:22.607 回答