;;;"chez.init" Initialization file for SLIB for Chez Scheme 6.0a -*-scheme-*- ;;; Authors: dorai@cs.rice.edu (Dorai Sitaram) and Aubrey Jaffer. ;;; ;;; This code is in the public domain. ;;; Adapted to version 5.0c by stone@math.grin.edu (John David Stone) 1997 ;;; Adapted to version 6.0a by Gary T. Leavens , 1999 ;;; (software-type) should be set to the generic operating system type. ;;; UNIX, VMS, MACOS, AMIGA and MS-DOS are supported. (define (software-type) 'UNIX) ;;; (scheme-implementation-type) should return the name of the scheme ;;; implementation loading this file. (define (scheme-implementation-type) 'chez) ;;; (scheme-implementation-home-page) should return a (string) URL ;;; (Uniform Resource Locator) for this scheme implementation's home ;;; page; or false if there isn't one. (define (scheme-implementation-home-page) "http://www.cs.indiana.edu/chezscheme/") ;;; (scheme-implementation-version) should return a string describing ;;; the version the scheme implementation loading this file. (define (scheme-implementation-version) "6.0a") ;;; (implementation-vicinity) should be defined to be the pathname of ;;; the directory where any auxillary files to your Scheme ;;; implementation reside. (define implementation-vicinity (lambda () "/usr/unsup/scheme/chez/")) ;;; (library-vicinity) should be defined to be the pathname of the ;;; directory where files of Scheme library functions reside. (define library-vicinity (let ((library-path (or ;; Use this getenv if your implementation supports it. (getenv "SCHEME_LIBRARY_PATH") ;; Use this path if your scheme does not support GETENV ;; or if SCHEME_LIBRARY_PATH is not set. (case (software-type) ((UNIX) "/usr/local/lib/slib/") ((VMS) "lib$scheme:") ((MS-DOS) "C:\\SLIB\\") (else ""))))) (lambda () library-path))) ;;; (home-vicinity) should return the vicinity of the user's HOME ;;; directory, the directory which typically contains files which ;;; customize a computer environment for a user. (define home-vicinity (let ((home-path (getenv "HOME"))) (lambda () home-path))) ;;; *FEATURES* should be set to a list of symbols describing features ;;; of this implementation. Suggestions for features are: (define *features* '( source ; Chez Scheme can load Scheme source files, with the ; command (slib:load-source "filename") -- see below. compiled ; Chez Scheme can also load compiled Scheme files, with the ; command (slib:load-compiled "filename") -- see below. rev4-report ;conforms to rev3-report ;conforms to ieee-p1178 ;conforms to ; sicp ;runs code from Structure and ;Interpretation of Computer ;Programs by Abelson and Sussman. rev4-optional-procedures ;LIST-TAIL, STRING->LIST, ;LIST->STRING, STRING-COPY, ;STRING-FILL!, LIST->VECTOR, ;VECTOR->LIST, and VECTOR-FILL! ; rev2-procedures ;SUBSTRING-MOVE-LEFT!, ;SUBSTRING-MOVE-RIGHT!, ;SUBSTRING-FILL!, ;STRING-NULL?, APPEND!, 1+, ;-1+, ?, >=? multiarg/and- ;/ and - can take more than 2 args. multiarg-apply ;APPLY can take more than 2 args. rationalize delay ;has DELAY and FORCE with-file ;has WITH-INPUT-FROM-FILE and ;WITH-OUTPUT-FROM-FILE string-port ;has CALL-WITH-INPUT-STRING and ;CALL-WITH-OUTPUT-STRING transcript ;TRANSCRIPT-ON and TRANSCRIPT-OFF char-ready? macro ;has R4RS high level macros ; defmacro ;has Common Lisp DEFMACRO eval ;R5RS two-argument eval record ;has user defined data structures values ;proposed multiple values dynamic-wind ;proposed dynamic-wind ; ieee-floating-point ;conforms to full-continuation ;can return multiple times ; object-hash ;has OBJECT-HASH sort ; queue ;queues pretty-print ; object->string format trace ;has macros: TRACE and UNTRACE ; compiler ;has (COMPILER) ; ed ;(ED) is editor system ;posix (system ) getenv ;posix (getenv ) ; program-arguments ;returns list of strings (argv) ; Xwindows ;X support ; curses ;screen management package ; termcap ;terminal description package ; terminfo ;sysV terminal description ; current-time ;returns time in seconds since 1/1/1970 fluid-let random rev3-procedures )) ;;; (OUTPUT-PORT-WIDTH ) returns the number of graphic characters ;;; that can reliably be displayed on one line of the standard output port. (define output-port-width (lambda arg (let ((env-width-string (getenv "COLUMNS"))) (if (and env-width-string (let loop ((remaining (string-length env-width-string))) (or (zero? remaining) (let ((next (- remaining 1))) (and (char-numeric? (string-ref env-width-string next)) (loop next)))))) (- (string->number env-width-string) 1) 79)))) ;;; (OUTPUT-PORT-HEIGHT ) returns the number of lines of text that ;;; can reliably be displayed simultaneously in the standard output port. (define output-port-height (lambda arg (let ((env-height-string (getenv "LINES"))) (if (and env-height-string (let loop ((remaining (string-length env-height-string))) (or (zero? remaining) (let ((next (- remaining 1))) (and (char-numeric? (string-ref env-height-string next)) (loop next)))))) (string->number env-height-string) 24)))) ;;; (CURRENT-ERROR-PORT) (define current-error-port (let ((port (console-output-port))) ; changed from current-output-port (lambda () port))) ;;; (TMPNAM) makes a temporary file name. (define tmpnam (let ((cntr 100)) (lambda () (set! cntr (+ 1 cntr)) (let ((tmp (string-append "slib_" (number->string cntr)))) (if (file-exists? tmp) (tmpnam) tmp))))) ;;; (FILE-EXISTS? ) is built-in to Chez Scheme ;;; (DELETE-FILE ) is built-in to Chez Scheme ;; The FORCE-OUTPUT requires buffered output that has been written to a ;; port to be transferred all the way out to its ultimate destination. (define force-output flush-output-port) ;;; CALL-WITH-INPUT-STRING and CALL-WITH-OUTPUT-STRING are the string ;;; port versions of CALL-WITH-*PUT-FILE. ;;; CHAR-CODE-LIMIT is one greater than the largest integer which can ;;; be returned by CHAR->INTEGER. (define char-code-limit 256) ;;; MOST-POSITIVE-FIXNUM is used in modular.scm ;; Chez's MOST-POSITIVE-FIXNUM is a thunk rather than a number. (if (procedure? most-positive-fixnum) (set! most-positive-fixnum (most-positive-fixnum))) ;;; Return argument (define (identity x) x) ;;; SLIB:EVAL is single argument eval using the top-level (user) environment. (define slib:eval eval) ;;; define an error procedure for the library (define slib:error (lambda args (let ((port (current-error-port))) (display "Error: " port) (for-each (lambda (x) (display x port)) args) (error #f "")))) ;;; define these as appropriate for your system. (define slib:tab #\tab) (define slib:form-feed #\page) ;;; Support for older versions of Scheme. Not enough code for its own file. ;;; last-pair is built-in to Chez Scheme (define t #t) (define nil #f) ;;; Define these if your implementation's syntax can support it and if ;;; they are not already defined. ;;; 1+, -1+, and 1- are built-in to Chez Scheme ;(define (1+ n) (+ n 1)) ;(define (-1+ n) (+ n -1)) ;(define 1- -1+) ;;; (IN-VICINITY ) is simply STRING-APPEND, conventionally used ;;; to attach a directory pathname to the name of a file that is expected to ;;; be in that directory. (define in-vicinity string-append) ;;; Define SLIB:EXIT to be the implementation procedure to exit or ;;; return if exitting not supported. (define slib:chez:quit (let ((arg (call-with-current-continuation identity))) (cond ((procedure? arg) arg) (arg (exit)) (else (exit 1))))) (define slib:exit (lambda args (cond ((null? args) (slib:chez:quit #t)) ((eqv? #t (car args)) (slib:chez:quit #t)) ((eqv? #f (car args)) (slib:chez:quit #f)) ((zero? (car args)) (slib:chez:quit #t)) (else (slib:chez:quit #f))))) ;;; For backward compatability, the SCHEME-FILE-SUFFIX procedure is defined ;;; to return the string ".scm". Note, however, that ".ss" is a common Chez ;;; file suffix. (define scheme-file-suffix (let ((suffix (case (software-type) ((NOSVE) "_scm") (else ".scm")))) (lambda () suffix))) ;;; (SLIB:LOAD-SOURCE "foo") should load "foo.scm" or with whatever ;;; suffix all the module files in SLIB have. See feature 'SOURCE. (define (slib:load-source f) (load (string-append f ".scm"))) ;;; (SLIB:LOAD-COMPILED "foo") should load the file that was produced ;;; by compiling "foo.scm" if this implementation can compile files. ;;; See feature 'COMPILED. (define slib:load-compiled load) ;;; At this point SLIB:LOAD must be able to load SLIB files. (define slib:load slib:load-source) ;;; The following make procedures in Chez Scheme compatible with ;;; the assumptions of SLIB. ;;; Chez's sorting routines take parameters in the order opposite to SLIB's. ;;; The following definitions override the predefined procedures with the ;;; parameters-reversed versions. See the SORT feature. (define chez:sort sort) (define chez:sort! sort!) (define chez:merge merge) (define chez:merge! merge!) (define sort (lambda (s p) (chez:sort p s))) (define sort! (lambda (s p) (chez:sort! p s))) (define merge (lambda (s1 s2 p) (chez:merge p s1 s2))) (define merge! (lambda (s1 s2 p) (chez:merge! p s1 s2))) ;;; Chez's (FORMAT F . A) corresponds to SLIB's (FORMAT #F F . A) ;;; See the FORMAT feature. (define chez:format format) (define format (lambda (where how . args) (let ((str (apply chez:format how args))) (cond ((not where) str) ((eq? where #t) (display str)) (else (display str where)))))) ;; The following definitions implement a few widely useful procedures that ;; Chez Scheme does not provide or provides under a different name. ;;; CALL-WITH-INPUT-STRING and CALL-WITH-OUTPUT-STRING are the string ;;; port versions of CALL-WITH-INPUT-FILE and CALL-WITH-OUTPUT-FILE. ;;; See the STRING-PORT feature. (define call-with-output-string (lambda (f) (let ((outsp (open-output-string))) (f outsp) (let ((s (get-output-string outsp))) (close-output-port outsp) s)))) (define call-with-input-string (lambda (s f) (let* ((insp (open-input-string s)) (res (f insp))) (close-input-port insp) res))) ;;; If your implementation provides R4RS macros: (define macro:eval slib:eval) ;;; macro:load also needs the default suffix. (define macro:load slib:load-source) (define *defmacros* (list (cons 'defmacro (lambda (name parms . body) `(set! *defmacros* (cons (cons ',name (lambda ,parms ,@body)) *defmacros*)))))) (define (defmacro? m) (and (assq m *defmacros*) #t)) (define (macroexpand-1 e) (if (pair? e) (let ((a (car e))) (cond ((symbol? a) (set! a (assq a *defmacros*)) (if a (apply (cdr a) (cdr e)) e)) (else e))) e)) (define (macroexpand e) (if (pair? e) (let ((a (car e))) (cond ((symbol? a) (set! a (assq a *defmacros*)) (if a (macroexpand (apply (cdr a) (cdr e))) e)) (else e))) e)) ;;; According to Kent Dybvig, you can improve the Chez Scheme init ;;; file by defining gentemp to be gensym in Chez Scheme. (define gentemp gensym) (define base:eval slib:eval) (define (defmacro:eval x) (base:eval (defmacro:expand* x))) (define (defmacro:expand* x) (require 'defmacroexpand) (apply defmacro:expand* x '())) (define (slib:eval-load evl) (if (not (file-exists? )) (set! (string-append (scheme-file-suffix)))) (call-with-input-file (lambda (port) (let ((old-load-pathname *load-pathname*)) (set! *load-pathname* ) (do ((o (read port) (read port))) ((eof-object? o)) (evl o)) (set! *load-pathname* old-load-pathname))))) (define (defmacro:load ) (slib:eval-load defmacro:eval)) (define slib:warn (lambda args (let ((port (current-error-port))) (display "Warn: " port) (for-each (lambda (x) (display x port)) args)))) ;;; Load the REQUIRE package. (slib:load (in-vicinity (library-vicinity) "require")) ;; end of chez.init