; csc -s readline.scm -L -lreadline -L -ltermcap (declare (unit readline) (usual-integrations) (foreign-declare #< #include #include static char *readline_buf = NULL; EOF )) ; Initialise the history library. ((foreign-lambda void "using_history")) (define gnu-readline (foreign-lambda* c-string ((c-string prompt)) "if (readline_buf != NULL) {" " free(readline_buf);" " readline_buf = NULL;" "}" "readline_buf = readline(prompt);" "if (readline_buf != NULL) {" " add_history(readline_buf);" "}" "return(readline_buf);")) (define gnu-readline-clear-history (foreign-lambda void "clear_history")) (define (make-gnu-readline-port prompt) (let ((buffer "") (pos 0)) (letrec ((char-ready? (lambda () (< pos (string-length buffer)))) (get-next-char! (lambda () (cond ((not buffer) (end-of-file)) ((char-ready?) (let ((ch (string-ref buffer pos))) (set! pos (+ pos 1)) ch)) (else (set! pos 0) (set! buffer (gnu-readline prompt)) (if (string? buffer) (set! buffer (string-append buffer "\n"))) (get-next-char!)))))) (make-input-port get-next-char! char-ready? (lambda () 'closed-gnu-readline-port)))))