Можно ли запускать сценарии Smalltalk из командной строки?
Я нашел (возможно устаревшее и неправильное) сообщение в блоге 2004 года, в котором утверждалось, что невозможно запускать сценарии Smalltalk из командной строки. С тех пор что-нибудь изменилось, и можно ли запускать сценарии Smalltalk из командной строки? Я много занимался поиском в Google и вообще не нашел никакой информации по этой теме.
Есть ли способ сохранить скрипт Smalltalk (такой как этот) в виде файла, а затем запустить скрипт из командной строки?
Transcript show: 'This should be printed to the standard output.' printString; cr.
5 ответов
Pharo имеет приличную поддержку командной строки и простой скрипт zeroconf для его установки:
curl get.pharo.org | bash
./pharo Pharo.image --help
./pharo Pharo.image eval "1+2"
Мы регулярно используем эти инструменты на наших серверах ci.
Новые дескрипторы командной строки могут быть легко установлены путем создания подклассов. Вы найдете частичную документацию здесь.
Coral нацелен на более сложные интерфейсы и поддерживает разбор сложных параметров. Инструменты командной строки по умолчанию, поставляемые с Pharo, следуют довольно упрощенному подходу, и вам нужно проверять и обрабатывать параметры вручную.
С gst это просто. Поместите это в hi.st:
Transcript show: 'Hi!'
Тогда беги gst hi.st
и вы сделали.
Чтобы передать аргументы из командной строки, вы должны сделать следующее:
Transcript show: 'Hi ' , Smalltalk arguments first , '!'
Тогда беги gst hi.st -a World
Запуск скрипта из командной строки тривиален практически для любой версии Squeak, особенно 5.3 или новее.
В принципе
{path/to/myVM} {path/to/myscript}
Этот аргумент myscript может быть URL-адресом, указывающим на файл кода smalltalk, или просто именем файла. Поскольку Smalltalk может считывать как код для установки, так и код для запуска непосредственно из файла, вы можете добавить какой-нибудь новый код — считайте его «функциями сценария», если хотите, — а затем запускать все, что хотите. Итак, по крайней мере, на машине unix вы можете создать сценарий оболочки, который запускает вашу виртуальную машину и добавляет имя файла вашего предполагаемого сценария, и, таким образом, делает что-то вроде
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-файлы своим собственным эквивалентом #! токен.
Немногое изменилось, это сообщение в блоге сейчас еще более неверно, чем было тогда. Теперь у нас есть настоящая виртуальная машина без головы и образ в Pharo, и мы можем создавать образы гораздо меньшего размера, загружая их только с необходимыми классами.
gst - <<<"'hello' printNl"
Это универсальный шаблон для предоставления скрипта в командной строке. Это называется здесь строкой. Тире устанавливает имя файла для стандартного ввода. И Triple меньше, чем делает следующую строку на месте файла на стандартном в. Вы по-прежнему получаете расширение параметра командной строки.
Здесь вы можете получить гораздо больше удовольствия от документов, которые позволяют вводить многострочные команды в сценарии или прямо в командной строке с удвоенным значением меньше, чем.