2 ;;; Part of the initial environment that you will need to provide with your
3 ;;; compiler, but written in [very elementary] Scheme. Put otherwise, your
4 ;;; compiler will have to be able to compile this code in order to provide it.
6 ;;; Programmer: Mayer Goldberg, 2009
8 ;;; (define binary-add #f)
9 ;;; (define binary-sub #f)
10 ;;; (define binary-mul #f)
11 ;;; (define binary-div #f)
12 ;;; (define binary<? #f)
13 ;;; (define binary=? #f)
15 ;;; (let ((+ +) (- -) (* *) (/ /) (< <) (= =))
16 ;;; (set! binary-add (lambda (a b) (+ a b)))
17 ;;; (set! binary-sub (lambda (a b) (- a b)))
18 ;;; (set! binary-mul (lambda (a b) (* a b)))
19 ;;; (set! binary-div (lambda (a b) (/ a b)))
20 ;;; (set! binary<? (lambda (a b) (< a b)))
21 ;;; (set! binary=? (lambda (a b) (= a b))))
23 ;;; Use this procedure for boxing your variables
24 ;;; when removing set! during the semantic analysis
27 ; (let ((v (make-vector 1)))
32 (lambda (binop final s)
36 (binop (car s) (loop (cdr s)))))))
39 (define add1 (lambda (n) (binary-add n 1)))
40 (define sub1 (lambda (n) (binary-sub n 1)))
48 (loop (car s) (cdr s)))))))
52 (define < (order binary<?))
74 (define = (order binary=?))
76 ;;; extension: a variadic not-equal
81 (and (andmap (lambda (b) (not (= a b))) s)
82 (loop (car s) (cdr s)))))))
84 (loop (car s) (cdr s)))))
86 (define not (lambda (x) (if x #f #t)))
94 (foldr binary-compose (lambda (x) x) s))))
96 (define caar (compose car car))
97 (define cadr (compose car cdr))
98 (define cdar (compose cdr car))
99 (define cddr (compose cdr cdr))
100 (define caaar (compose car caar))
101 (define caadr (compose car cadr))
102 (define cadar (compose car cdar))
103 (define caddr (compose car cddr))
104 (define cdaar (compose cdr caar))
105 (define cdadr (compose cdr cadr))
106 (define cddar (compose cdr cdar))
107 (define cdddr (compose cdr cddr))
108 (define caaaar (compose car caaar))
109 (define caaadr (compose car caadr))
110 (define caadar (compose car cadar))
111 (define caaddr (compose car caddr))
112 (define cadaar (compose car cdaar))
113 (define cadadr (compose car cdadr))
114 (define caddar (compose car cddar))
115 (define cadddr (compose car cdddr))
116 (define cdaaar (compose cdr caaar))
117 (define cdaadr (compose cdr caadr))
118 (define cdadar (compose cdr cadar))
119 (define cdaddr (compose cdr caddr))
120 (define cddaar (compose cdr cdaar))
121 (define cddadr (compose cdr cdadr))
122 (define cdddar (compose cdr cddar))
123 (define cddddr (compose cdr cdddr))
125 (define ^variadic-right-from-binary
126 (lambda (binary-op base-value)
129 (if (null? s) base-value
130 (binary-op (car s) (op-list (cdr s)))))))
134 (define ^variadic-left-from-binary
135 (lambda (binary-op base-value)
139 (op-list (binary-op acc (car s)) (cdr s))))))
141 (if (null? args) base-value
142 (op-list (car args) (cdr args)))))))
144 (define + (^variadic-right-from-binary binary-add 0))
145 (define * (^variadic-right-from-binary binary-mul 1))
147 (define - (^variadic-left-from-binary binary-sub 0))
148 (define / (^variadic-left-from-binary binary-div 1))
153 (int-op (char->integer ch1) (char->integer ch2)))))
155 (define char<=? (order (^char-op <=)))
156 (define char<? (order (^char-op <)))
157 (define char>=? (order (^char-op >=)))
158 (define char>? (order (^char-op >)))
160 (define char-uppercase?
162 (and (char<=? #\A ch)
165 (define char-lowercase?
167 (and (char<=? #\a ch)
171 (let ((char-aA (- (char->integer #\a) (char->integer #\A))))
173 (if (char-lowercase? ch)
175 (- (char->integer ch) char-aA))))))
177 (define char-downcase
178 (let ((char-aA (- (char->integer #\a) (char->integer #\A))))
180 (if (char-uppercase? ch)
182 (+ (char->integer ch) char-aA))))))
187 (char<=? (char-upcase ch1) (char-upcase ch2)))))
192 (char<? (char-upcase ch1) (char-upcase ch2)))))
197 (char=? (char-upcase ch1) (char-upcase ch2)))))
202 (char>? (char-upcase ch1) (char-upcase ch2)))))
207 (char>=? (char-upcase ch1) (char-upcase ch2)))))
209 (define string-upcase
212 (map char-upcase (string->list string)))))
214 (define string-downcase
217 (map char-downcase (string->list string)))))
221 (zero? (remainder n 2))))
225 (not (zero? (remainder n 2)))))
230 (add1 (length (cdr s))))))
232 (define list (lambda args args))
236 (if (zero? i) (car s)
237 (list-ref (cdr s) (- i 1)))))
248 (if (null? (car lists)) '()
249 (cons (apply f (map-one car lists))
250 (map-list f (map-one cdr lists))))))
255 (map-one f (cdr s)))))))
261 (ormap (lambda (b) (eq? a b)) s)))
263 (define negative? (lambda (n) (< n 0)))
265 (define positive? (lambda (n) (> n 0)))
267 (define zero? (lambda (x) (= x 0)))
269 (define vector (lambda args (list->vector args)))
275 (ormap f (cdr s))))))
281 (andmap f (cdr s))))))
289 (cons (string-ref str n) s))))))
291 (loop str (- (string-length str) 1) '()))))
299 (cons (vector-ref v n) s))))))
301 (loop v (- (vector-length v) 1) '()))))
305 (let* ((n (length s))
306 (str (make-string n)))
311 (string-set! str i (car s))
312 (loop (cdr s) (+ i 1)))))))
317 (let* ((n (length s))
323 (vector-set! v i (car s))
324 (loop (cdr s) (+ i 1)))))))
331 (else (member a (cdr s))))))
336 ((eq? (caar s) a) (car s))
337 (else (assoc a (cdr s))))))
341 (cond ((and (pair? e1) (pair? e2))
342 (and (equal? (car e1) (car e2))
343 (equal? (cdr e1) (cdr e2))))
344 ((and (vector? e1) (vector? e2)
345 (= (vector-length e1) (vector-length e2)))
346 (equal? (vector->list e1) (vector->list e2)))
347 ((and (null? e1) (null? e2)) #t)
348 ((and (boolean? e1) (boolean? e2)) (and e1 e2))
349 ((and (char? e1) (char? e2))
351 ((and (number? e1) (number? e2))
353 ((and (string? e1) (string? e2))
355 ((and (symbol? e1) (symbol? e2))
357 ((and (void? e1) (void? e2)) #t)
363 (lambda () void-object)))
366 (let ((void-object (void)))
367 (lambda (x) (eq? x void-object))))
369 (define string-append
371 (list->string (apply append (map string->list s)))))
373 (define vector-append
375 (list->vector (apply append (map vector->list s)))))
378 (letrec ((binary-append
381 (cons (car s1) (binary-append (cdr s1) s2))))))
383 (foldr binary-append '() s))))
389 (loop (cdr s) (cons (car s) r))))))
393 (define string-reverse
401 (if (zero? i) (car s)
402 (list-ref (cdr s) (- i 1)))))
406 (if (zero? i) (set-car! s x)
407 (list-set! (cdr s) (- i 1) x))))
410 (let ((binary-max (lambda (a b) (if (> a b) a b))))
412 (foldr binary-max a s))))
415 (let ((binary-min (lambda (a b) (if (< a b) a b))))
417 (foldr binary-min a s))))
423 (let ((r (remainder a b)))
425 (binary-gcd b r)))))))
427 (foldr binary-gcd a s))))