1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
|
; Part of Scheme 48 1.9. See file COPYING for notices and license.
; Authors: Mike Sperber
; Handy things for debugging the run-time system, byte code compiler,
; and linker.
; Alternative command processor. Handy for debugging the bigger one.
(define (make-mini-command scheme)
(define-structure mini-command (export command-processor)
(open scheme-level-2
ascii byte-vectors os-strings
exceptions conditions handle
i/o) ; current-error-port
(files (debug mini-command)
(env dispcond)))
mini-command)
; Miniature EVAL, for debugging runtime system sans package system.
(define-structures ((mini-eval evaluation-interface)
(mini-environments
(export interaction-environment
scheme-report-environment
set-interaction-environment!
set-scheme-report-environment!)))
(open scheme-level-2
exceptions) ;error
(files (debug mini-eval)))
(define (make-scheme environments evaluation) ;cf. initial-packages.scm
(define-structure scheme scheme-interface
(open scheme-level-2
environments
evaluation))
scheme)
; Stand-alone system that doesn't contain a byte-code compiler.
; This is useful for various testing purposes.
(define mini-scheme (make-scheme mini-environments mini-eval))
(define mini-command (make-mini-command mini-scheme))
(define-structure little-system (export start)
(open scheme-level-1
mini-command
usual-resumer)
(begin (define start
(usual-resumer
(lambda (args) (command-processor #f args))))))
(define (link-little-system)
(link-simple-system '(scheme/debug little)
'start
little-system))
; --------------------
; Hack: smallest possible reified system.
(define-structures ((mini-for-reification for-reification-interface)
(mini-packages (export make-simple-package)))
(open scheme-level-2
features ;contents
locations
exceptions) ;error
(files (debug mini-package)))
(define-structure mini-system (export start)
(open mini-scheme
mini-command
mini-for-reification
mini-packages
mini-environments ;set-interaction-environment!
usual-resumer)
(files (debug mini-start)))
(define (link-mini-system)
(link-reified-system (list (cons 'scheme mini-scheme)
(cons 'write-images write-images)
(cons 'primitives primitives) ;just for fun
(cons 'usual-resumer usual-resumer)
(cons 'command mini-command))
'(scheme/debug mini)
'start
mini-system mini-for-reification))
; --------------------
; S-expression (nodes, really) interpreter
(define-structure run evaluation-interface
(open scheme-level-2
tables
packages ;package-uid package->environment link!
compiler-envs ;bind-source-filename
reading-forms ;read-forms $note-file-package
syntactic ;scan-forms expand-forms
locations
nodes
bindings
meta-types
mini-environments
exceptions
fluids)
(files (debug run)))
; Hack: an interpreter-based system.
(define (link-medium-system) ;cf. initial.scm
(def medium-scheme (make-scheme environments run))
(let ()
(def command (make-mini-command medium-scheme))
(let ()
(def medium-system
;; Cf. initial-packages.scm
(make-initial-system medium-scheme command))
(let ((structs (list (cons 'scheme medium-scheme)
(cons 'primitives primitives) ;just for fun
(cons 'usual-resumer usual-resumer)
(cons 'command command))))
(link-reified-system structs
'(scheme/debug medium)
`(start ',(map car structs))
medium-system for-reification)))))
;;; load this into a Scheme implementation you trust, call TEST-ALL
;;; and (print-results "t1"). Repeate the same for the untrusted
;;; Scheme with a different filename and compare the files using diff.
(define-structure test-bignum (export test-all print-results)
(open scheme
i/o
bitwise)
(begin
(define *tests* '())
(define (add-test! test) (set! *tests* (cons test *tests*)))
(define (test-all) (for-each (lambda (t) (t)) *tests*))
(define *results* '())
(define (print-results fname)
(with-output-to-file fname
(lambda ()
(for-each (lambda (x) (display x)(newline)) *results*))))
(define (add! e) (set! *results* (cons e *results*)))
(define (square-map f l1 l2)
(if (null? l1)
'()
(letrec ((one-map (lambda (e1)
(map (lambda (e2)
(add! (f e1 e2)))
l2))))
(cons (one-map (car l1))
(square-map f (cdr l1) l2)))))
(define (printing-map f l)
(for-each add!
(map f l)))
(define small-args '(-1234 -23 -2 -1 1 2 23 1234))
(define fixnum-args (append (list -536870912 -536870911 536870911)
small-args))
(define usual-args
(append (list -12345678901234567890 -1234567890 -536870913 536870912
536870913 1234567890 12345678901234567890)
fixnum-args))
(define small-args/0 (cons 0 small-args))
(define fixnum-args/0 (cons 0 fixnum-args))
(define usual-args/0 (cons 0 usual-args))
(add-test! (lambda () (square-map + usual-args/0 usual-args/0)))
(add-test! (lambda () (square-map - usual-args/0 usual-args/0)))
(add-test! (lambda () (square-map * usual-args/0 usual-args/0)))
(add-test! (lambda () (square-map / usual-args/0 usual-args)))
(add-test! (lambda () (square-map quotient usual-args/0 usual-args)))
(add-test! (lambda () (square-map remainder usual-args/0 usual-args)))
(add-test! (lambda () (square-map arithmetic-shift usual-args/0 small-args)))
(add-test! (lambda () (square-map bitwise-and usual-args/0 usual-args/0)))
(add-test! (lambda () (square-map bitwise-ior usual-args/0 usual-args/0)))
(add-test! (lambda () (square-map bitwise-xor usual-args/0 usual-args/0)))
(add-test! (lambda () (printing-map bitwise-not usual-args/0)))
; (add-test! (lambda () (printing-map bit-count usual-args/0)))
(add-test! (lambda () (square-map < usual-args/0 usual-args/0)))
(add-test! (lambda () (square-map > usual-args/0 usual-args/0)))
(add-test! (lambda () (square-map <= usual-args/0 usual-args/0)))
(add-test! (lambda () (square-map >= usual-args/0 usual-args/0)))
(add-test! (lambda () (square-map = usual-args/0 usual-args/0)))
(add-test! (lambda () (printing-map abs usual-args/0)))
; (add-test! (lambda () (printing-map (lambda (x) (angle (abs x))) usual-args/0)))
(add-test!
(lambda ()
(map (lambda (unary)
(printing-map unary usual-args/0))
(list integer? rational? real? complex? exact? real-part
imag-part floor numerator denominator))))
))
|