scsh-0.5/debug/mini-command.scm

66 lines
1.8 KiB
Scheme

; Copyright (c) 1993, 1994 Richard Kelsey and Jonathan Rees. See file COPYING.
; Miniature command processor.
(define (command-processor ignore args)
(let ((in (current-input-port))
(out (current-output-port))
(batch? (member "batch" args)))
(let loop ()
((call-with-current-continuation
(lambda (go)
(with-handler
(lambda (c punt)
(cond ((or (error? c) (interrupt? c))
(display-condition c out)
(go (if batch?
(lambda () 1)
loop)))
((warning? c)
(display-condition c out))
(else (punt))))
(lambda ()
(if (not batch?) (display "- " out))
(let ((form (read in)))
(cond ((eof-object? form)
(newline out)
(go (lambda () 0)))
((and (pair? form) (eq? (car form) 'unquote))
(case (cadr form)
((load)
(mini-load in)
(go loop))
((go)
(let ((form (read in)))
(go (lambda ()
(eval form (interaction-environment))))))
(else (error "unknown command" (cadr form)))))
(else
(call-with-values
(lambda () (eval form (interaction-environment)))
(lambda results
(for-each (lambda (result)
(write result out)
(newline out))
results)
(go loop))))))))))))))
(define (mini-load in)
(let ((c (peek-char in)))
(cond ((char=? c #\newline) (read-char in) #t)
((char-whitespace? c) (read-char in) (mini-load in))
(else
(let ((filename (read-string in char-whitespace?)))
(load filename)
(mini-load in))))))
(define (read-string port delimiter?)
(let loop ((l '()) (n 0))
(let ((c (peek-char port)))
(cond ((or (eof-object? c)
(delimiter? c))
(list->string (reverse l)))
(else
(loop (cons (read-char port) l) (+ n 1)))))))