1 ;;;============================================================================
3 ;;; File: "_std.scm", Time-stamp: <2009-09-05 10:12:12 feeley>
5 ;;; Copyright (c) 1994-2009 by Marc Feeley, All Rights Reserved.
7 ;;;============================================================================
9 (##include "header.scm")
11 ;;;============================================================================
13 ;; Implementation of exceptions.
15 (implement-library-type-improper-length-list-exception)
17 (define-prim (##raise-improper-length-list-exception arg-num proc . args);;;;;;;;;;;
18 (##extract-procedure-and-arguments
24 (lambda (procedure arguments arg-num dummy1 dummy2)
26 (macro-make-improper-length-list-exception procedure arguments arg-num)))))
28 ;;;----------------------------------------------------------------------------
30 ;; Definition of vector-like data types (i.e. string, vector, s8vector, ...).
32 (##define-macro (define-prim-vector-procedures
37 macro-check-elem-list)
42 (map (lambda (s) (if (symbol? s) (symbol->string s) s))
47 (define macro-check-vect (sym 'macro-check- name))
48 (define vect-list (sym name '-list))
49 (define ##fail-check-vect (sym '##fail-check- name))
50 (define ##fail-check-vect-list (sym '##fail-check- name '-list))
52 (define ##vect? (sym "##" name '?))
53 (define ##make-vect (sym '##make- name))
54 (define ##vect (sym "##" name))
55 (define ##vect-length (sym "##" name '-length))
56 (define ##vect-ref (sym "##" name '-ref))
57 (define ##vect-set! (sym "##" name '-set!))
58 (define ##vect->list (sym "##" name '->list))
59 (define ##list->vect (sym '##list-> name))
60 (define ##vect-copy (sym "##" name '-copy))
61 (define ##vect-fill! (sym "##" name '-fill!))
62 (define ##subvect (sym '##sub name))
63 (define ##append-vects (sym '##append- name 's))
64 (define ##vect-append (sym "##" name '-append))
65 (define ##subvect-move! (sym '##sub name '-move!))
66 (define ##subvect-fill! (sym '##sub name '-fill!))
67 (define ##vect-shrink! (sym "##" name '-shrink!))
69 (define vect? (sym name '?))
70 (define make-vect (sym 'make- name))
71 (define vect (sym name))
72 (define vect-length (sym name '-length))
73 (define vect-ref (sym name '-ref))
74 (define vect-set! (sym name '-set!))
75 (define vect->list (sym name '->list))
76 (define list->vect (sym 'list-> name))
77 (define vect-copy (sym name '-copy))
78 (define vect-fill! (sym name '-fill!))
79 (define subvect (sym 'sub name))
80 (define append-vects (sym 'append- name 's))
81 (define vect-append (sym name '-append))
82 (define subvect-move! (sym 'sub name '-move!))
83 (define subvect-fill! (sym 'sub name '-fill!))
84 (define vect-shrink! (sym name '-shrink!))
88 (define-fail-check-type ,name ',name)
89 (define-fail-check-type ,vect-list ',vect-list)
91 (define-prim (,##vect? obj))
93 (define-prim (,vect? obj)
94 (macro-force-vars (obj)
97 (define-prim (,make-vect k #!optional (f (macro-absent-obj)))
99 (,macro-force-elem (f)
101 (if (##eq? f (macro-absent-obj))
104 (macro-check-index k 1 (,make-vect k f)
105 (,macro-check-elem fill 2 (,make-vect k f)
106 (,##make-vect k fill)))))))
108 (define-prim (,##vect . lst)
111 ,@(if (eq? name 'vector)
112 `((define-prim (,vect
114 (elem1 (macro-absent-obj))
115 (elem2 (macro-absent-obj))
116 (elem3 (macro-absent-obj))
117 (elem4 (macro-absent-obj))
120 (if (##eq? elem1 (macro-absent-obj))
122 (,macro-force-elem (elem1)
123 (,macro-check-elem elem1 1 (,vect elem1 elem2 elem3 elem4 . others)
124 (if (##eq? elem2 (macro-absent-obj))
126 (,macro-force-elem (elem2)
127 (,macro-check-elem elem2 2 (,vect elem1 elem2 elem3 elem4 . others)
128 (if (##eq? elem3 (macro-absent-obj))
129 (,##vect elem1 elem2)
130 (,macro-force-elem (elem3)
131 (,macro-check-elem elem3 3 (,vect elem1 elem2 elem3 elem4 . others)
132 (if (##eq? elem4 (macro-absent-obj))
133 (,##vect elem1 elem2 elem3)
134 (,macro-force-elem (elem4)
135 (,macro-check-elem elem4 4 (,vect elem1 elem2 elem3 elem4 . others)
137 (,##vect elem1 elem2 elem3 elem4)
138 (let loop1 ((x others)
143 (let ((vect (,##make-vect n)))
144 (,##vect-set! vect 0 elem1)
145 (,##vect-set! vect 1 elem2)
146 (,##vect-set! vect 2 elem3)
147 (,##vect-set! vect 3 elem4)
148 (let loop2 ((x others)
151 (let ((elem (##car x)))
152 (,macro-force-elem (elem)
153 (,macro-check-elem elem (##fixnum.+ i 1) (,vect elem1 elem2 elem3 elem4 . others)
155 (,##vect-set! vect i elem)
157 (##fixnum.+ i 1))))))
158 vect))))))))))))))))))))
159 `((define-prim (,vect . others)
160 (let loop1 ((x others) (n 0))
162 (loop1 (##cdr x) (##fixnum.+ n 1))
163 (let ((vect (,##make-vect n)))
164 (let loop2 ((x others) (i 0))
166 (let ((elem (##car x)))
167 (,macro-force-elem (elem)
168 (,macro-check-elem elem (##fixnum.+ i 1) (,vect . others)
170 (,##vect-set! vect i elem)
171 (loop2 (##cdr x) (##fixnum.+ i 1))))))
174 (define-prim (,##vect-length vect))
176 (define-prim (,vect-length vect)
177 (macro-force-vars (vect)
178 (,macro-check-vect vect 1 (,vect-length vect)
179 (,##vect-length vect))))
181 (define-prim (,##vect-ref vect k))
183 (define-prim (,vect-ref vect k)
184 (macro-force-vars (vect k)
185 (,macro-check-vect vect 1 (,vect-ref vect k)
186 (macro-check-index-range
190 (,##vect-length vect)
192 (,##vect-ref vect k)))))
194 (define-prim (,##vect-set! vect k val))
196 (define-prim (,vect-set! vect k val)
197 (macro-force-vars (vect k)
198 (,macro-force-elem (val)
199 (,macro-check-vect vect 1 (,vect-set! vect k val)
200 (macro-check-subtyped-mutable vect 1 (,vect-set! vect k val)
201 (macro-check-index-range
205 (,##vect-length vect)
206 (,vect-set! vect k val)
207 (,macro-check-elem val 3 (,vect-set! vect k val)
209 (,##vect-set! vect k val)
212 (define-prim (,##vect->list vect)
213 (let loop ((lst '()) (i (##fixnum.- (,##vect-length vect) 1)))
216 (loop (##cons (,##vect-ref vect i) lst) (##fixnum.- i 1)))))
218 (define-prim (,vect->list vect)
219 (macro-force-vars (vect)
220 (,macro-check-vect vect 1 (,vect->list vect)
221 (let loop ((lst '()) (i (##fixnum.- (,##vect-length vect) 1)))
224 (loop (##cons (,##vect-ref vect i) lst) (##fixnum.- i 1)))))))
226 (define-prim (,##list->vect lst)
227 (let loop1 ((x lst) (n 0))
229 (loop1 (##cdr x) (##fixnum.+ n 1))
230 (let ((vect (,##make-vect n ,default-elem-value)))
231 (let loop2 ((x lst) (i 0))
232 (if (and (##pair? x) ;; double check in case another
233 (##fixnum.< i n));; thread mutates the list
234 (let ((elem (##car x)))
235 (,##vect-set! vect i elem)
236 (loop2 (##cdr x) (##fixnum.+ i 1)))
239 (define-prim (,list->vect lst)
240 (let loop1 ((x lst) (n 0))
241 (macro-force-vars (x)
243 (loop1 (##cdr x) (##fixnum.+ n 1))
244 (macro-check-list x 1 (,list->vect lst)
245 (let ((vect (,##make-vect n ,default-elem-value)))
246 (let loop2 ((x lst) (i 0))
247 (macro-force-vars (x)
248 (if (and (##pair? x) ;; double check in case another
249 (##fixnum.< i n));; thread mutates the list
250 (let ((elem (##car x)))
251 (,macro-check-elem-list elem 1 (,list->vect lst)
253 (,##vect-set! vect i elem)
254 (loop2 (##cdr x) (##fixnum.+ i 1)))))
257 (define-prim (,##vect-fill! vect fill)
258 (,##subvect-fill! vect 0 (,##vect-length vect) fill))
260 (define-prim (,vect-fill! vect fill)
261 (macro-force-vars (vect)
262 (,macro-force-elem (fill)
263 (,macro-check-vect vect 1 (,vect-fill! vect fill)
264 (macro-check-subtyped-mutable vect 1 (,vect-fill! vect fill)
265 (,macro-check-elem fill 2 (,vect-fill! vect fill)
266 (,##vect-fill! vect fill)))))))
268 (define-prim (,##vect-copy vect)
269 (let ((len (,##vect-length vect)))
270 (,##subvect-move! vect 0 len (,##make-vect len) 0)))
272 (define-prim (,vect-copy vect)
273 (macro-force-vars (vect)
274 (,macro-check-vect vect 1 (,vect-copy vect)
275 (,##vect-copy vect))))
277 (define-prim (,##subvect vect start end)
282 (,##make-vect (##fixnum.max (##fixnum.- end start) 0))
285 (define-prim (,subvect vect start end)
286 (macro-force-vars (vect start end)
287 (,macro-check-vect vect 1 (,subvect vect start end)
288 (macro-check-index-range-incl
292 (,##vect-length vect)
293 (,subvect vect start end)
294 (macro-check-index-range-incl
298 (,##vect-length vect)
299 (,subvect vect start end)
300 (,##subvect vect start end))))))
302 (define-prim (,##append-vects lst #!optional (vect-append? #f))
307 (cond ((##pair? lst1)
308 (let ((vect (##car lst1)))
309 (macro-force-vars (vect)
310 (if (##not (,##vect? vect))
312 (,##fail-check-vect arg-num '() ,vect-append lst)
313 (,##fail-check-vect-list 1 ,append-vects lst))
314 (loop1 (##fixnum.+ n (,##vect-length vect))
317 (##fixnum.+ arg-num 1))))))
319 (let ((result (,##make-vect n)))
323 (let* ((vect (##car lst2))
324 (len (,##vect-length vect))
325 (new-n (##fixnum.- n len)))
326 (,##subvect-move! vect 0 len result new-n)
327 (loop2 new-n (##cdr lst2)))
330 (,##fail-check-vect-list 1 ,append-vects lst)))))
332 (define-prim (,append-vects lst)
333 (,##append-vects lst #f))
335 (define-prim (,##vect-append . lst)
336 (,##append-vects lst #t))
338 (define-prim (,vect-append . lst)
339 (,##append-vects lst #t))
342 (define-prim (,##subvect-move! src-vect src-start src-end dst-vect dst-start)
343 ;; Copy direction must be selected in case src-vect and
344 ;; dst-vect are the same object.
345 (if (##fixnum.< src-start dst-start)
346 (let loop1 ((i (##fixnum.- src-end 1))
348 (##fixnum.+ dst-start
349 (##fixnum.- src-end src-start))
351 (if (##fixnum.< i src-start)
354 (,##vect-set! dst-vect j (,##vect-ref src-vect i))
355 (loop1 (##fixnum.- i 1)
357 (let loop2 ((i src-start)
359 (if (##fixnum.< i src-end)
361 (,##vect-set! dst-vect j (,##vect-ref src-vect i))
362 (loop2 (##fixnum.+ i 1)
366 (define-prim (,subvect-move! src-vect src-start src-end dst-vect dst-start)
367 (macro-force-vars (src-vect src-start src-end dst-vect dst-start)
371 (,subvect-move! src-vect src-start src-end dst-vect dst-start)
372 (macro-check-index-range-incl
376 (,##vect-length src-vect)
377 (,subvect-move! src-vect src-start src-end dst-vect dst-start)
378 (macro-check-index-range-incl
382 (,##vect-length src-vect)
383 (,subvect-move! src-vect src-start src-end dst-vect dst-start)
387 (,subvect-move! src-vect src-start src-end dst-vect dst-start)
388 (macro-check-subtyped-mutable
391 (,subvect-move! src-vect src-start src-end dst-vect dst-start)
392 (macro-check-index-range-incl
396 (##fixnum.- (,##vect-length dst-vect)
397 (##fixnum.- src-end src-start))
398 (,subvect-move! src-vect src-start src-end dst-vect dst-start)
400 (,##subvect-move! src-vect src-start src-end dst-vect dst-start)
403 (define-prim (,##subvect-fill! vect start end fill)
404 (let loop ((i (##fixnum.- end 1)))
405 (if (##fixnum.< i start)
408 (,##vect-set! vect i fill)
409 (loop (##fixnum.- i 1))))))
411 (define-prim (,subvect-fill! vect start end fill)
412 (macro-force-vars (vect start end)
413 (,macro-force-elem (fill)
414 (,macro-check-vect vect 1 (,subvect-fill! vect start end fill)
415 (macro-check-subtyped-mutable vect 1 (,subvect-fill! vect start end fill)
416 (macro-check-index-range-incl
420 (,##vect-length vect)
421 (,subvect-fill! vect start end fill)
422 (macro-check-index-range-incl
426 (,##vect-length vect)
427 (,subvect-fill! vect start end fill)
431 (,subvect-fill! vect start end fill)
432 (,##subvect-fill! vect start end fill)))))))))
434 (define-prim (,##vect-shrink! vect k))
436 (define-prim (,vect-shrink! vect k)
437 (macro-force-vars (vect k)
438 (,macro-check-vect vect 1 (,vect-shrink! vect k)
439 (macro-check-subtyped-mutable vect 1 (,vect-shrink! vect k)
440 (macro-check-index-range-incl
444 (,##vect-length vect)
445 (,vect-shrink! vect k)
447 (,##vect-shrink! vect k)
450 (define-prim-vector-procedures
455 macro-check-char-list)
457 (define-prim-vector-procedures
464 (define-prim-vector-procedures
468 macro-check-exact-signed-int8
469 macro-check-exact-signed-int8-list)
471 (define-prim-vector-procedures
475 macro-check-exact-unsigned-int8
476 macro-check-exact-unsigned-int8-list)
478 (define-prim-vector-procedures
482 macro-check-exact-signed-int16
483 macro-check-exact-signed-int16-list)
485 (define-prim-vector-procedures
489 macro-check-exact-unsigned-int16
490 macro-check-exact-unsigned-int16-list)
492 (define-prim-vector-procedures
496 macro-check-exact-signed-int32
497 macro-check-exact-signed-int32-list)
499 (define-prim-vector-procedures
503 macro-check-exact-unsigned-int32
504 macro-check-exact-unsigned-int32-list)
506 (define-prim-vector-procedures
510 macro-check-exact-signed-int64
511 macro-check-exact-signed-int64-list)
513 (define-prim-vector-procedures
517 macro-check-exact-unsigned-int64
518 macro-check-exact-unsigned-int64-list)
520 (define-prim-vector-procedures
524 macro-check-inexact-real
525 macro-check-inexact-real-list)
527 (define-prim-vector-procedures
531 macro-check-inexact-real
532 macro-check-inexact-real-list)
534 ;;;----------------------------------------------------------------------------
536 (c-declare #<<c-declare-end
543 (define-prim ##subvector-move!
544 (c-lambda (scheme-object ;; src-vect
545 scheme-object ;; src-start
546 scheme-object ;; src-end
547 scheme-object ;; dst-vect
548 scheme-object) ;; dst-start
552 void *src = ___CAST(void*,&___FIELD(___arg1,___INT(___arg2)));
553 void *dst = ___CAST(void*,&___FIELD(___arg4,___INT(___arg5)));
554 long len = ___INT(___FIXSUB(___arg3,___arg2)) * ___WS;
556 memmove (dst, src, len);
563 (define-prim ##substring-move!
564 (c-lambda (scheme-object ;; src-vect
565 scheme-object ;; src-start
566 scheme-object ;; src-end
567 scheme-object ;; dst-vect
568 scheme-object) ;; dst-start
574 ___CS_SELECT(&___FETCH_U8(___BODY(___arg1),___INT(___arg2)),
575 &___FETCH_U16(___BODY(___arg1),___INT(___arg2)),
576 &___FETCH_U32(___BODY(___arg1),___INT(___arg2))));
579 ___CS_SELECT(&___FETCH_U8(___BODY(___arg4),___INT(___arg5)),
580 &___FETCH_U16(___BODY(___arg4),___INT(___arg5)),
581 &___FETCH_U32(___BODY(___arg4),___INT(___arg5))));
582 long len = ___INT(___FIXSUB(___arg3,___arg2)) * ___CS;
584 memmove (dst, src, len);
591 (define-prim ##subs8vector-move!
592 (c-lambda (scheme-object ;; src-vect
593 scheme-object ;; src-start
594 scheme-object ;; src-end
595 scheme-object ;; dst-vect
596 scheme-object) ;; dst-start
600 void *src = ___CAST(void*,&___FETCH_S8(___BODY(___arg1),___INT(___arg2)));
601 void *dst = ___CAST(void*,&___FETCH_S8(___BODY(___arg4),___INT(___arg5)));
602 long len = ___INT(___FIXSUB(___arg3,___arg2)) * sizeof (___S8);
604 memmove (dst, src, len);
611 (define-prim ##subu8vector-move!
612 (c-lambda (scheme-object ;; src-vect
613 scheme-object ;; src-start
614 scheme-object ;; src-end
615 scheme-object ;; dst-vect
616 scheme-object) ;; dst-start
620 void *src = ___CAST(void*,&___FETCH_U8(___BODY(___arg1),___INT(___arg2)));
621 void *dst = ___CAST(void*,&___FETCH_U8(___BODY(___arg4),___INT(___arg5)));
622 long len = ___INT(___FIXSUB(___arg3,___arg2)) * sizeof (___U8);
624 memmove (dst, src, len);
631 (define-prim ##subs16vector-move!
632 (c-lambda (scheme-object ;; src-vect
633 scheme-object ;; src-start
634 scheme-object ;; src-end
635 scheme-object ;; dst-vect
636 scheme-object) ;; dst-start
640 void *src = ___CAST(void*,&___FETCH_S16(___BODY(___arg1),___INT(___arg2)));
641 void *dst = ___CAST(void*,&___FETCH_S16(___BODY(___arg4),___INT(___arg5)));
642 long len = ___INT(___FIXSUB(___arg3,___arg2)) * sizeof (___S16);
644 memmove (dst, src, len);
651 (define-prim ##subu16vector-move!
652 (c-lambda (scheme-object ;; src-vect
653 scheme-object ;; src-start
654 scheme-object ;; src-end
655 scheme-object ;; dst-vect
656 scheme-object) ;; dst-start
660 void *src = ___CAST(void*,&___FETCH_U16(___BODY(___arg1),___INT(___arg2)));
661 void *dst = ___CAST(void*,&___FETCH_U16(___BODY(___arg4),___INT(___arg5)));
662 long len = ___INT(___FIXSUB(___arg3,___arg2)) * sizeof (___U16);
664 memmove (dst, src, len);
671 (define-prim ##subs32vector-move!
672 (c-lambda (scheme-object ;; src-vect
673 scheme-object ;; src-start
674 scheme-object ;; src-end
675 scheme-object ;; dst-vect
676 scheme-object) ;; dst-start
680 void *src = ___CAST(void*,&___FETCH_S32(___BODY(___arg1),___INT(___arg2)));
681 void *dst = ___CAST(void*,&___FETCH_S32(___BODY(___arg4),___INT(___arg5)));
682 long len = ___INT(___FIXSUB(___arg3,___arg2)) * sizeof (___S32);
684 memmove (dst, src, len);
691 (define-prim ##subu32vector-move!
692 (c-lambda (scheme-object ;; src-vect
693 scheme-object ;; src-start
694 scheme-object ;; src-end
695 scheme-object ;; dst-vect
696 scheme-object) ;; dst-start
700 void *src = ___CAST(void*,&___FETCH_U32(___BODY(___arg1),___INT(___arg2)));
701 void *dst = ___CAST(void*,&___FETCH_U32(___BODY(___arg4),___INT(___arg5)));
702 long len = ___INT(___FIXSUB(___arg3,___arg2)) * sizeof (___U32);
704 memmove (dst, src, len);
711 (define-prim ##subs64vector-move!
712 (c-lambda (scheme-object ;; src-vect
713 scheme-object ;; src-start
714 scheme-object ;; src-end
715 scheme-object ;; dst-vect
716 scheme-object) ;; dst-start
720 void *src = ___CAST(void*,&___FETCH_S64(___BODY(___arg1),___INT(___arg2)));
721 void *dst = ___CAST(void*,&___FETCH_S64(___BODY(___arg4),___INT(___arg5)));
722 long len = ___INT(___FIXSUB(___arg3,___arg2)) * sizeof (___S64);
724 memmove (dst, src, len);
731 (define-prim ##subu64vector-move!
732 (c-lambda (scheme-object ;; src-vect
733 scheme-object ;; src-start
734 scheme-object ;; src-end
735 scheme-object ;; dst-vect
736 scheme-object) ;; dst-start
740 void *src = ___CAST(void*,&___FETCH_U64(___BODY(___arg1),___INT(___arg2)));
741 void *dst = ___CAST(void*,&___FETCH_U64(___BODY(___arg4),___INT(___arg5)));
742 long len = ___INT(___FIXSUB(___arg3,___arg2)) * sizeof (___U64);
744 memmove (dst, src, len);
751 (define-prim ##subf32vector-move!
752 (c-lambda (scheme-object ;; src-vect
753 scheme-object ;; src-start
754 scheme-object ;; src-end
755 scheme-object ;; dst-vect
756 scheme-object) ;; dst-start
760 void *src = ___CAST(void*,___CAST(___F32*,___BODY(___arg1))+___INT(___arg2));
761 void *dst = ___CAST(void*,___CAST(___F32*,___BODY(___arg4))+___INT(___arg5));
762 long len = ___INT(___FIXSUB(___arg3,___arg2)) * sizeof (___F32);
764 memmove (dst, src, len);
771 (define-prim ##subf64vector-move!
772 (c-lambda (scheme-object ;; src-vect
773 scheme-object ;; src-start
774 scheme-object ;; src-end
775 scheme-object ;; dst-vect
776 scheme-object) ;; dst-start
780 void *src = ___CAST(void*,___CAST(___F64*,___BODY(___arg1))+___INT(___arg2));
781 void *dst = ___CAST(void*,___CAST(___F64*,___BODY(___arg4))+___INT(___arg5));
782 long len = ___INT(___FIXSUB(___arg3,___arg2)) * sizeof (___F64);
784 memmove (dst, src, len);
790 ;;;----------------------------------------------------------------------------
792 ;; IEEE Scheme procedures:
794 (define-prim (##not obj)
797 (define-prim (not obj)
798 (macro-force-vars (obj)
801 (define-prim (boolean? obj)
802 (macro-force-vars (obj)
805 (define-prim (##boolean? obj)
806 (or (##eq? obj #t) (##eq? obj #f)))
808 ;; eqv? is defined in "_num.scm"
809 ;; eq? and equal? are defined in "_kernel.scm"
811 (define-fail-check-type pair-mutable 'mutable)
812 (define-fail-check-type subtyped-mutable 'mutable)
813 (define-fail-check-type pair 'pair)
814 (define-fail-check-type pair-list 'pair-list)
815 (define-fail-check-type list 'list)
817 (define-prim (##pair? obj))
819 (define-prim (##pair-mutable? obj))
821 (define-prim (pair? obj)
822 (macro-force-vars (obj)
825 (define-prim (##cons obj1 obj2))
827 (define-prim (cons obj1 obj2)
830 (##define-macro (define-prim-c...r-procedures from-length to-length)
832 (define (gen-name pattern)
834 (define (ads pattern)
837 (string-append (ads (quotient pattern 2))
838 (if (odd? pattern) "d" "a"))))
840 (string->symbol (string-append "c" (ads pattern) "r")))
848 (string->symbol (string-append "##" (symbol->string name)))))
850 (define (gen1 var pattern)
852 (if (= pattern 3) `(##cdr ,var) `(##car ,var))
853 `(let ((x ,(if (odd? pattern) `(##cdr ,var) `(##car ,var))))
854 ,(gen1 'x (quotient pattern 2)))))
856 (define (gen2 var pattern)
857 `(macro-check-pair ,var 1 (,name pair);;;;;;error message confusing?
859 (if (= pattern 3) `(##cdr ,var) `(##car ,var))
860 `(let ((x ,(if (odd? pattern) `(##cdr ,var) `(##car ,var))))
861 (macro-force-vars (x)
862 ,(gen2 'x (quotient pattern 2)))))))
864 `((define-prim (,##name pair)
867 (define-prim (,name pair)
868 (macro-force-vars (pair)
871 ,@(gen3 (+ i 1) j)))))
873 `(begin ,@(gen3 (expt 2 from-length) (- (expt 2 (+ to-length 1)) 1))))
875 (define-prim-c...r-procedures 1 4) ;; define car to cddddr
877 (define-prim (##set-car! pair val))
879 (define-prim (set-car! pair val)
880 (macro-force-vars (pair)
881 (macro-check-pair pair 1 (set-car! pair val)
882 (macro-check-pair-mutable pair 1 (set-car! pair val)
884 (##set-car! pair val)
887 (define-prim (##set-cdr! pair val))
889 (define-prim (set-cdr! pair val)
890 (macro-force-vars (pair)
891 (macro-check-pair pair 1 (set-cdr! pair val)
892 (macro-check-pair-mutable pair 1 (set-cdr! pair val)
894 (##set-cdr! pair val)
897 (define-prim (##null? obj)
900 (define-prim (null? obj)
901 (macro-force-vars (obj)
904 (define-prim (list? lst)
905 ;; This procedure may get into an infinite loop if another thread
906 ;; mutates "lst" (if lst1 and lst2 each point to disconnected cycles).
907 (let loop ((lst1 lst) (lst2 lst))
908 (macro-force-vars (lst1)
909 (if (##not (##pair? lst1))
911 (let ((lst1 (##cdr lst1)))
912 (macro-force-vars (lst1 lst2)
913 (cond ((##eq? lst1 lst2)
915 ((##not (##pair? lst2))
916 ;; this case is possible if other threads mutate the list
919 (loop (##cdr lst1) (##cdr lst2)))
921 (##null? lst1)))))))))
923 (define-prim (##list . lst)
926 (define-prim (list . lst)
929 (define-prim (##length lst)
930 (let loop ((x lst) (n 0))
932 (loop (##cdr x) (##fixnum.+ n 1))
935 (define-prim (length lst)
936 (let loop ((x lst) (n 0))
937 (macro-force-vars (x)
939 (loop (##cdr x) (##fixnum.+ n 1))
940 (macro-check-list x 1 (length lst)
943 (define-prim (##append lst1 lst2)
945 (##cons (##car lst1) (##append (##cdr lst1) lst2))
950 (lst1 (macro-absent-obj))
951 (lst2 (macro-absent-obj))
955 (define (append-multiple head tail arg-num)
958 (macro-force-vars (head)
960 (append-multiple (##car tail) (##cdr tail) (##fixnum.+ arg-num 1))
962 (append-multiple-non-null head
965 (##fixnum.+ arg-num 1)))))))
967 (define (append-multiple-non-null x lsts arg-num1 arg-num2)
968 ;; x!=(), returns fixnum on error
969 (let ((head (##car lsts))
972 (append-2-non-null x head arg-num1)
973 (macro-force-vars (head)
975 (append-multiple-non-null x
978 (##fixnum.+ arg-num2 1))
980 (append-multiple-non-null head
983 (##fixnum.+ arg-num2 1))))
985 (if (##fixnum? result)
987 (append-2-non-null x result arg-num1))
988 (append-2-non-null x result arg-num1))))))))
990 (define (append-2-non-null x y arg-num)
991 ;; x!=(), returns fixnum on error
993 (let ((head (##car x))
995 (macro-force-vars (tail)
998 (let ((result (append-2-non-null tail y arg-num)))
1000 (if (##fixnum? result)
1002 (##cons head result))
1003 (##cons head result))))))
1005 arg-num ;; error: list expected
1008 (define (list-expected-check result)
1010 (if (##fixnum? result)
1011 (macro-fail-check-list result (append lst1 lst2 . others))
1015 (cond ((##eq? lst2 (macro-absent-obj))
1016 (if (##eq? lst1 (macro-absent-obj))
1020 (macro-force-vars (lst1)
1023 (list-expected-check (append-2-non-null lst1 lst2 1)))))
1025 (append-multiple lst1 (##cons lst2 others) 1))))
1027 (define-prim (##reverse lst)
1028 (let loop ((x lst) (result '()))
1030 (loop (##cdr x) (##cons (##car x) result))
1033 (define-prim (reverse lst)
1034 (let loop ((x lst) (result '()))
1035 (macro-force-vars (x)
1037 (loop (##cdr x) (##cons (##car x) result))
1038 (macro-check-list x 1 (reverse lst)
1041 (define-prim (list-ref lst k)
1042 (macro-force-vars (k)
1043 (macro-check-index k 2 (list-ref lst k)
1044 (let loop ((x lst) (i k))
1045 (macro-force-vars (x)
1046 (macro-check-pair x 1 (list-ref lst k);;;;;;;error message confusing?
1047 (if (##fixnum.< 0 i)
1048 (loop (##cdr x) (##fixnum.- i 1))
1051 (define-prim (##memq obj lst)
1054 (if (##eq? obj (##car x))
1059 (define-prim (memq obj lst)
1060 (macro-force-vars (obj)
1062 (macro-force-vars (x)
1064 (let ((y (##car x)))
1065 (macro-force-vars (y)
1069 (macro-check-list x 2 (memq obj lst)
1072 (define-prim (memv obj lst)
1073 (macro-force-vars (obj)
1075 (macro-force-vars (x)
1077 (let ((y (##car x)))
1078 (macro-force-vars (y)
1080 (##declare (generic)) ;; avoid fixnum specific ##eqv?
1084 (macro-check-list x 2 (memv obj lst)
1087 (define-prim (##member obj lst)
1090 (if (##equal? obj (##car x))
1095 (define-prim (member obj lst)
1097 (macro-force-vars (x)
1099 (let ((y (##car x)))
1100 (if (##equal? obj y)
1103 (macro-check-list x 2 (member obj lst)
1106 (define-prim (##assq-cdr obj lst)
1109 (let ((couple (##car x)))
1110 (if (##eq? obj (##cdr couple))
1115 (define-prim (##assq obj lst)
1118 (let ((couple (##car x)))
1119 (if (##eq? obj (##car couple))
1124 (define-prim (assq obj lst)
1125 (macro-force-vars (obj)
1127 (macro-force-vars (x)
1129 (let ((couple (##car x)))
1130 (macro-force-vars (couple)
1131 (macro-check-pair-list couple 2 (assq obj lst)
1132 (let ((y (##car couple)))
1133 (macro-force-vars (y)
1136 (loop (##cdr x))))))))
1137 (macro-check-list x 2 (assq obj lst)
1140 (define-prim (assv obj lst)
1141 (macro-force-vars (obj)
1143 (macro-force-vars (x)
1145 (let ((couple (##car x)))
1146 (macro-force-vars (couple)
1147 (macro-check-pair-list couple 2 (assv obj lst)
1148 (let ((y (##car couple)))
1149 (macro-force-vars (y)
1151 (##declare (generic)) ;; avoid fixnum specific ##eqv?
1154 (loop (##cdr x))))))))
1155 (macro-check-list x 2 (assv obj lst)
1158 (define-prim (##assoc obj lst)
1161 (let ((couple (##car x)))
1162 (if (##equal? obj (##car couple))
1167 (define-prim (assoc obj lst)
1169 (macro-force-vars (x)
1171 (let ((couple (##car x)))
1172 (macro-force-vars (couple)
1173 (macro-check-pair-list couple 2 (assoc obj lst)
1174 (let ((y (##car couple)))
1175 (if (##equal? obj y)
1177 (loop (##cdr x)))))))
1178 (macro-check-list x 2 (assoc obj lst)
1181 (define-fail-check-type symbol 'symbol)
1183 (define-prim (##symbol? obj)
1184 (and (##subtyped? obj)
1185 (##eq? (##subtype obj) (macro-subtype-symbol))))
1187 (define-prim (symbol? obj)
1188 (macro-force-vars (obj)
1191 (define-prim (##symbol->string sym)
1192 (let ((name (macro-symbol-name sym)))
1193 (if (##fixnum? name)
1194 (let ((str (##string-append "g" (##number->string name 10))))
1195 (##declare (not interrupts-enabled))
1196 (let ((name (macro-symbol-name sym)))
1197 ;; Double-check in case a different thread has also called
1198 ;; and completed the call to ##symbol->string on this symbol.
1199 (if (##fixnum? name)
1201 (macro-symbol-name-set! sym str)
1206 (define-prim (symbol->string sym)
1207 (macro-force-vars (sym)
1208 (macro-check-symbol sym 1 (symbol->string sym)
1209 (##symbol->string sym))))
1211 (define-prim (##string->symbol str)
1212 (##make-interned-symbol str))
1214 (define-prim (string->symbol str)
1215 (macro-force-vars (str)
1216 (macro-check-string str 1 (string->symbol str)
1217 (##string->symbol str))))
1219 (define-prim (##uninterned-symbol? obj)
1220 (and (##symbol? obj)
1221 (##not (macro-symbol-next obj))))
1223 (define-prim (uninterned-symbol? obj)
1224 (macro-force-vars (obj)
1225 (##uninterned-symbol? obj)))
1227 (define ##symbol-counter 0)
1229 (define-prim (##make-uninterned-symbol
1232 (hash (macro-absent-obj)))
1234 ;; str must be a nonmutable string
1236 (if (##eq? hash (macro-absent-obj))
1237 (let ((n (##fixnum.+ ##symbol-counter 1)))
1238 ;; Note: it is unimportant if the increment of ##symbol-counter
1239 ;; is not atomic; it simply means a possible close repetition
1240 ;; of the same hash code
1241 (set! ##symbol-counter n)
1242 (macro-make-uninterned-symbol str (##partial-bit-reverse n)))
1243 (macro-make-uninterned-symbol str hash)))
1245 (define-prim (make-uninterned-symbol
1248 (hash (macro-absent-obj)))
1249 (macro-force-vars (str hash)
1250 (macro-check-string str 1 (make-uninterned-symbol str hash)
1251 (if (##eq? hash (macro-absent-obj))
1252 (##make-uninterned-symbol str)
1253 (macro-check-fixnum-range-incl hash 2 0 536870911 (make-uninterned-symbol str hash)
1254 (##make-uninterned-symbol str hash))))))
1256 ;; Number related procedures are in "_num.scm"
1258 (define-fail-check-type char 'char)
1259 (define-fail-check-type char-list 'char-list)
1261 (define-prim (##char? obj))
1263 (define-prim (char? obj)
1264 (macro-force-vars (obj)
1267 (define-prim-nary-bool (##char=? x y)
1274 (define-prim-nary-bool (char=? x y)
1281 (define-prim-nary-bool (##char<? x y)
1288 (define-prim-nary-bool (char<? x y)
1295 (define-prim-nary-bool (##char>? x y)
1302 (define-prim-nary-bool (char>? x y)
1309 (define-prim-nary-bool (##char<=? x y)
1312 (##not (##char<? y x))
1316 (define-prim-nary-bool (char<=? x y)
1319 (##not (##char<? y x))
1323 (define-prim-nary-bool (##char>=? x y)
1326 (##not (##char<? x y))
1330 (define-prim-nary-bool (char>=? x y)
1333 (##not (##char<? x y))
1337 (##define-macro (case-independent-char=? x y)
1338 `(##char=? (##char-downcase ,x) (##char-downcase ,y)))
1340 (##define-macro (case-independent-char<? x y)
1341 `(##char<? (##char-downcase ,x) (##char-downcase ,y)))
1343 (define-prim-nary-bool (##char-ci=? x y)
1346 (case-independent-char=? x y)
1350 (define-prim-nary-bool (char-ci=? x y)
1353 (case-independent-char=? x y)
1357 (define-prim-nary-bool (##char-ci<? x y)
1360 (case-independent-char<? x y)
1364 (define-prim-nary-bool (char-ci<? x y)
1367 (case-independent-char<? x y)
1371 (define-prim-nary-bool (##char-ci>? x y)
1374 (case-independent-char<? y x)
1378 (define-prim-nary-bool (char-ci>? x y)
1381 (case-independent-char<? y x)
1385 (define-prim-nary-bool (##char-ci<=? x y)
1388 (##not (case-independent-char<? y x))
1392 (define-prim-nary-bool (char-ci<=? x y)
1395 (##not (case-independent-char<? y x))
1399 (define-prim-nary-bool (##char-ci>=? x y)
1402 (##not (case-independent-char<? x y))
1406 (define-prim-nary-bool (char-ci>=? x y)
1409 (##not (case-independent-char<? x y))
1413 (define-prim (##char-alphabetic? c))
1415 (define-prim (char-alphabetic? c)
1416 (macro-force-vars (c)
1417 (macro-check-char c 1 (char-alphabetic? c)
1418 (##char-alphabetic? c))))
1420 (define-prim (##char-numeric? c))
1422 (define-prim (char-numeric? c)
1423 (macro-force-vars (c)
1424 (macro-check-char c 1 (char-numeric? c)
1425 (##char-numeric? c))))
1427 (define-prim (##char-whitespace? c))
1429 (define-prim (char-whitespace? c)
1430 (macro-force-vars (c)
1431 (macro-check-char c 1 (char-whitespace? c)
1432 (##char-whitespace? c))))
1434 (define-prim (##char-upper-case? c))
1436 (define-prim (char-upper-case? c)
1437 (macro-force-vars (c)
1438 (macro-check-char c 1 (char-upper-case? c)
1439 (##char-upper-case? c))))
1441 (define-prim (##char-lower-case? c))
1443 (define-prim (char-lower-case? c)
1444 (macro-force-vars (c)
1445 (macro-check-char c 1 (char-lower-case? c)
1446 (##char-lower-case? c))))
1448 (define-prim (char->integer c)
1449 (macro-force-vars (c)
1450 (macro-check-char c 1 (char->integer c)
1451 (##fixnum.<-char c))))
1453 (define-prim (integer->char n)
1454 (macro-force-vars (n)
1455 (macro-check-fixnum-range-incl n 1 0 ##max-char (integer->char n)
1456 (if (or (##fixnum.< n #xd800)
1457 (##fixnum.< #xdfff n))
1459 (##raise-range-exception 1 integer->char n)))))
1461 (define-prim (##char-upcase c))
1463 (define-prim (char-upcase c)
1464 (macro-force-vars (c)
1465 (macro-check-char c 1 (char-upcase c)
1466 (##char-upcase c))))
1468 (define-prim (##char-downcase c))
1470 (define-prim (char-downcase c)
1471 (macro-force-vars (c)
1472 (macro-check-char c 1 (char-downcase c)
1473 (##char-downcase c))))
1475 (define-prim (##string=? str1 str2)
1476 (or (##eq? str1 str2)
1477 (let ((len1 (##string-length str1)))
1478 (if (##eq? len1 (##string-length str2))
1479 (let loop ((i (##fixnum.- len1 1)))
1480 (cond ((##fixnum.< i 0)
1482 ((##char=? (##string-ref str1 i) (##string-ref str2 i))
1483 (loop (##fixnum.- i 1)))
1488 (define-prim-nary-bool (string=? str1 str2)
1491 (##string=? str1 str2)
1495 (define-prim (##string<? str1 str2)
1496 (and (##not (##eq? str1 str2))
1497 (let ((len1 (##string-length str1))
1498 (len2 (##string-length str2)))
1499 (let ((n (##fixnum.min len1 len2)))
1501 (if (##fixnum.< i n)
1502 (let ((c1 (##string-ref str1 i))
1503 (c2 (##string-ref str2 i)))
1504 (if (##char=? c1 c2)
1505 (loop (##fixnum.+ i 1))
1507 (##fixnum.< n len2)))))))
1509 (define-prim-nary-bool (string<? str1 str2)
1512 (##string<? str1 str2)
1516 (define-prim-nary-bool (string>? str1 str2)
1519 (##string<? str2 str1)
1523 (define-prim-nary-bool (string<=? str1 str2)
1526 (##not (##string<? str2 str1))
1530 (define-prim-nary-bool (string>=? str1 str2)
1533 (##not (##string<? str1 str2))
1537 (define-prim (##string-ci=? str1 str2)
1538 (or (##eq? str1 str2)
1539 (let ((len1 (##string-length str1)))
1540 (if (##eq? len1 (##string-length str2))
1541 (let loop ((i (##fixnum.- len1 1)))
1542 (cond ((##fixnum.< i 0)
1544 ((##char=? (##char-downcase (##string-ref str1 i))
1545 (##char-downcase (##string-ref str2 i)))
1546 (loop (##fixnum.- i 1)))
1551 (define-prim-nary-bool (string-ci=? str1 str2)
1554 (##string-ci=? str1 str2)
1558 (define-prim (##string-ci<? str1 str2)
1559 (and (##not (##eq? str1 str2))
1560 (let ((len1 (##string-length str1))
1561 (len2 (##string-length str2)))
1562 (let ((n (##fixnum.min len1 len2)))
1564 (if (##fixnum.< i n)
1565 (let ((c1 (##char-downcase (##string-ref str1 i)))
1566 (c2 (##char-downcase (##string-ref str2 i))))
1567 (if (##char=? c1 c2)
1568 (loop (##fixnum.+ i 1))
1570 (##fixnum.< n len2)))))))
1572 (define-prim-nary-bool (string-ci<? str1 str2)
1575 (##string-ci<? str1 str2)
1579 (define-prim-nary-bool (string-ci>? str1 str2)
1582 (##string-ci<? str2 str1)
1586 (define-prim-nary-bool (string-ci<=? str1 str2)
1589 (##not (##string-ci<? str2 str1))
1593 (define-prim-nary-bool (string-ci>=? str1 str2)
1596 (##not (##string-ci<? str1 str2))
1600 (define-prim (##copy-string-list lst)
1602 (define (copy lst i)
1603 (macro-force-vars (lst)
1604 (cond ((##pair? lst)
1605 (let ((str (##car lst)))
1606 (macro-force-vars (str)
1608 (let ((x (copy (##cdr lst) (##fixnum.+ i 1))))
1620 (define-fail-check-type procedure 'procedure)
1622 (define-prim (##procedure? obj)
1623 (and (##subtyped? obj)
1624 (##eq? (##subtype obj) (macro-subtype-procedure))))
1626 (define-prim (procedure? obj)
1627 (macro-force-vars (obj)
1628 (##procedure? obj)))
1630 ;; apply is in "_kernel.scm"
1632 (define-prim (##map proc lst)
1635 (##cons (proc (##car x)) (loop (##cdr x)))
1638 (define-prim (map proc x . y)
1639 (macro-force-vars (proc)
1640 (macro-check-procedure proc 1 (map proc x . y)
1643 (define (proper-list-length lst)
1644 (let loop ((lst lst) (n 0))
1645 (macro-force-vars (lst)
1646 (cond ((##pair? lst)
1647 (loop (##cdr lst) (##fixnum.+ n 1)))
1653 (define (map-1 lst1)
1654 (macro-force-vars (lst1)
1656 (let ((result (proc (##car lst1))))
1657 (##cons result (map-1 (##cdr lst1))))
1662 (let ((lst1 (##car lsts)))
1663 (macro-force-vars (lst1)
1664 (let ((head (##car lst1)))
1665 (let ((tail (cars (##cdr lsts))))
1666 (##cons head tail)))))
1671 (let ((lst1 (##car lsts)))
1672 (macro-force-vars (lst1)
1673 (let ((head (##cdr lst1)))
1675 (let ((tail (cdrs (##cdr lsts))))
1677 (##cons head tail)))
1681 (define (map-n lsts)
1683 (let ((result (##apply proc (cars lsts))))
1684 (##cons result (map-n (cdrs lsts))))
1689 (let ((len1 (proper-list-length x)))
1692 (macro-fail-check-list 2 (map proc x . y))))
1696 (let ((len1 (proper-list-length x)))
1698 (let loop ((lsts y) (arg-num 3))
1702 (map-n (##cons x y)))
1703 (let ((len2 (proper-list-length (##car lsts))))
1704 (if (##eq? len1 len2)
1705 (loop (##cdr lsts) (##fixnum.+ arg-num 1))
1707 (##raise-improper-length-list-exception
1714 (macro-fail-check-list
1716 (map proc x . y)))))))
1717 (macro-fail-check-list 2 (map proc x . y))))
1720 (map-n (##cons x y))))))))))
1722 (define-prim (##for-each proc lst)
1730 (define-prim (for-each proc x . y)
1731 (macro-force-vars (proc)
1732 (macro-check-procedure proc 1 (for-each proc x . y)
1735 (define (proper-list-length lst)
1736 (let loop ((lst lst) (n 0))
1737 (macro-force-vars (lst)
1738 (cond ((##pair? lst)
1739 (loop (##cdr lst) (##fixnum.+ n 1)))
1745 (define (for-each-1 lst1)
1746 (macro-force-vars (lst1)
1748 (let ((result (proc (##car lst1))))
1749 (for-each-1 (##cdr lst1)))
1754 (let ((lst1 (##car lsts)))
1755 (macro-force-vars (lst1)
1756 (let ((head (##car lst1)))
1757 (let ((tail (cars (##cdr lsts))))
1758 (##cons head tail)))))
1763 (let ((lst1 (##car lsts)))
1764 (macro-force-vars (lst1)
1765 (let ((head (##cdr lst1)))
1767 (let ((tail (cdrs (##cdr lsts))))
1769 (##cons head tail)))
1773 (define (for-each-n lsts)
1774 (let ((tails (cdrs lsts)))
1777 (##apply proc (cars lsts))
1779 (##apply proc (cars lsts)))))
1783 (let ((len1 (proper-list-length x)))
1786 (macro-fail-check-list 2 (for-each proc x . y))))
1790 (let ((len1 (proper-list-length x)))
1792 (let loop ((lsts y) (arg-num 3))
1795 (for-each-n (##cons x y))
1797 (let ((len2 (proper-list-length (##car lsts))))
1798 (if (##eq? len1 len2)
1799 (loop (##cdr lsts) (##fixnum.+ arg-num 1))
1801 (##raise-improper-length-list-exception
1808 (macro-fail-check-list
1810 (for-each proc x . y)))))))
1811 (macro-fail-check-list 2 (for-each proc x . y))))
1813 (for-each-n (##cons x y))
1816 ;; call-with-current-continuation is in "_kernel.scm"
1818 ;; Port related procedures are in "_io.scm"
1820 ;;;----------------------------------------------------------------------------
1822 ;; R4RS Scheme procedures:
1824 (define-prim (list-tail lst k)
1825 (macro-force-vars (k)
1826 (macro-check-index k 2 (list-tail lst k)
1827 (let loop ((x lst) (i k))
1828 (if (##fixnum.< 0 i)
1829 (macro-force-vars (x)
1830 (macro-check-pair x 1 (list-tail lst k);;;;;;;;;;error message confusing?
1831 (loop (##cdr x) (##fixnum.- i 1))))
1834 (define-prim (##make-promise thunk)
1835 (macro-make-promise thunk))
1837 (define-prim (##force obj))
1839 (define-prim (force obj)
1842 ;; Port related procedures are in "_io.scm"
1844 ;;;----------------------------------------------------------------------------
1846 ;; R5RS Scheme procedures:
1848 ;; values, call-with-values and dynamic-wind are in "_thread.scm"
1851 ;;(scheme-report-environment version)
1852 ;;(null-environment version)
1853 ;;(interaction-environment)
1855 ;;;----------------------------------------------------------------------------
1857 ;; Multilisp procedures:
1859 (define-prim (touch obj)
1862 ;;;----------------------------------------------------------------------------
1864 ;; DSSSL procedures:
1866 (define-fail-check-type keyword 'keyword)
1868 (define-prim (##keyword? obj)
1869 (and (##subtyped? obj)
1870 (##eq? (##subtype obj) (macro-subtype-keyword))))
1872 (define-prim (keyword? obj)
1875 (define-prim (##keyword->string key)
1876 (let ((name (macro-keyword-name key)))
1877 (if (##fixnum? name)
1878 (let ((str (##string-append "g" (##number->string name 10))))
1879 (##declare (not interrupts-enabled))
1880 (let ((name (macro-keyword-name key)))
1881 ;; Double-check in case a different thread has also called
1882 ;; and completed the call to ##keyword->string on this keyword.
1883 (if (##fixnum? name)
1885 (macro-keyword-name-set! key str)
1890 (define-prim (keyword->string key)
1891 (macro-force-vars (key)
1892 (macro-check-keyword key 1 (keyword->string key)
1893 (##keyword->string key))))
1895 (define-prim (##string->keyword str)
1896 (##make-interned-keyword str))
1898 (define-prim (string->keyword str)
1899 (macro-force-vars (str)
1900 (macro-check-string str 1 (string->keyword str)
1901 (##string->keyword str))))
1903 (define-prim (##uninterned-keyword? obj)
1904 (and (##keyword? obj)
1905 (##not (macro-keyword-next obj))))
1907 (define-prim (uninterned-keyword? obj)
1908 (macro-force-vars (obj)
1909 (##uninterned-keyword? obj)))
1911 (define ##keyword-counter 0)
1913 (define-prim (##make-uninterned-keyword
1916 (hash (macro-absent-obj)))
1918 ;; str must be a nonmutable string
1920 (if (##eq? hash (macro-absent-obj))
1921 (let ((n (##fixnum.+ ##keyword-counter 1)))
1922 ;; Note: it is unimportant if the increment of ##keyword-counter
1923 ;; is not atomic; it simply means a possible close repetition
1924 ;; of the same hash code
1925 (set! ##keyword-counter n)
1926 (macro-make-uninterned-keyword str (##partial-bit-reverse n)))
1927 (macro-make-uninterned-keyword str hash)))
1929 (define-prim (make-uninterned-keyword
1932 (hash (macro-absent-obj)))
1933 (macro-force-vars (str hash)
1934 (macro-check-string str 1 (make-uninterned-keyword str hash)
1935 (if (##eq? hash (macro-absent-obj))
1936 (##make-uninterned-keyword str)
1937 (macro-check-fixnum-range-incl hash 2 0 536870911 (make-uninterned-keyword str hash)
1938 (##make-uninterned-keyword str hash))))))
1940 (define-prim (##partial-bit-reverse i)
1942 (##define-macro (bit n)
1943 `(##fixnum.arithmetic-shift-left
1944 (##fixnum.bitwise-and i ,(expt 2 n)) ,(- 28 (* 2 n))))
1974 (bit 14))))))))))))))))
1976 ;;;============================================================================