Использование Squeak из оболочки - PullRequest
25 голосов
/ 18 июня 2010

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

Ответы [ 4 ]

14 голосов
/ 24 мая 2011

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

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

8 голосов
/ 23 мая 2012

Начиная с 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:; в противном случае передайте сценарий в командной строке, когда вы хотите режим REPL, например:

"/path/to/vm" -headless "/path/to/Pharo-2.0.image" "/path/to/gistfile1.st"
7 голосов
/ 18 июня 2010
0 голосов
/ 19 мая 2011

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

...