* (ikarus writer) is now ok.
This commit is contained in:
		
							parent
							
								
									b425bc58cb
								
							
						
					
					
						commit
						7aa407b6cd
					
				
							
								
								
									
										
											BIN
										
									
								
								src/ikarus.boot
								
								
								
								
							
							
						
						
									
										
											BIN
										
									
								
								src/ikarus.boot
								
								
								
								
							
										
											Binary file not shown.
										
									
								
							| 
						 | 
				
			
			@ -1,13 +1,21 @@
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
(library (ikarus writer)
 | 
			
		||||
  (export)
 | 
			
		||||
  (import (scheme))
 | 
			
		||||
  (export write display format printf print-error error-handler
 | 
			
		||||
          error)
 | 
			
		||||
  (import 
 | 
			
		||||
    (only (scheme) $fixnum->char $char->fixnum $char= $char<= 
 | 
			
		||||
          $fx= $fx>= $fx+ $fxadd1 $car $cdr $forward-ptr?
 | 
			
		||||
          $unbound-object?
 | 
			
		||||
          $string-length $string-ref)
 | 
			
		||||
    (except (ikarus) write display format printf print-error
 | 
			
		||||
            error-handler error))
 | 
			
		||||
 | 
			
		||||
  (define char-table ; first nonprintable chars
 | 
			
		||||
    '#("nul" "soh" "stx" "etx" "eot" "enq" "ack" "bel" "bs" "tab" "newline"
 | 
			
		||||
       "vt" "ff" "return" "so" "si" "dle" "dc1" "dc2" "dc3" "dc4" "nak" 
 | 
			
		||||
       "syn" "etb" "can" "em" "sub" "esc" "fs" "gs" "rs" "us" "space"))
 | 
			
		||||
 | 
			
		||||
  (define write-character
 | 
			
		||||
    (lambda (x p m)
 | 
			
		||||
      (if m 
 | 
			
		||||
| 
						 | 
				
			
			@ -28,6 +36,7 @@
 | 
			
		|||
              (write-char #\x p)
 | 
			
		||||
              (write-fixnum i p)]))
 | 
			
		||||
          (write-char x p))))
 | 
			
		||||
 | 
			
		||||
  (define write-list
 | 
			
		||||
    (lambda (x p m h i)
 | 
			
		||||
      (cond
 | 
			
		||||
| 
						 | 
				
			
			@ -43,6 +52,7 @@
 | 
			
		|||
        (write-char #\. p)
 | 
			
		||||
        (write-char #\space p)
 | 
			
		||||
        (writer x p m h i)])))
 | 
			
		||||
 | 
			
		||||
  (define write-vector
 | 
			
		||||
    (lambda (x p m h i)
 | 
			
		||||
      (write-char #\# p)
 | 
			
		||||
| 
						 | 
				
			
			@ -62,6 +72,7 @@
 | 
			
		|||
                 [else i])])
 | 
			
		||||
           (write-char #\) p)
 | 
			
		||||
           i))))
 | 
			
		||||
 | 
			
		||||
  (define write-record
 | 
			
		||||
    (lambda (x p m h i)
 | 
			
		||||
      (write-char #\# p)
 | 
			
		||||
| 
						 | 
				
			
			@ -77,32 +88,40 @@
 | 
			
		|||
               (write-char #\space p)
 | 
			
		||||
               (f (fxadd1 idx) 
 | 
			
		||||
                  (writer (record-ref x idx) p m h i))]))))))
 | 
			
		||||
  
 | 
			
		||||
  (define initial?
 | 
			
		||||
    (lambda (c)
 | 
			
		||||
      (or (letter? c) (special-initial? c))))
 | 
			
		||||
  
 | 
			
		||||
  (define letter?
 | 
			
		||||
    (lambda (c)
 | 
			
		||||
      (or (and ($char<= #\a c) ($char<= c #\z))
 | 
			
		||||
          (and ($char<= #\A c) ($char<= c #\Z)))))
 | 
			
		||||
  
 | 
			
		||||
  (define digit?
 | 
			
		||||
    (lambda (c)
 | 
			
		||||
      (and ($char<= #\0 c) ($char<= c #\9))))
 | 
			
		||||
  
 | 
			
		||||
  (define special-initial? 
 | 
			
		||||
    (lambda (x)
 | 
			
		||||
      (memq x '(#\! #\$ #\% #\& #\* #\/ #\: #\< #\= #\> #\? #\^ #\_ #\~))))
 | 
			
		||||
  
 | 
			
		||||
  (define subsequent?
 | 
			
		||||
    (lambda (x)
 | 
			
		||||
      (or (initial? x)
 | 
			
		||||
          (digit? x)
 | 
			
		||||
          (special-subsequent? x))))
 | 
			
		||||
  
 | 
			
		||||
  (define special-subsequent?
 | 
			
		||||
    (lambda (x) 
 | 
			
		||||
      (memq x '(#\+ #\- #\. #\@))))
 | 
			
		||||
  
 | 
			
		||||
  (define subsequent*?
 | 
			
		||||
    (lambda (str i n)
 | 
			
		||||
      (or ($fx= i n)
 | 
			
		||||
          (and (subsequent? ($string-ref str i))
 | 
			
		||||
               (subsequent*? str ($fxadd1 i) n)))))
 | 
			
		||||
  
 | 
			
		||||
  (define valid-symbol-string?
 | 
			
		||||
    (lambda (str)
 | 
			
		||||
      (define normal-symbol-string?
 | 
			
		||||
| 
						 | 
				
			
			@ -133,11 +152,13 @@
 | 
			
		|||
            (write-char #\\ p))
 | 
			
		||||
          (write-char c p))
 | 
			
		||||
        (write-symbol-esc-loop x ($fxadd1 i) n p))))
 | 
			
		||||
  
 | 
			
		||||
  (define write-symbol-esc
 | 
			
		||||
    (lambda (x p)
 | 
			
		||||
      (write-char #\| p)
 | 
			
		||||
      (write-symbol-esc-loop x 0 ($string-length x) p)
 | 
			
		||||
      (write-char #\| p)))
 | 
			
		||||
  
 | 
			
		||||
  (define write-symbol
 | 
			
		||||
    (lambda (x p m)
 | 
			
		||||
      (let ([str (symbol->string x)])
 | 
			
		||||
| 
						 | 
				
			
			@ -146,6 +167,7 @@
 | 
			
		|||
                (write-char* str p)
 | 
			
		||||
                (write-symbol-esc str p))
 | 
			
		||||
            (write-char* str p)))))
 | 
			
		||||
  
 | 
			
		||||
  (define write-gensym
 | 
			
		||||
    (lambda (x p m h i)
 | 
			
		||||
      (cond
 | 
			
		||||
| 
						 | 
				
			
			@ -173,6 +195,7 @@
 | 
			
		|||
        [else 
 | 
			
		||||
         (write-symbol x p m)
 | 
			
		||||
         i])))
 | 
			
		||||
  
 | 
			
		||||
  (define write-string-escape
 | 
			
		||||
    (lambda (x p)
 | 
			
		||||
      (define loop 
 | 
			
		||||
| 
						 | 
				
			
			@ -198,11 +221,13 @@
 | 
			
		|||
      (write-char #\" p)
 | 
			
		||||
      (loop x 0 (string-length x) p)
 | 
			
		||||
      (write-char #\" p)))
 | 
			
		||||
  
 | 
			
		||||
  (define write-string
 | 
			
		||||
    (lambda (x p m)
 | 
			
		||||
      (if m
 | 
			
		||||
          (write-string-escape x p)
 | 
			
		||||
          (write-char* x p))))
 | 
			
		||||
  
 | 
			
		||||
  (define write-fixnum
 | 
			
		||||
    (lambda (x p)
 | 
			
		||||
      (define loop
 | 
			
		||||
| 
						 | 
				
			
			@ -222,6 +247,7 @@
 | 
			
		|||
            (write-char* "536870912" p)
 | 
			
		||||
            (loop (fx- 0 x) p))]
 | 
			
		||||
       [else (loop x p)])))
 | 
			
		||||
  
 | 
			
		||||
  (define write-char*
 | 
			
		||||
    (lambda (x p)
 | 
			
		||||
      (define loop 
 | 
			
		||||
| 
						 | 
				
			
			@ -230,6 +256,7 @@
 | 
			
		|||
           (write-char (string-ref x i) p)
 | 
			
		||||
           (loop x (fxadd1 i) n p)))) 
 | 
			
		||||
      (loop x 0 (string-length x) p)))
 | 
			
		||||
  
 | 
			
		||||
  (define macro
 | 
			
		||||
    (lambda (x)
 | 
			
		||||
      (define macro-forms
 | 
			
		||||
| 
						 | 
				
			
			@ -244,6 +271,7 @@
 | 
			
		|||
             (and (pair? d)
 | 
			
		||||
                  (null? ($cdr d))))
 | 
			
		||||
           (assq ($car x) macro-forms))))
 | 
			
		||||
  
 | 
			
		||||
  (define write-pair
 | 
			
		||||
    (lambda (x p m h i)
 | 
			
		||||
      (write-char #\( p)
 | 
			
		||||
| 
						 | 
				
			
			@ -251,16 +279,19 @@
 | 
			
		|||
        (let ([i (write-list (cdr x) p m h i)])
 | 
			
		||||
          (write-char #\) p)
 | 
			
		||||
          i))))
 | 
			
		||||
  
 | 
			
		||||
  (define write-ref
 | 
			
		||||
    (lambda (n p)
 | 
			
		||||
      (write-char #\# p)
 | 
			
		||||
      (write-fixnum (fx- -1 n) p)
 | 
			
		||||
      (write-char #\# p)))
 | 
			
		||||
  
 | 
			
		||||
  (define write-mark
 | 
			
		||||
    (lambda (n p)
 | 
			
		||||
      (write-char #\# p)
 | 
			
		||||
      (write-fixnum (fx- -1 n) p)
 | 
			
		||||
      (write-char #\= p)))
 | 
			
		||||
  
 | 
			
		||||
  (define write-shareable
 | 
			
		||||
    (lambda (x p m h i k)
 | 
			
		||||
      (cond
 | 
			
		||||
| 
						 | 
				
			
			@ -278,6 +309,7 @@
 | 
			
		|||
                (write-mark i p)
 | 
			
		||||
                (k x p m h i))]))]
 | 
			
		||||
        [else (k x p m h i)])))
 | 
			
		||||
  
 | 
			
		||||
  (define writer
 | 
			
		||||
    (lambda (x p m h i)
 | 
			
		||||
      (cond
 | 
			
		||||
| 
						 | 
				
			
			@ -419,13 +451,13 @@
 | 
			
		|||
      (hasher x h)
 | 
			
		||||
      (writer x p #t h 0))
 | 
			
		||||
    (flush-output-port p))
 | 
			
		||||
  ;;;
 | 
			
		||||
  
 | 
			
		||||
  (define (display-to-port x p)
 | 
			
		||||
    (let ([h (make-hash-table)])
 | 
			
		||||
      (hasher x h)
 | 
			
		||||
      (writer x p #f h 0))
 | 
			
		||||
    (flush-output-port p))
 | 
			
		||||
  ;;;
 | 
			
		||||
  
 | 
			
		||||
  (define formatter
 | 
			
		||||
    (lambda (who p fmt args)
 | 
			
		||||
      (let f ([i 0] [args args])
 | 
			
		||||
| 
						 | 
				
			
			@ -468,8 +500,7 @@
 | 
			
		|||
      (unless (string? fmt)
 | 
			
		||||
        (error 'fprintf "~s is not a string" fmt))
 | 
			
		||||
      (formatter 'fprintf port fmt args)))
 | 
			
		||||
  
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
  (define display-error
 | 
			
		||||
    (lambda (errname who fmt args)
 | 
			
		||||
      (unless (string? fmt)
 | 
			
		||||
| 
						 | 
				
			
			@ -481,8 +512,8 @@
 | 
			
		|||
        (formatter 'print-error p fmt args)
 | 
			
		||||
        (write-char #\. p)
 | 
			
		||||
        (newline p))))
 | 
			
		||||
  ;;;
 | 
			
		||||
  (primitive-set! 'format
 | 
			
		||||
  
 | 
			
		||||
  (define format
 | 
			
		||||
    (lambda (fmt . args)
 | 
			
		||||
      (unless (string? fmt)
 | 
			
		||||
        (error 'format "~s is not a string" fmt))
 | 
			
		||||
| 
						 | 
				
			
			@ -490,35 +521,37 @@
 | 
			
		|||
        (formatter 'format p fmt args)
 | 
			
		||||
        (get-output-string p))))
 | 
			
		||||
   
 | 
			
		||||
  (primitive-set! 'printf 
 | 
			
		||||
  (define printf 
 | 
			
		||||
    (lambda (fmt . args)
 | 
			
		||||
      (unless (string? fmt)
 | 
			
		||||
        (error 'printf "~s is not a string" fmt))
 | 
			
		||||
      (formatter 'printf (current-output-port) fmt args)))
 | 
			
		||||
  
 | 
			
		||||
  (primitive-set! 'fprintf fprintf)
 | 
			
		||||
  (primitive-set! 'print-graph print-graph)
 | 
			
		||||
  (primitive-set! 'write 
 | 
			
		||||
  (define write 
 | 
			
		||||
    (case-lambda
 | 
			
		||||
      [(x) (write-to-port x (current-output-port))]
 | 
			
		||||
      [(x p)
 | 
			
		||||
       (unless (output-port? p) 
 | 
			
		||||
         (error 'write "~s is not an output port" p))
 | 
			
		||||
       (write-to-port x p)]))
 | 
			
		||||
  (primitive-set! 'display 
 | 
			
		||||
 | 
			
		||||
  (define display 
 | 
			
		||||
    (case-lambda
 | 
			
		||||
      [(x) (display-to-port x (current-output-port))]
 | 
			
		||||
      [(x p)
 | 
			
		||||
       (unless (output-port? p) 
 | 
			
		||||
         (error 'display "~s is not an output port" p))
 | 
			
		||||
       (display-to-port x p)]))
 | 
			
		||||
  (primitive-set! 'print-error 
 | 
			
		||||
 | 
			
		||||
  (define print-error 
 | 
			
		||||
    (lambda (who fmt . args)
 | 
			
		||||
      (display-error "Error" who fmt args)))
 | 
			
		||||
  (primitive-set! 'warning 
 | 
			
		||||
 | 
			
		||||
  (define warning 
 | 
			
		||||
    (lambda (who fmt . args)
 | 
			
		||||
      (display-error "Warning" who fmt args)))
 | 
			
		||||
  (primitive-set! 'error-handler
 | 
			
		||||
 | 
			
		||||
  (define error-handler
 | 
			
		||||
    (make-parameter
 | 
			
		||||
      (lambda args
 | 
			
		||||
        (apply print-error args)
 | 
			
		||||
| 
						 | 
				
			
			@ -528,7 +561,8 @@
 | 
			
		|||
        (if (procedure? x)
 | 
			
		||||
            x
 | 
			
		||||
            (error 'error-handler "~s is not a procedure" x)))))
 | 
			
		||||
  (primitive-set! 'error
 | 
			
		||||
 | 
			
		||||
  (define error
 | 
			
		||||
    (lambda args
 | 
			
		||||
      (apply (error-handler) args))))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -42,17 +42,15 @@
 | 
			
		|||
      "ikarus.command-line.ss"
 | 
			
		||||
 | 
			
		||||
      "ikarus.core.ss"
 | 
			
		||||
 | 
			
		||||
      "ikarus.io-ports.ss"
 | 
			
		||||
      "ikarus.io-primitives.unsafe.ss"
 | 
			
		||||
      "ikarus.io-primitives.ss"
 | 
			
		||||
      "ikarus.io.input-files.ss"
 | 
			
		||||
      "ikarus.io.output-files.ss"
 | 
			
		||||
      "ikarus.io.output-strings.ss"
 | 
			
		||||
 | 
			
		||||
      "ikarus.hash-tables.ss"
 | 
			
		||||
      "ikarus.writer.ss"
 | 
			
		||||
 | 
			
		||||
      "libwriter.ss"
 | 
			
		||||
      "libtokenizer.ss"
 | 
			
		||||
      "libassembler.ss"
 | 
			
		||||
      "libintelasm.ss"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue