123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- ;;; Ported from Scheme 48 1.9. See file COPYING for notices and license.
- ;;;
- ;;; Port Author: Andrew Whatson
- ;;;
- ;;; Original Authors: Richard Kelsey, Jonathan Rees, Mike Sperber
- ;;;
- ;;; scheme48-1.9.2/scheme/prescheme/prescheme.scm
- ;;;
- ;;; Stuff in Pre-Scheme that is not in Scheme.
- ;;;
- (define-module (prescheme prescheme)
- #:use-module (prescheme scheme48)
- #:use-module (prescheme platform)
- #:use-module (prescheme ps-defenum)
- #:use-module ((rnrs io simple)
- #:select (open-input-file
- open-output-file
- close-input-port
- close-output-port
- read-char
- peek-char)
- #:prefix scheme:)
- #:export (shift-left arithmetic-shift-right logical-shift-right
- deallocate
- null-pointer
- null-pointer?
- errors
- error-string
- read-integer write-integer
- write-string
- goto
- external
- fl+ fl- fl* fl/ fl= fl< fl> fl<= fl>=
- un+ un- un* unquotient unremainder un= un< un> un<= un>=
- unsigned->integer integer->unsigned)
- #:replace (current-error-port
- open-input-file open-output-file
- close-output-port close-input-port
- read-char peek-char
- write-char newline
- force-output))
- (define shift-left arithmetic-shift)
- (define (arithmetic-shift-right i n)
- (arithmetic-shift i (- 0 n)))
- ;; Hack for the robots
- (define small* *) ;; could do a range check
- (define int-mask (- (arithmetic-shift 1 pre-scheme-integer-size) 1))
- (define (logical-shift-right i n)
- (if (>= i 0)
- (arithmetic-shift i (- 0 n))
- (arithmetic-shift (bitwise-and i int-mask) (- 0 n))))
- (define (deallocate x) #f)
- (define the-null-pointer (list 'null-pointer))
- (define (null-pointer? x) (eq? x the-null-pointer))
- (define (null-pointer)
- the-null-pointer)
- (define-external-enumeration errors
- (no-errors
- (parse-error "EDOM")
- (file-not-found "ENOENT")
- (out-of-memory "ENOMEM")
- (invalid-port "EBADF")
- ))
- (define (error-string status)
- "an error")
- ;; (symbol->string (enumerand->name status errors)))
- (define (open-input-file name)
- (let ((port (scheme:open-input-file name)))
- (values port
- (if port
- (enum errors no-errors)
- (enum errors file-not-found)))))
- (define (open-output-file name)
- (let ((port (scheme:open-output-file name)))
- (values port
- (if port
- (enum errors no-errors)
- (enum errors file-not-found)))))
- (define (close-input-port port)
- (scheme:close-input-port port)
- (enum errors no-errors))
- (define (close-output-port port)
- (scheme:close-output-port port)
- (enum errors no-errors))
- (define (read-char port)
- (let ((ch (scheme:read-char port)))
- (if (eof-object? ch)
- (values (ascii->char 0) #t (enum errors no-errors))
- (values ch #f (enum errors no-errors)))))
- (define (peek-char port)
- (let ((ch (scheme:peek-char port)))
- (if (eof-object? ch)
- (values (ascii->char 0) #t (enum errors no-errors))
- (values ch #f (enum errors no-errors)))))
- (define (read-integer port)
- (eat-whitespace! port)
- (let ((neg? (let ((x (scheme:peek-char port)))
- (if (eof-object? x)
- #f
- (case x
- ((#\+) (scheme:read-char port) #f)
- ((#\-) (scheme:read-char port) #t)
- (else #f))))))
- (let loop ((n 0) (any? #f))
- (let ((x (scheme:peek-char port)))
- (cond ((and (char? x)
- (char-numeric? x))
- (scheme:read-char port)
- (loop (+ (* n 10)
- (- (char->integer x)
- (char->integer #\0)))
- #t))
- (any?
- (values (if neg? (- n) n) #f (enum errors no-errors)))
- ((eof-object? x)
- (values 0 #t (enum errors no-errors)))
- (else
- (values 0 #f (enum errors parse-error))))))))
- (define (eat-whitespace! port)
- (cond ((char-whitespace? (scheme:peek-char port))
- (scheme:read-char port)
- (eat-whitespace! port))))
- (define (write-x string port)
- (display string port)
- (enum errors no-errors))
- (define write-char write-x)
- (define write-string write-x)
- (define write-integer write-x)
- (define (force-output port)
- (enum errors no-errors))
- (define (newline port)
- (write-char #\newline port)
- (enum errors no-errors))
- (define-syntax goto
- (syntax-rules ()
- ((_ func args ...)
- (func args ...))))
- ;; (external <string> <type> . <maybe scheme value>)
- (define-syntax external
- (syntax-rules ()
- ((_ c-name ps-type)
- (error "not implemented:" '(_ c-name ps-type)))
- ((_ c-name ps-type scm-value)
- scm-value)))
- (define current-error-port current-output-port)
- ;; ps-flonums
- (define fl+ +) (define fl- -) (define fl* *) (define fl/ /)
- (define fl= =)
- (define fl< <) (define fl> >)
- (define fl<= <=) (define fl>= >=)
- ;; ps-unsigned-integers
- (define un+ +) (define un- -) (define un* *)
- (define unquotient quotient)
- (define unremainder remainder)
- (define un= =)
- (define un< <) (define un> >)
- (define un<= <=) (define un>= >=)
- (define (unsigned->integer x) x)
- (define (integer->unsigned x) x)
|