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 >=)))
159 (define char>? (order (^char-op >)))
161 (define char-uppercase?
163 (and (char<=? #\A ch)
166 (define char-lowercase?
168 (and (char<=? #\a ch)
172 (let ((char-aA (- (char->integer #\a) (char->integer #\A))))
174 (if (char-lowercase? ch)
176 (- (char->integer ch) char-aA))
179 (define char-downcase
180 (let ((char-aA (- (char->integer #\a) (char->integer #\A))))
182 (if (char-uppercase? ch)
184 (+ (char->integer ch) char-aA))
190 (char<=? (char-upcase ch1) (char-upcase ch2)))))
195 (char<? (char-upcase ch1) (char-upcase ch2)))))
200 (char=? (char-upcase ch1) (char-upcase ch2)))))
205 (char>? (char-upcase ch1) (char-upcase ch2)))))
210 (char>=? (char-upcase ch1) (char-upcase ch2)))))
212 (define string-upcase
215 (map char-upcase (string->list string)))))
217 (define string-downcase
220 (map char-downcase (string->list string)))))
224 (zero? (remainder n 2))))
228 (not (zero? (remainder n 2)))))
233 (add1 (length (cdr s))))))
235 (define list (lambda args args))
239 (if (zero? i) (car s)
240 (list-ref (cdr s) (- i 1)))))
251 (if (null? (car lists)) '()
252 (cons (apply f (map-one car lists))
253 (map-list f (map-one cdr lists))))))
258 (map-one f (cdr s)))))))
264 (ormap (lambda (b) (eq? a b)) s)))
266 (define negative? (lambda (n) (< n 0)))
268 (define positive? (lambda (n) (> n 0)))
270 (define zero? (lambda (x) (= x 0)))
272 (define vector (lambda args (list->vector args)))
279 (or (apply f (map car s))
280 (loop (map cdr s)))))))
288 (and (apply f (map car s))
289 (loop (map cdr s)))))))
298 (cons (string-ref str n) s))))))
300 (loop str (- (string-length str) 1) '()))))
302 (define binary-string=?
304 (let ((n1 (string-length str1))
305 (n2 (string-length str2)))
307 (let ((s1 (string->list str1))
308 (s2 (string->list str2)))
309 (andmap char=? s1 s2))))))
311 (define binary-string<?
315 (cond ((null? s1) (pair? s2))
317 ((char=? (car s1) (car s2))
318 (loop (cdr s1) (cdr s2)))
319 (else (char<? (car s1) (car s2)))))))
320 (loop (string->list str1)
321 (string->list str2)))))
323 (define binary-string>? (lambda (str1 str2) (binary-string<? str2 str1)))
325 (define binary-string<=?
326 (lambda (str1 str2) (not (binary-string>? str1 str2))))
328 (define binary-string>=?
329 (lambda (str1 str2) (not (binary-string<? str1 str2))))
331 (define string=? (order binary-string=?))
332 (define string<? (order binary-string<?))
333 (define string>? (order binary-string>?))
334 (define string<=? (order binary-string<=?))
335 (define string>=? (order binary-string>=?))
343 (cons (vector-ref v n) s))))))
345 (loop v (- (vector-length v) 1) '()))))
349 (let* ((n (length s))
350 (str (make-string n)))
355 (string-set! str i (car s))
356 (loop (cdr s) (+ i 1)))))))
361 (let* ((n (length s))
367 (vector-set! v i (car s))
368 (loop (cdr s) (+ i 1)))))))
374 ((equal? (car s) a) s)
375 (else (member a (cdr s))))))
380 ((eq? (caar s) a) (car s))
381 (else (assoc a (cdr s))))))
385 (cond ((and (pair? e1) (pair? e2))
386 (and (equal? (car e1) (car e2))
387 (equal? (cdr e1) (cdr e2))))
388 ((and (vector? e1) (vector? e2)
389 (= (vector-length e1) (vector-length e2)))
390 (equal? (vector->list e1) (vector->list e2)))
391 ((and (null? e1) (null? e2)) #t)
392 ((and (boolean? e1) (boolean? e2)) (and e1 e2))
393 ((and (char? e1) (char? e2))
395 ((and (number? e1) (number? e2))
397 ((and (string? e1) (string? e2))
399 ((and (symbol? e1) (symbol? e2))
401 ((and (void? e1) (void? e2)) #t)
407 (lambda () void-object)))
410 (let ((void-object (void)))
411 (lambda (x) (eq? x void-object))))
413 (define string-append
415 (list->string (apply append (map string->list s)))))
417 (define vector-append
419 (list->vector (apply append (map vector->list s)))))
422 (letrec ((binary-append
425 (cons (car s1) (binary-append (cdr s1) s2))))))
427 (foldr binary-append '() s))))
433 (loop (cdr s) (cons (car s) r))))))
437 (define string-reverse
445 (if (zero? i) (car s)
446 (list-ref (cdr s) (- i 1)))))
450 (if (zero? i) (set-car! s x)
451 (list-set! (cdr s) (- i 1) x))))
454 (let ((binary-max (lambda (a b) (if (> a b) a b))))
456 (foldr binary-max a s))))
459 (let ((binary-min (lambda (a b) (if (< a b) a b))))
461 (foldr binary-min a s))))
467 (let ((r (remainder a b)))
469 (binary-gcd b r)))))))
471 (foldr binary-gcd a s))))