#!/usr/local/bin/csi -quiet
; -*- scheme -*-

(require 'multiplex)

(define plex (multiplexor:setup 'raw))

(define ##sys#read-prompt-hook
  (let ((display display))
    (lambda () (display ">>> ")) ) )

(define ##sys#repl-eval-hook
  (lambda (exp)
    (call-with-current-continuation
     (lambda (return)
       (with-exception-handler
	(lambda (exn)
	  (print exn)
	  (let loop ((l (##sys#slot exn 2)))
	    (unless (null? l)
		    (print (car l) ": " (cadr l))
		    (loop (cddr l))))
	  (return (begin)))
	(lambda ()
	  (eval exp)))))))

(define (server)
  (call-with-current-continuation
   (lambda (escape)
     (with-exception-handler
      escape
      read-eval-print-loop))))

(run-tcp-server #f 9090
		(lambda (in out addr)
		  (print "Got connection from " addr)
		  (with-input-from-port in
		    (lambda ()
		      (with-output-to-port out
			(lambda ()
			  (thread-start! (make-thread server)))))))
		#:reuse? #t
		#:suspender (multiplexor-blocker plex))
