pcs/newpcs/pstd.s

452 lines
11 KiB
Common Lisp
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; -*- Mode: Lisp -*- Filename: pstd.s
;--------------------------------------------------------------------------;
; ;
; TI SCHEME -- PCS Compiler ;
; Copyright 1985 (c) Texas Instruments ;
; ;
; David Bartley ;
; ;
; Standard SCHEME Routines ;
; ;
;--------------------------------------------------------------------------;
; Modification History:
;
; tc 2/10/87 fixed implode for non-lists and lists with floats
; tc 2/10/87 BOOLEAN? and PROCEDURE? added for R^3 Report
; tc 6/01/87 seperated PSTD and PSTD2 for compiler-less system
; tc 6/09/87 made list-tail a primitive operation
(begin
(define-integrable 1+ ; 1+
(lambda (n)(+ n 1)))
(define-integrable -1+ ; -1+
(lambda (n)(- n 1)))
(define-integrable add1 ; ADD1
(lambda (n)(+ n 1)))
(define-integrable apply ; APPLY
(lambda (fn args)
(%apply fn args)))
(define-integrable caaaar (lambda (x) (caar (caar x)))) ; CAXXXR
(define-integrable caaadr (lambda (x) (caar (cadr x))))
(define-integrable caadar (lambda (x) (caar (cdar x))))
(define-integrable caaddr (lambda (x) (caar (cddr x))))
(define-integrable cadaar (lambda (x) (cadr (caar x))))
(define-integrable cadadr (lambda (x) (cadr (cadr x))))
(define-integrable caddar (lambda (x) (cadr (cdar x))))
;(define-integrable cadddr (lambda (x) (cadr (cddr x))))
(define-integrable call/cc ; CALL/CC
(lambda (exp)
(%call/cc exp)))
(define-integrable call-with-current-continuation ; CALL-w-c-c
(lambda (exp)
(%call/cc exp)))
(define-integrable cdaaar (lambda (x) (cdar (caar x)))) ; CDXXXR
(define-integrable cdaadr (lambda (x) (cdar (cadr x))))
(define-integrable cdadar (lambda (x) (cdar (cdar x))))
(define-integrable cdaddr (lambda (x) (cdar (cddr x))))
(define-integrable cddaar (lambda (x) (cddr (caar x))))
(define-integrable cddadr (lambda (x) (cddr (cadr x))))
(define-integrable cdddar (lambda (x) (cddr (cdar x))))
(define-integrable cddddr (lambda (x) (cddr (cddr x))))
(define-integrable empty-stream? ; EMPTY-STREAM?
(lambda (x)
(eq? x the-empty-stream)))
(define-integrable modulo ; MODULO
(lambda (p q)
(let ((rem (remainder p q)))
(if (negative? (* p q))
(if (zero? rem)
rem
(+ rem q))
rem))))
(define-integrable null? ; NULL?
(lambda (obj)
(not obj)))
(define-integrable reverse ; REVERSE
(lambda (L)
(reverse! (%append L '()))))
(define-integrable sub1 ; SUB1
(lambda (n)(- n 1)))
(define-integrable procedure? ; PROCEDURE?
(lambda (obj)
(proc? obj)))
); end begin
(begin
(define ascii->symbol ; ASCII->SYMBOL
(lambda (n)
(string->symbol (make-string 1 (integer->char n)))))
(define (copy x) ; COPY
(if (atom? x)
x
(cons (copy (car x))
(copy (cdr x)))))
(define %delay ; %DELAY
(lambda (state)
(lambda ()
(when (closure? state) ; not yet memoized?
(set! state (list (state))))
(car state))))
(define delayed-object? ; DELAYED-OBJECT?
(lambda (obj)
(and (vector? obj)
(positive? (vector-length obj))
(eq? (vector-ref obj 0) '#!DELAYED-OBJECT))))
(define (delete! obj lst) ; DELETE!
(letrec ((loop (lambda (obj a b z)
(cond ((atom? b)
z)
((equal? obj (car b))
(set-cdr! a (cdr b))
(loop obj a (cdr b) z))
(else
(loop obj b (cdr b) z))))))
(cond ((atom? lst)
'())
((equal? obj (car lst))
(delete! obj (cdr lst)))
(else
(loop obj lst (cdr lst) lst)))))
(define (delq! obj lst) ; DELQ!
(letrec ((loop (lambda (obj a b z)
(cond ((atom? b)
z)
((eq? obj (car b))
(set-cdr! a (cdr b))
(loop obj a (cdr b) z))
(else
(loop obj b (cdr b) z))))))
(cond ((atom? lst)
'())
((eq? obj (car lst))
(delq! obj (cdr lst)))
(else
(loop obj lst (cdr lst) lst)))))
(define %execute ; %EXECUTE
(lambda (compiled-object)
(%%execute compiled-object))) ; dangerous primitive!
(define exit ; EXIT
(lambda ()
(transcript-off)
(%halt)
(reset)))
(define explode ; EXPLODE
(lambda (obj)
(let ((x (if (symbol? obj)
(symbol->string obj)
obj)))
(cond ((string? x)
(do ((x x x)
(index 0
(add1 index))
(end (string-length x)
end)
(result '()
(cons (string->symbol
(substring x index (+ index 1)))
result)))
((= index end)
(reverse! result))))
((integer? x)
(do ((n (abs x)
(quotient n 10))
(result '()
(cons (ascii->symbol (+ (remainder n 10) 48))
result)))
((< n 10)
(let ((result (cons (ascii->symbol (+ n 48)) result)))
(if (negative? x) (cons '- result) result)))))
(else x)))))
(define for-each ; FOR-EACH
(lambda (f l)
(do ((f f f)
(l l (cdr l)))
((atom? l))
(f (car l)))))
(define force ; FORCE
(lambda (obj)
(if (and (vector? obj)
(positive? (vector-length obj))
(eq? (vector-ref obj 0) '#!DELAYED-OBJECT))
((vector-ref obj 1))
(%error-invalid-operand 'FORCE obj))))
(define gc ; GC
(lambda args
;; do NOT define with define DEFINE-INTEGRABLE !!
;; do NOT hoist the call to %CLEAR-REGISTERS
(cond ((or (null? args)
(null? (car args)))
(%clear-registers) ; unbind the VM registers
(%garbage-collect)) ; invoke the GC operation
(else
(%clear-registers) ; unbind the VM registers
(%compact-memory))))) ; GC and compaction both
(define gcd ; GCD
(lambda args
(letrec ((gcd*
(lambda (args result)
(if (null? args)
result
(gcd* (cdr args)
(gcd2 (abs (car args)) result)))))
(gcd2
(lambda (p q)
(if (zero? q)
p
(gcd2 q (remainder p q))))))
(gcd* args 0))))
(define gensym ; GENSYM
(letrec
((counter->string
(lambda (c n)
(cond ((positive? c)
(let ((string (counter->string (quotient c 10)(+ n 1))))
(string-set! string
(- (string-length string) n 1)
(string-ref "0123456789" (remainder c 10)))
string))
((zero? n)
"0")
(else
(make-string n '()))))))
(let ((string "G")
(counter -1))
(lambda args
(set! counter (+ counter 1))
(when (not (null? args))
(let ((arg (car args)))
(cond ((integer? arg)
(set! counter (abs arg)))
((string? arg)
(set! string arg))
((symbol? arg)
(set! string (symbol->string arg)))
(else '()))))
(string->uninterned-symbol
(string-append string
(counter->string counter 0)))))))
(define head ; HEAD
(lambda (stream)
(if (and (vector? stream)
(positive? (vector-length stream))
(eq? (vector-ref stream 0) '#!STREAM))
(vector-ref stream 1)
(%error-invalid-operand 'HEAD stream))))
(define implode ; IMPLODE
(lambda (L)
(cond ((null? L) '||)
((atom? L)
(%error-invalid-operand 'implode L))
(else
(let ((n (length L)))
(do ((L L
(cdr L))
(string (make-string n '())
string)
(index 0
(add1 index)))
((null? L)
(string->symbol string))
(let* ((x (car L)))
(string-set!
string
index
(cond ((symbol? x)
(string-ref (symbol->string x) 0))
((string? x)
(string-ref x 0))
((char? x)
x)
((integer? x)
(integer->char x))
(else
(error "Invalid list element fot IMPLODE" x)) )))))))))
(define lcm ; LCM
(letrec ((lcm*
(lambda (args result)
(if (null? args)
result
(let ((a (car args)))
(if (zero? a)
0
(lcm* (cdr args)
(quotient (abs (* a result))
(gcd a result)))))))))
(lambda args
(lcm* args 1))))
(define (list->stream L) ; LIST->STREAM
(if (null? L)
the-empty-stream
(let ((heapL L)) ; control heap allocation of L
(cons-stream (car L)
(list->stream (cdr heapL))))))
(define list->vector ; LIST->VECTOR
(lambda (L)
(let ((n (length L)))
(do ((v (make-vector n) v)
(i 0 (1+ i))
(L L (cdr L)))
((null? L) v)
(vector-set! v i (car L))))))
(define list-ref ; LIST-REF
(lambda (x n)
(car (list-tail x n))))
;;;
;;; List-tail was re-defined as a primitive on 6-9-87
;;;
;;;(define (list-tail x n) ; LIST-TAIL
;;; (if (positive? n)
;;; (list-tail (cdr x)(sub1 n))
;;; x))
(define map ; MAP
(lambda (f l)
(do ((f f f)
(l l (cdr l))
(acc '() (cons (f (car l)) acc)))
((atom? l)
(reverse! acc)))))
(define mapc ; MAPC
for-each)
(define mapcar ; MAPCAR
map)
(define random ; RANDOM
(letrec ((loop
(lambda (r m+ m)
(if (> r m+) ; enough precision?
(remainder r m)
(loop (+ (* r 8192)(%random)) m+ m)))))
(lambda (m)
(let ((r (%random))) ; 14 bits
(if (and (< m 10241) (< r (- 16383 (remainder 16383 m)))) ;10 bits scaled by 10, plus 1
(remainder r m)
(loop r (* m 1024) m))))))
(define (randomize seed) ; RANDOMIZE
(let ((|2^32-1| (sub1 (* 65536 65536))))
(if (and (<= (minus |2^32-1|) seed)
(<= seed |2^32-1|))
(%esc2 20 seed) ;seed with the given number
(%esc2 20 0)))) ;seed derived from time of day
(define runtime ; RUNTIME
(lambda ()
(let* ((t1 (%internal-time))
(hours (car t1))
(minutes (cadr t1))
(seconds (caddr t1))
(hundreds (cadddr t1)))
(+ (* 100 (+ (* 60 (+ (* 60 hours)
minutes))
seconds))
hundreds))))
(define stream? ; STREAM?
(lambda (obj)
(or (eq? obj the-empty-stream)
(and (vector? obj)
(positive? (vector-length obj))
(eq? (vector-ref obj 0) '#!STREAM)))))
(define (stream->list stream) ; STREAM->LIST
(if (empty-stream? stream)
'()
(cons (head stream)
(stream->list (tail stream)))))
(define symbol->ascii ; SYMBOL->ASCII
(lambda (s)
(char->integer (string-ref (symbol->string s) 0))))
(define tail ; TAIL
(lambda (stream)
(if (and (vector? stream)
(positive? (vector-length stream))
(eq? (vector-ref stream 0) '#!STREAM))
((vector-ref stream 2))
(%error-invalid-operand 'TAIL stream))))
(define thaw ; THAW
(lambda (thunk)
(thunk)))
(define vector->list ; VECTOR->LIST
(lambda (v)
(do ((n (vector-length v) n)
(i 0 (1+ i))
(L '() (cons (vector-ref v i) L)))
((>= i n)
(reverse! L)))))
(define boolean? ; BOOLEAN?
(lambda (obj)
(or (eq? obj #T) (null? obj) #F)))
); end begin