added read-exprs.ss script to ikarus.dev/lab
This commit is contained in:
		
							parent
							
								
									e21026c635
								
							
						
					
					
						commit
						c8eb73e987
					
				|  | @ -0,0 +1,71 @@ | |||
| #!/usr/bin/env scheme-script | ||||
| (import (ikarus) (ikarus system interrupts)) | ||||
| 
 | ||||
| (define (prompt-and-read-exprs p) | ||||
|   (define (read-lines ls) | ||||
|     (let ([p (open-input-string | ||||
|                (apply string-append (reverse ls)))]) | ||||
|       (let f ([ls '()]) | ||||
|         (let ([x (read p)]) | ||||
|           (cond | ||||
|             [(eof-object? x)  | ||||
|              (if (null? ls)  | ||||
|                  (eof-object)  | ||||
|                  (reverse ls))] | ||||
|             [else (f (cons x ls))]))))) | ||||
|   (define (read-lines-maybe ls) | ||||
|     (call/cc | ||||
|       (lambda (k) | ||||
|         (with-exception-handler  | ||||
|           (lambda (cn)  | ||||
|             (cond | ||||
|               [(interrupted-condition? cn)  | ||||
|                (raise-continuable cn)] | ||||
|               [else (k #f)])) | ||||
|            (lambda () | ||||
|              (read-lines ls)))))) | ||||
|   (display "> " (console-output-port)) | ||||
|   (let f ([lns '()]) | ||||
|     (let ([x (get-line p)]) | ||||
|       (cond | ||||
|         [(eof-object? x)  | ||||
|          (read-lines lns)] | ||||
|         [else | ||||
|          (let ([lns (cons x lns)]) | ||||
|            (or (read-lines-maybe lns) | ||||
|                (f lns)))])))) | ||||
| 
 | ||||
| (printf "Experimental prompt\n") | ||||
| (printf "This just echos the output pretty-printed\n\n") | ||||
| (let f () | ||||
|   (define (try k f) | ||||
|     (with-exception-handler | ||||
|       (lambda (cn) | ||||
|         (flush-output-port (current-error-port)) | ||||
|         (flush-output-port (current-output-port)) | ||||
|         (reset-input-port! (current-input-port)) | ||||
|         (newline (console-output-port)) | ||||
|         (unless (interrupted-condition? cn) | ||||
|           (fprintf (console-output-port)  | ||||
|             "Error while reading expression\n") | ||||
|           (print-condition cn (console-output-port))) | ||||
|         (k)) | ||||
|       f)) | ||||
|   (call/cc | ||||
|     (lambda (k)  | ||||
|       (let ([x | ||||
|              (try k | ||||
|                (lambda ()  | ||||
|                  (prompt-and-read-exprs | ||||
|                    (current-input-port))))]) | ||||
|         (cond | ||||
|           [(eof-object? x) | ||||
|            (newline (console-output-port)) | ||||
|            (exit)] | ||||
|           [else | ||||
|            (for-each  | ||||
|              (lambda (x) | ||||
|                (pretty-print x (console-output-port))) | ||||
|              x)])))) | ||||
|   (f)) | ||||
| 
 | ||||
		Loading…
	
		Reference in New Issue
	
	 Abdulaziz Ghuloum
						Abdulaziz Ghuloum