2010-06-18 5 views
25

Могу ли я запустить Squeak как REPL (без GUI), где я могу вводить и оценивать выражения Smalltalk? Я знаю, что изображение по умолчанию не позволяет этого. Есть ли какая-либо документация о том, как создать минимальное изображение, доступ к которому можно получить из командной строки?Использование Squeak из оболочки

ответ

12

Вот (хаком) решение: Во-первых, вам нужно 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: для выполнения ввода.

И вы запускаете это в сценарии с безголовым изображением.

7
+0

Это не отвечает на вопрос. Первая ссылка в основном не связана с вопросом. Второй вопрос - это вопрос о работе сервера. Но этот вопрос, как я понимаю, заключается в том, что он запускает Squeak как 'irb' или' python', чтобы он взаимодействовал с терминалом на stdin и stdout. –

0

Проект http://www.squeaksource.com/SecureSqueak.html включает в себя пакет REPL, который может обеспечить большую часть того, что вы ищете.

+0

О, и первая ссылка в ответе Фридриха включает ссылку на ExternalCommandShell, которая похожа на аналогичную функциональность. –

+0

Более подробную информацию о REPLServer от SecureSqueak можно найти по адресу http://gulik.pbworks.com/w/page/7760030/REPLServer. –

7

Начиная с версии 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"