Могу ли я запустить Squeak как REPL (без GUI), где я могу вводить и оценивать выражения Smalltalk? Я знаю, что изображение по умолчанию не позволяет этого. Есть ли какая-либо документация о том, как создать минимальное изображение, доступ к которому можно получить из командной строки?Использование Squeak из оболочки
ответ
Вот (хаком) решение: Во-первых, вам нужно OSProcess, поэтому запустите в Workspace:
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 РЕПЛ. Не забудьте набрать следующую команду:
Smalltalk snapshot:true andQuit:true
, если вы хотите сохранить изменения.
Теперь, на объяснение этого решения: OSProcess - это пакет, который позволяет запускать другие процессы, читать с stdin и писать на stdout и stderr. Вы можете получить доступ к stdout AttachableFileStream с помощью OSProcess thisOSProcess
(текущий процесс, ака-скрип).
Затем вы запускаете бесконечный цикл в userBackgroundPriority (чтобы другие процессы выполнялись). В этом бесконечном цикле вы используете Compiler evaluate:
для выполнения ввода.
И вы запускаете это в сценарии с безголовым изображением.
Проект http://www.squeaksource.com/SecureSqueak.html включает в себя пакет REPL, который может обеспечить большую часть того, что вы ищете.
О, и первая ссылка в ответе Фридриха включает ссылку на ExternalCommandShell, которая похожа на аналогичную функциональность. –
Более подробную информацию о REPLServer от SecureSqueak можно найти по адресу http://gulik.pbworks.com/w/page/7760030/REPLServer. –
Начиная с версии Pharo 2.0 (и 1.3/1.4 с исправлением, описанным ниже), больше нет необходимости в хаке. Следующий фрагмент превратит ваш ванильный 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.
Если вы хотите, чтобы изображение всегда быть РЕПЛ, поместите код в #startup: метод ; в противном случае передайте сценарий в командной строке, если вы хотите использовать режим REPL, например:
"/path/to/vm" -headless "/path/to/Pharo-2.0.image" "/path/to/gistfile1.st"
Это не отвечает на вопрос. Первая ссылка в основном не связана с вопросом. Второй вопрос - это вопрос о работе сервера. Но этот вопрос, как я понимаю, заключается в том, что он запускает Squeak как 'irb' или' python', чтобы он взаимодействовал с терминалом на stdin и stdout. –