Подтвердить что ты не робот

Использование Squeak из оболочки

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

4b9b3361

Ответ 1

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

Теперь вы можете получать удовольствие от Smalltalk REPL. Не забудьте ввести команду:

Smalltalk snapshot:true andQuit:true

если вы хотите сохранить свои изменения.

Теперь, на объяснение этого решения: OSProcess - это пакет, который позволяет запускать другие процессы, читать из stdin и писать в stdout и stderr. Вы можете получить доступ к stdout AttachableFileStream с помощью OSProcess thisOSProcess (текущий процесс, ака скрипка).

Затем вы запускаете бесконечный цикл в userBackgroundPriority (чтобы другие процессы выполнялись). В этом бесконечном цикле вы используете Compiler evaluate: для выполнения ввода.

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

Ответ 3

Начиная с 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.

Если вы хотите, чтобы изображение всегда было REPL, поместите код в метод #startup:; в противном случае передайте script в командной строке, когда вы хотите использовать режим REPL, например:

"/path/to/vm" -headless "/path/to/Pharo-2.0.image" "/path/to/gistfile1.st"