From a69c9fb665459e2bfdbda1bf80741a0af31a7faf Mon Sep 17 00:00:00 2001 From: Bryan Newbold Date: Mon, 20 Feb 2017 00:06:40 -0800 Subject: New upstream version 3b5 --- guile.init | 392 ++++++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 308 insertions(+), 84 deletions(-) mode change 100644 => 100755 guile.init (limited to 'guile.init') diff --git a/guile.init b/guile.init old mode 100644 new mode 100755 index 1b59833..a728e33 --- a/guile.init +++ b/guile.init @@ -3,8 +3,166 @@ ;;; ;;; This code is in the public domain. -(if (not (and (string<=? "1.6" (version)) (string=? (version) "1.8.6") + (define-module (ice-9 slib) + :export + ( + <=? + =? + >? + A:bool + A:fixN16b + A:fixN32b + A:fixN64b + A:fixN8b + A:fixZ16b + A:fixZ32b + A:fixZ64b + A:fixZ8b + A:floC128b + A:floC16b + A:floC32b + A:floC64b + A:floR128b + A:floR128d + A:floR16b + A:floR32b + A:floR32d + A:floR64b + A:floR64d + a:bool + a:fixn16b + a:fixn32b + a:fixn64b + a:fixn8b + a:fixz16b + a:fixz32b + a:fixz64b + a:fixz8b + a:floc128b + a:floc16b + a:floc32b + a:floc64b + a:flor128b + a:flor128d + a:flor16b + a:flor32b + a:flor32d + a:flor64b + a:flor64d + any-bits-set? + arithmetic-shift + array-indexes + array-null? + array:copy! + ;; ac32 + ;; ac64 + ;; ar32 + ;; ar64 + ;; as16 + ;; as32 + ;; as64 + ;; as8 + ;; at1 + ;; au16 + ;; au32 + ;; au64 + ;; au8 + bit-field + bit-reverse + bit-set? + bitwise-and + bitwise-if + bitwise-ior + bitwise-merge + bitwise-not + bitwise-xor + booleans->integer + browse-url + call-with-open-ports + copy-bit + copy-bit-field + create-array + ;;define + defmacro:eval + defmacro:expand* + defmacro:load + ;;delete-file + difftime + ;;file-position + first-set-bit + gentemp + home-vicinity + implementation-vicinity + integer->list + library-vicinity + list->array + list->integer + log2-binary-factors + logical:ash + logical:bit-extract + logical:integer-expt + logical:integer-length + ;;logical:ipow-by-squaring + logical:logand + logical:logcount + logical:logior + logical:lognot + logical:logxor + macro:eval + macro:load + make-array + make-exchanger + make-random-state + ;;make-uniform-wrapper + make-vicinity + ;; nil + offset-time + ;;open-file + output-port-height + output-port-width + pathname->vicinity + program-vicinity + random:chunk + reverse-bit-field + rotate-bit-field + scheme-implementation-home-page + scheme-implementation-type + scheme-implementation-version + ;; slib-module + slib:error + slib:eval + slib:eval-load + slib:exit + ;; slib:features + slib:form-feed + slib:load + slib:load-compiled + slib:load-source + slib:tab + slib:warn + software-type + sub-vicinity + ;;system + system->line + ;; t + user-vicinity + vector->array + ;; vicinity:suffix? + ;; with-load-pathname + ) + :no-backtrace)) + (else + (define-module (ice-9 slib)))) (define slib-module (current-module)) (define base:define define) @@ -14,10 +172,10 @@ (cons (if (= 1 (length env)) 'define-public 'base:define) (cdr exp))))) ;;; Hack to make syncase macros work in the slib module -(if (nested-ref the-root-module '(app modules ice-9 syncase)) - (set-object-property! (module-local-variable (current-module) 'define) - '*sc-expander* - '(define))) + (if (nested-ref the-root-module '(app modules ice-9 syncase)) + (set-object-property! (module-local-variable (current-module) 'define) + '*sc-expander* + '(define))) ;;; (software-type) should be set to the generic operating system type. ;;; UNIX, VMS, MACOS, AMIGA and MS-DOS are supported. @@ -49,11 +207,14 @@ ;; (vic (substring path 0 (- (string-length path) 11)))) ;; (lambda () vic))) ;; -;;; Rob Browning says %site-dir exists since Guile-1.6 +;;; Rob Browning says %site-dir exists since Guile-1.6. But Thomas +;;; Bushnell points out that %site-dir mashes the slibcat for all +;;; versions together. %library-dir (also since Guile-1.6) is the +;;; versioned directory. (define implementation-vicinity (cond ((and (defined? 'getenv) (getenv "GUILE_IMPLEMENTATION_PATH")) => (lambda (path) (lambda () path))) - (else %site-dir))) + (else %library-dir))) ;;; (library-vicinity) should be defined to be the pathname of the ;;; directory where files of Scheme library functions reside. @@ -63,13 +224,12 @@ ;; Use this getenv if your implementation supports it. (and (defined? 'getenv) (getenv "SCHEME_LIBRARY_PATH")) ;; Rob Browning sent this; I'm not sure its a good idea. - ;; See if we can find slib/guile.init (cf. implementation-vicinity). - (let ((path (%search-load-path "slib/guile.init"))) - (and path (substring path 0 (- (string-length path) 10)))) + ;; See if we can find slib/guile.init (cf. implementation-vicinity). + (let ((path (%search-load-path "slib/guile.init"))) + (and path (substring path 0 (- (string-length path) 10)))) ;; Use this path if your scheme does not support GETENV ;; or if SCHEME_LIBRARY_PATH is not set. - "/usr/lib/slib/" - (in-vicinity (implementation-vicinity) "slib/")))) + "/usr/share/slib/"))) (lambda () library-path))) ;;; (home-vicinity) should return the vicinity of the user's HOME @@ -214,7 +374,7 @@ ;; Other common features -;;; srfi-0 ;srfi-0, COND-EXPAND finds all srfi-* + srfi-0 ;srfi-0, COND-EXPAND finds all srfi-* ;;; sicp ;runs code from Structure and ;Interpretation of Computer ;Programs by Abelson and Sussman. @@ -271,12 +431,12 @@ ;; calling waitpid with WUNTRACED, but allow for it anyway, just in ;; case. (define system - (let ((guile-core-system system)) - (lambda (str) - (define st (guile-core-system str)) - (or (status:exit-val st) - (+ 128 (or (status:term-sig st) - (status:stop-sig st))))))) + (let ((guile-core-system system)) + (lambda (str) + (define st (guile-core-system str)) + (or (status:exit-val st) + (+ 128 (or (status:term-sig st) + (status:stop-sig st))))))) ;; This has to be done after the definition so that the original ;; binding will still be visible during the definition. (if (string>=? (scheme-implementation-version) "1.8") @@ -343,17 +503,16 @@ (for-each close-port ports) ans)) -(if (not (defined? 'browse-url)) - ;; Nothing special to do for this, so straight from - ;; Template.scm. Maybe "sensible-browser" for a debian - ;; system would be worth trying too (and would be good on a - ;; tty). - (define (browse-url url) +;; Nothing special to do for this, so straight from +;; Template.scm. Maybe "sensible-browser" for a debian +;; system would be worth trying too (and would be good on a +;; tty). +(define (browse-url url) (define (try cmd end) (zero? (system (string-append cmd url end)))) (or (try "netscape-remote -remote 'openURL(" ")'") (try "netscape -remote 'openURL(" ")'") (try "netscape '" "'&") - (try "netscape '" "'")))) + (try "netscape '" "'"))) ;;; "rationalize" adjunct procedures. ;;(define (find-ratio x e) @@ -365,8 +524,13 @@ ;;; CHAR-CODE-LIMIT is one greater than the largest integer which can ;;; be returned by CHAR->INTEGER. ;; In Guile-1.8.0: (string>? (string #\000) (string #\200)) ==> #t -(if (string=? (version) "1.8.0") - (define char-code-limit 128)) +(define char-code-limit + (if (string=? (version) "1.8.0") + 128 + char-code-limit)) +(if (string>=? (scheme-implementation-version) "1.8") + (module-replace! (current-module) '(char-code-limit))) + ;;; MOST-POSITIVE-FIXNUM is used in modular.scm ;;(define most-positive-fixnum #x0FFFFFFF) @@ -383,49 +547,54 @@ ;;; return if exiting not supported. (define slib:exit quit) -(cond ((string>=? (scheme-implementation-version) "1.8") - (define (slib:load-helper loader) - (lambda (name) - (save-module-excursion - (lambda () - (set-current-module slib-module) - (let ((errinfo (catch 'system-error - (lambda () (loader name) #f) - (lambda args args)))) - (if (and errinfo - (catch 'system-error - (lambda () (loader (string-append name ".scm")) #f) - (lambda args args))) - (apply throw errinfo))))))) - (define slib:load (slib:load-helper load)) - (define slib:load-from-path (slib:load-helper load-from-path)) - ) - (else - ;;Here for backward compatability - (define scheme-file-suffix - (let ((suffix (case (software-type) - ((nosve) "_scm") - (else ".scm")))) - (lambda () suffix))) - - (define (guile:wrap-case-insensitive proc) - (lambda args - (save-module-excursion - (lambda () - (set-current-module slib-module) - (let ((old (read-options))) - (dynamic-wind - (lambda () (read-enable 'case-insensitive)) - (lambda () (apply proc args)) - (lambda () (read-options old)))))))) - - (define read (guile:wrap-case-insensitive read)) - - (define slib:load - (let ((load-file (guile:wrap-case-insensitive load))) +;; for (string>=? (scheme-implementation-version) "1.8") +(define (slib:load-helper loader) + (lambda (name) + (save-module-excursion + (lambda () + (set-current-module slib-module) + (let ((errinfo (catch 'system-error + (lambda () (loader name) #f) + (lambda args args)))) + (if (and errinfo + (catch 'system-error + (lambda () (loader (string-append name ".scm")) #f) + (lambda args args))) + (apply throw errinfo))))))) + +;; for (string=? (scheme-implementation-version) "1.8") + scheme-file-suffix + (let ((suffix (case (software-type) + ((nosve) "_scm") + (else ".scm")))) + (lambda () suffix)))) +(define read + (if (string>=? (scheme-implementation-version) "1.8") + read + (guile:wrap-case-insensitive read))) +(if (string>=? (scheme-implementation-version) "1.8") + (module-replace! (current-module) '(scheme-file-suffix read))) + +(define slib:load + (if (string>=? (scheme-implementation-version) "1.8") + (slib:load-helper load) + (let ((load-file (guile:wrap-case-insensitive load))) (lambda () - (load-file (string-append (scheme-file-suffix)))))) - )) + (load-file (string-append (scheme-file-suffix))))))) +;;(define slib:load-from-path (slib:load-helper load-from-path)) ;;;(SLIB:LOAD-SOURCE "foo") should load "foo.scm" or with whatever ;;;suffix all the module files in SLIB have. See feature 'SOURCE. @@ -557,6 +726,58 @@ (if (string>=? (scheme-implementation-version) "1.8") (module-replace! (current-module) '(make-array))) +(define (list->array rank proto lst) + (define dimensions + (do ((shp '() (cons (length row) shp)) + (row lst (car lst)) + (rnk (+ -1 rank) (+ -1 rnk))) + ((negative? rnk) (reverse shp)))) + (let ((nra (apply make-array proto dimensions))) + (define (l2ra dims idxs row) + (cond ((null? dims) + (apply array-set! nra row (reverse idxs))) + ((if (not (eqv? (car dims) (length row))) + (slib:error 'list->array + 'non-rectangular 'array dims dimensions)) + (do ((idx 0 (+ 1 idx)) + (row row (cdr row))) + ((>= idx (car dims))) + (l2ra (cdr dims) (cons idx idxs) (car row)))))) + (l2ra dimensions '() lst) + nra)) +(if (string>=? (scheme-implementation-version) "1.8") + (module-replace! (current-module) '(list->array))) + +(define (vector->array vect prototype . dimensions) + (define vdx (vector-length vect)) + (if (not (eqv? vdx (apply * dimensions))) + (slib:error 'vector->array vdx '<> (cons '* dimensions))) + (let ((ra (apply make-array prototype dimensions))) + (define (v2ra dims idxs) + (cond ((null? dims) + (set! vdx (+ -1 vdx)) + (apply array-set! ra (vector-ref vect vdx) (reverse idxs))) + (else + (do ((idx (+ -1 (car dims)) (+ -1 idx))) + ((negative? idx) vect) + (v2ra (cdr dims) (cons idx idxs)))))) + (v2ra dimensions '()) + ra)) +(define (array->vector ra) + (define dims (array-dimensions ra)) + (let* ((vdx (apply * dims)) + (vect (make-vector vdx))) + (define (ra2v dims idxs) + (if (null? dims) + (let ((val (apply array-ref ra (reverse idxs)))) + (set! vdx (+ -1 vdx)) + (vector-set! vect vdx val)) + (do ((idx (+ -1 (car dims)) (+ -1 idx))) + ((negative? idx) vect) + (ra2v (cdr dims) (cons idx idxs))))) + (ra2v dims '()) + vect)) + (define create-array make-array) (define (make-uniform-wrapper prot) (if (string? prot) (set! prot (string->number prot))) @@ -642,20 +863,21 @@ (require 'object->string) (set! seed (object->limited-string seed 50))))) (seed->random-state seed))) -(if (not (defined? 'random:chunk)) - (define (random:chunk sta) (random 256 sta))) +(define (random:chunk sta) (random 256 sta)) ;;; workaround for Guile 1.6.7 bug -(cond ((or (array? 'guile) (array? '(1 6 7))) - (define array? - (let ((old-array? array?)) - (lambda (obj) - (and (old-array? obj) - (not (or (list? obj) - (symbol? obj) - (record? obj))))))) - (if (string>=? (scheme-implementation-version) "1.8") - (module-replace! (current-module) '(array?))))) +(define array? + (if (or (array? 'guile) (array? '(1 6 7))) + (let ((old-array? array?)) + (lambda (obj) + (and (old-array? obj) + (not (or (list? obj) + (symbol? obj) + (record? obj)))))) + array?)) +(if (string>=? (scheme-implementation-version) "1.8") + (module-replace! (current-module) '(array?))) + ;;; Support for older versions of Scheme. Not enough code for its own file. ;;(define (last-pair l) (if (pair? (cdr l)) (last-pair (cdr l)) l)) @@ -670,7 +892,9 @@ (define >? >) (define >=? >=) +(slib:load (in-vicinity (library-vicinity) "require")) + (if (string>=? (scheme-implementation-version) "1.8") (module-replace! (current-module) '(provide provided?))) -(slib:load (in-vicinity (library-vicinity) "require")) +)) ;; end of cond-expand clause for Guile < 2.0 -- cgit v1.2.3