smalltalk - ejemplos - Usando Squeak desde una cáscara
smalltalk pdf (4)
A partir de Pharo 2.0 (y 1.3 / 1.4 con el arreglo descrito a continuación), no hay más hacks necesarios. El siguiente fragmento convertirá tu imagen Pharo de vainilla en un servidor REPL ...
Desde 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.
Si desea que la imagen sea siempre una REPL, coloque el código en un método #startup:; de lo contrario, pase el script en la línea de comando cuando desee el modo REPL, como:
"/path/to/vm" -headless "/path/to/Pharo-2.0.image" "/path/to/gistfile1.st"
¿Puedo lanzar Squeak como REPL (sin GUI), donde puedo ingresar y evaluar expresiones Smalltalk? Sé que la imagen por defecto no permite esto. ¿Existe alguna documentación sobre cómo crear una imagen mínima a la que se pueda acceder desde un shell de línea de comandos?
Aquí hay una solución (pirata): primero, necesita OSProcess, así que ejecute esto en un área de trabajo:
Gofer new squeaksource:''OSProcess''; package:''OSProcess'';load.
A continuación, ponga esto en el archivo 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)
Y por último, ejecute este comando:
squeak -headless path/to/squeak.image /absolute/path/to/repl.st
Ahora puedes divertirte con un Smalltalk REPL. No te olvides de escribir en el comando:
Smalltalk snapshot:true andQuit:true
Si quieres guardar tus cambios.
Ahora, en la explicación de esta solución: OSProcess es un paquete que permite ejecutar otros procesos, leer desde stdin y escribir en stdout y stderr. Puede acceder a stdout OSProcess thisOSProcess
con OSProcess thisOSProcess
(el proceso actual, también conocido como squeak).
A continuación, ejecuta un bucle infinito en userBackgroundPriority (para permitir que se ejecuten otros procesos). En este bucle infinito, usas Compiler evaluate:
para ejecutar la entrada.
Y ejecutas esto en un script con una imagen sin cabeza.
El proyecto http://www.squeaksource.com/SecureSqueak.html incluye un paquete REPL que puede proporcionar gran parte de lo que está buscando.