aboutsummaryrefslogtreecommitdiffstats
path: root/guile.init
diff options
context:
space:
mode:
Diffstat (limited to 'guile.init')
-rwxr-xr-x[-rw-r--r--]guile.init392
1 files changed, 308 insertions, 84 deletions
diff --git a/guile.init b/guile.init
index 1b59833..a728e33 100644..100755
--- 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.3")))
- (define-module (ice-9 slib))) ; :no-backtrace
+(cond-expand
+ (guile-2
+ (include "guile-2.init"))
+ (else
+
+(cond
+ ((and (string<=? "1.6" (version)) (string<? (version) "1.8.3")))
+ ((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")
+(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))))))))
+;;Here for backward compatability
+(define scheme-file-suffix
+ (if (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 (<pathname>)
- (load-file (string-append <pathname> (scheme-file-suffix))))))
- ))
+ (load-file (string-append <pathname> (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