t-features.scm 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Richard Kelsey, Jonathan Rees
  3. ; This is file t-features.scm.
  4. ; Synchronize any changes with all the other *-features.scm files.
  5. ; This hasn't been tested in a long time.
  6. (define (get-from-t name)
  7. (*value t-implementation-env name))
  8. ; (define error (get-from-t 'error)) - already present
  9. ; (define warn (get-from-t 'warn)) - already present?
  10. (define (interaction-environment)
  11. scheme-user-env) ;Foo
  12. (define scheme-report-environment
  13. (let ((env (interaction-environment))) ;Isn't there a scheme-env?
  14. (lambda (n) env)))
  15. (define (ignore-errors thunk)
  16. '(error "ignore-errors isn't implemented"))
  17. (define force-output (get-from-t 'force-output))
  18. (define char->ascii char->integer)
  19. (define ascii->char integer->char)
  20. (define (string-hash s)
  21. (let ((n (string-length s)))
  22. (do ((i 0 (+ i 1))
  23. (h 0 (+ h (char->ascii (string-ref s i)))))
  24. ((>= i n) h))))
  25. ;==============================================================================
  26. ; Bitwise logical operations on integers
  27. ; T's ASH doesn't work on negative numbers
  28. (define arithmetic-shift
  29. (let ((fx-ashl (get-from-t 'fx-ashl))
  30. (fx-ashr (get-from-t 'fx-ashr)))
  31. (lambda (integer count)
  32. (if (>= count 0)
  33. (fx-ashl integer count)
  34. (fx-ashr integer (- 0 count))))))
  35. ; This is from Olin Shivers:
  36. ; (define (correct-ash n m)
  37. ; (cond ((or (= m 0) (= n 0)) n)
  38. ; ((> n 0) (ash n m))
  39. ; ;; shifting a negative number.
  40. ; ((> m 0) ; left shift
  41. ; (- (ash (- n) m)))
  42. ; (else ; right shift
  43. ; (lognot (ash (lognot n) m)))))
  44. (define bitwise-and (get-from-t 'fx-and))
  45. (define bitwise-ior (get-from-t 'fx-ior))
  46. ;==============================================================================
  47. ; Code vectors
  48. (define make-bytev (get-from-t 'make-bytev))
  49. (define code-vector? (get-from-t 'bytev?))
  50. (define code-vector-length (get-from-t 'bytev-length))
  51. (define code-vector-ref (get-from-t 'bref-8))
  52. (define code-vector-set! ((get-from-t 'setter) code-vector-ref))
  53. (define (make-code-vector size . init)
  54. (let ((vec (make-bytev size)))
  55. (if (not (null? init))
  56. (code-vector-fill! vec (car init)))
  57. vec))
  58. (define (code-vector-fill! cv x)
  59. (do ((i 0 (+ i 1)))
  60. ((>= i (code-vector-length cv)))
  61. (code-vector-set! cv i x)))
  62. ;==============================================================================
  63. ; Bug fixes and modernizations
  64. ; I think syntax-rules will be needed, as well.
  65. ; Simulate a modernized DEFINE-SYNTAX.
  66. (#[syntax define-syntax] (define-syntax name xformer)
  67. `(#[syntax define-syntax] (,name . %tail%)
  68. (,xformer (cons ',name %tail%)
  69. (lambda (x) x) ;rename
  70. eq?))) ;compare
  71. ; T's MAKE-VECTOR and MAKE-STRING ignore their init argument.
  72. (define make-vector
  73. (let ((broken-make-vector (get-from-t 'make-vector)))
  74. (lambda (size . init)
  75. (let ((vec (broken-make-vector size)))
  76. (if (not (null? init))
  77. (vector-fill! vec (car init)))
  78. vec))))
  79. (define make-string
  80. (let ((make-string (get-from-t 'make-string))
  81. (string-fill (get-from-t 'string-fill)))
  82. (lambda (size . init-option)
  83. (if (null? init-option)
  84. (make-string size)
  85. (string-fill (make-string size) (car init-option))))))
  86. ; Dynamic-wind.
  87. (define (dynamic-wind before during after)
  88. (before)
  89. (let ((result (during)))
  90. (after)
  91. result))