Используя скрип из оболочки
Вопрос
Могу ли я запустить Squeak как ref (без графического интерфейса), где я могу войти, и оценить выражения SmallTalk? Я знаю, что изображение по умолчанию не позволяйте этому. Есть ли какая-либо документация о том, как создать минимальное изображение, которое можно получить доступ из командной строки?
Решение
Вот (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
Теперь вы можете повеселиться с alltalk repl. Не забудьте ввести в команду:
Smalltalk snapshot:true andQuit:true
Если вы хотите сохранить ваши изменения.
Теперь, на объяснение этого решения: OSPROCESS - это пакет, который позволяет запускать другие процессы, читать из stdin и записывать на STDOUT и STDERR. Вы можете получить доступ к Stdout AttachableShileSeReStream с OSProcess thisOSProcess
(текущий процесс, ака Squeak).
Далее вы запускаете бесконечную петлю в UserBackgroundPriority (чтобы позволить другим процессам работать). В этой бесконечной петле вы используете Compiler evaluate:
Для выполнения ввода.
И вы запускаете это в скрипте с изображением без головы.
Другие советы
По состоянию на PHARO 2.0 (и 1,3 / 1.4 с фиксией, описанным ниже), больше нет необходимых взломов. Следующий фрагмент превратит ваше Vanilla Pharo Image на сервер 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.
Если вы хотите, чтобы изображение всегда было reft, поставьте код в #Startup: метод; В противном случае пропустите скрипт в командной строке, когда вы хотите, чтобы REPL MODE, как:
"/path/to/vm" -headless "/path/to/Pharo-2.0.image" "/path/to/gistfile1.st"
Проэкт http://www.squeaksource.com/securesqueak.html. Включает в себя пакет REP, который может обеспечить большую часть того, что вы ищете.