O armazenamento em buffer será um problema, pois scala
pode usar o buffer baseado em blocos por causa do pipe (em vez do buffer padrão baseado em linha de terminal, veja setvbuf(3)
) e também buffering feito por sed
(ou qualquer outra coisa no pipeline). Você poderia tentar colocar stdbuf
em tudo, lançar portabilidade e rezar para que esses LD_PRELOAD
monkey patches funcionem; outra opção seria executar o REPL sob um PTY, alimentar a entrada do usuário para isso e substituir a saída antes de enviá-la. Isso aqui mostra a SBCL como scala
estava deliciosamente não funcional na minha máquina.
$ ./mochanichize sbcl
This is SBCL 1.3.20, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.
SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses. See the CREDITS and COPYING files in the
distribution for more information.
* (print "Java")
"Mocha"
"Mocha"
* (exit)
$
E o código para mochanichize
.
#!/usr/bin/env expect
package require Tcl 8.5
proc mochanichize {fh} {
global godot
set somedata [read $fh]
if {[eof $fh]} { close $fh; set godot 1; return; }
regsub -all {\mJava\M} $somedata {Mocha} somedata
puts -nonewline $somedata
}
proc sendtoprog {from to} {
# TODO support ^D but that's more complicated
puts -nonewline $to [read $from]
}
# no echo on PTY command we're running (soas not to duplicate what is
# echo'd back to the user via the user tty)
set stty_init -echo
if {[catch {spawn -noecho {*}$argv} err]} { puts stderr $err; exit 1 }
chan configure $spawn_id -blocking 0 -buffersize 1
chan event $spawn_id readable [list mochanichize $spawn_id]
chan configure stdin -blocking 0 -buffersize 1
chan configure stdout -blocking 0 -buffersize 1
chan event stdin readable [list sendtoprog stdin $spawn_id]
# TODO better handle ^Z this goes all meh on it
trap SIG_IGN SIGTSTP
vwait godot