scsh-0.5/alt/t-features.scm

119 lines
3.4 KiB
Scheme

; Copyright (c) 1993, 1994 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))