123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- ; Copyright (c) 1993-2007 by Richard Kelsey and Jonathan Rees. See file COPYING.
- ; This is file t-features.scm.
- ; Synchronize any changes with all the other *-features.scm files.
- ; This hasn't been tested in a long time.
- (define (get-from-t name)
- (*value t-implementation-env name))
- ; (define error (get-from-t 'error)) - already present
- ; (define warn (get-from-t 'warn)) - already present?
- (define (interaction-environment)
- scheme-user-env) ;Foo
- (define scheme-report-environment
- (let ((env (interaction-environment))) ;Isn't there a scheme-env?
- (lambda (n) env)))
- (define (ignore-errors thunk)
- '(error "ignore-errors isn't implemented"))
- (define force-output (get-from-t 'force-output))
- (define char->ascii char->integer)
- (define ascii->char integer->char)
- (define (string-hash s)
- (let ((n (string-length s)))
- (do ((i 0 (+ i 1))
- (h 0 (+ h (char->ascii (string-ref s i)))))
- ((>= i n) h))))
- ;==============================================================================
- ; Bitwise logical operations on integers
- ; T's ASH doesn't work on negative numbers
- (define arithmetic-shift
- (let ((fx-ashl (get-from-t 'fx-ashl))
- (fx-ashr (get-from-t 'fx-ashr)))
- (lambda (integer count)
- (if (>= count 0)
- (fx-ashl integer count)
- (fx-ashr integer (- 0 count))))))
- ; This is from Olin Shivers:
- ; (define (correct-ash n m)
- ; (cond ((or (= m 0) (= n 0)) n)
- ; ((> n 0) (ash n m))
- ; ;; shifting a negative number.
- ; ((> m 0) ; left shift
- ; (- (ash (- n) m)))
- ; (else ; right shift
- ; (lognot (ash (lognot n) m)))))
- (define bitwise-and (get-from-t 'fx-and))
- (define bitwise-ior (get-from-t 'fx-ior))
- ;==============================================================================
- ; Code vectors
- (define make-bytev (get-from-t 'make-bytev))
- (define code-vector? (get-from-t 'bytev?))
- (define code-vector-length (get-from-t 'bytev-length))
- (define code-vector-ref (get-from-t 'bref-8))
- (define code-vector-set! ((get-from-t 'setter) code-vector-ref))
- (define (make-code-vector size . init)
- (let ((vec (make-bytev size)))
- (if (not (null? init))
- (code-vector-fill! vec (car init)))
- vec))
- (define (code-vector-fill! cv x)
- (do ((i 0 (+ i 1)))
- ((>= i (code-vector-length cv)))
- (code-vector-set! cv i x)))
- ;==============================================================================
- ; Bug fixes and modernizations
- ; I think syntax-rules will be needed, as well.
- ; Simulate a modernized DEFINE-SYNTAX.
- (#[syntax define-syntax] (define-syntax name xformer)
- `(#[syntax define-syntax] (,name . %tail%)
- (,xformer (cons ',name %tail%)
- (lambda (x) x) ;rename
- eq?))) ;compare
- ; T's MAKE-VECTOR and MAKE-STRING ignore their init argument.
- (define make-vector
- (let ((broken-make-vector (get-from-t 'make-vector)))
- (lambda (size . init)
- (let ((vec (broken-make-vector size)))
- (if (not (null? init))
- (vector-fill! vec (car init)))
- vec))))
- (define make-string
- (let ((make-string (get-from-t 'make-string))
- (string-fill (get-from-t 'string-fill)))
- (lambda (size . init-option)
- (if (null? init-option)
- (make-string size)
- (string-fill (make-string size) (car init-option))))))
- ; Dynamic-wind.
- (define (dynamic-wind before during after)
- (before)
- (let ((result (during)))
- (after)
- result))
|