ejemplos smalltalk squeak pharo

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.