WindowsのDOS窓は無理だけど。
(import (sagittarius vm)
(sagittarius vm debug)
(sagittarius interactive))
(cond-expand
((not windows)
;; colouring
(define-syntax with-color
(lambda (x)
(syntax-case x ()
((_ color expr more ...)
;; on emacs it's useless.
(if (getenv "EMACS")
#'(begin expr more ...)
#'(dynamic-wind
(lambda () (display color))
(lambda () expr more ...)
(lambda () (display "\x1b;[m"))))))))
(define-syntax with-color-red
(lambda (x)
(syntax-case x ()
((_ expr more ...)
#'(with-color "\x1b;[1;31m" expr more ...)))))
(define-syntax with-bold
(lambda (x)
(syntax-case x ()
((_ expr more ...)
#'(with-color "\x1b;[1m" expr more ...)))))
(define (printw . args) (for-each write/ss args) (newline))
(current-printer (lambda args
(with-bold
(for-each printw args))))
(current-exception-printer
(lambda (c)
(define (print-stack-trace)
(let* ((stack (get-stack-trace-object))
;; skip the first get-stack-trace-object itself
;; and print-stack-trace
;; the last 2 are always evel and #f so skipt it as well
(interesting (if (null? stack) stack (cddr (reverse! (cddr stack))))))
(unless (null? interesting)
(print "stack trace:")
(do ((i 0 (+ i 1))
(stack interesting (cdr stack)))
((or (= i 20) (null? stack)))
(let* ((record (car stack))
(index (- (car record) 2))
(proc (caddr record))
(tmp (cadddr record)))
(format #t " [~a] ~a~%" index proc)
(when (and tmp (not (null? tmp)))
(let* ((src (last-pair tmp))
(info (source-info (cdar src))))
(display " src: ")
(let ((s (call-with-string-output-port
(lambda (o)
(write/ss (unwrap-syntax (cdar src)) o)))))
(if (> (string-length s) 50)
(print (substring s 0 50) " ...")
(print s)))
(when info
(format #t " ~s:~a~%" (car info) (cdr info))))))))))
(with-color-red
(print (describe-condition c)))
(print-stack-trace)))
(current-prompter (lambda () (with-color "\x1b;[32m" (display "sash> "))))
)
(else #f))
これだけだとつまらないので、一応0.3.4から入った機能。「.sashrc」というファイルを$HOMEに置いて上記のソースを書いておけばREPL起動時に勝手に読み込んでくれる。このファイルはREPLだけが読み込むので、スクリプトでは無駄なライブラリのロードは起きない。
No comments:
Post a Comment