I don't fully understand this. If you don't care about Termite portability (I'm not sure I do either) then wouldn't full integration with Gambit be the goal? Of so then why not finish up the remote ports bit?
Gambit's internal system uses macros to generate procedures quite a bit. This makes it sometimes tricky to wrap some of Gambit's functionality with another interface. Personally, I don't want any of Gambit's port procedures overridden. Make a new library of remote port procedures. I guess I don't see Termite as much of a 'language' as an extension to Gambit. It would be annoying, for several different debugging / testing reasons, if I couldn't access the real console or repl port. It seems clearer to have a level of code which works on abstract level and doesn't care whether things are happening remotely or locally (in which case it would always use the remote-* procedures), and also a lower level of code which does care and can rely on Gambit being left as is. Then you can just define a simple, clean remote-ports interface, and not worry about wrapping every single gambit function. Here's my current remote ports library. I also have a remote repl library which can start a Gambit repl on any Termite node that has the remote ports lib; if anyone wants it I can post it. Great to hear that your working on it Guillaume! It ;;;; Remote Ports ;;;; ;;;; TODO: Add support for bidirectional ports (declare (block) (standard-bindings) (extended-bindings)) ;; Remote Port Parameters (define current-remote-error-port (make-parameter (spawn-output-port (current-error-port)))) (define current-remote-input-port (make-parameter (spawn-input-port (current-input-port)))) (define current-remote-output-port (make-parameter (spawn-output-port (current-output-port)))) ;; Managing Remote Ports (define (make-remote-input-port port) (spawn-input-port port)) (define (make-remote-output-port port) (spawn-output-port port)) (define (remote-output-port? obj) (termite-output-port? obj)) (define (remote-input-port? obj) (termite-input-port? obj)) (define (close-remote-input-port proc) (! (termite-input-port-pid proc) (lambda (p) (close-input-port p) (halt!)))) (define (close-remote-output-port proc) (! (termite-output-port-pid proc) (lambda (p) (close-output-port p) (halt!)))) ;; Remote Input (define (remote-read #!optional (proc (current-remote-input-port))) (!? (termite-input-port-pid proc) read)) (define (remote-read-char #!optional (proc (current-remote-input-port))) (!? (termite-input-port-pid proc) read-char)) (define (remote-read-line #!optional (proc (current-remote-input-port))) (!? (termite-input-port-pid proc) read-line)) (define (remote-peek-char #!optional (proc (current-remote-input-port))) (!? (termite-input-port-pid proc) peek-char)) (define (remote-char-ready? #!optional (proc (current-remote-input-port))) (!? (termite-input-port-pid proc) char-ready?)) ;; Remote Output (define (remote-write obj #!optional (proc (current-remote-output-port))) (! (termite-output-port-pid proc) (lambda (p) (write obj p)))) (define (remote-display obj #!optional (proc (current-remote-output-port))) (! (termite-output-port-pid proc) (lambda (p) (display obj p)))) (define (remote-write-char obj #!optional (proc (current-remote-output-port))) (! (termite-output-port-pid proc) (lambda (p) (write-char obj p)))) (define (remote-pretty-print obj #!optional (proc (current-remote-output-port))) (! (termite-output-port-pid proc) (lambda (p) (pretty-print obj p)))) (define remote-pp remote-pretty-print) (define (remote-newline #!optional (proc (current-remote-output-port))) (! (termite-output-port-pid proc) (lambda (p) (newline p)))) (define (remote-force-output #!optional (proc (current-remote-output-port))) (! (termite-output-port-pid proc) (lambda (p) (force-output p)))) (define-macro (%%parse-output-args args) `(if (remote-output-port? (car rest)) (values (car rest) (cdr rest)) (values (current-remote-output-port) rest))) (define (remote-write-all . rest) (receive (port objs) (%%parse-output-args rest) (for-each (lambda (obj) (remote-write obj port)) objs))) (define (remote-display-all . rest) (receive (port objs) (%%parse-output-args rest) (for-each (lambda (obj) (remote-display obj port)) objs))) (define (remote-pretty-print-all . rest) (receive (port objs) (%%parse-output-args rest) (for-each (lambda (obj) (remote-pretty-print obj port)) objs))) (define remote-pp-all remote-pretty-print-all) -- James Long Coptix, Inc. longster@gmail.com