slib.scm

来自「MSYS在windows下模拟了一个类unix的终端」· SCM 代码 · 共 292 行

SCM
292
字号
;;;; slib.scm --- definitions needed to get SLIB to work with Guile;;;;;;;;	Copyright (C) 1997, 1998, 2000, 2001, 2002 Free Software Foundation, Inc.;;;;;;;; This file is part of GUILE.;;;; ;;;; GUILE is free software; you can redistribute it and/or modify it;;;; under the terms of the GNU General Public License as published by;;;; the Free Software Foundation; either version 2, or (at your;;;; option) any later version.;;;; ;;;; GUILE is distributed in the hope that it will be useful, but;;;; WITHOUT ANY WARRANTY; without even the implied warranty of;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU;;;; General Public License for more details.;;;; ;;;; You should have received a copy of the GNU General Public License;;;; along with GUILE; see the file COPYING.  If not, write to the;;;; Free Software Foundation, Inc., 59 Temple Place, Suite 330,;;;; Boston, MA 02111-1307 USA;;;;;;;; As a special exception, the Free Software Foundation gives permission;;;; for additional uses of the text contained in its release of GUILE.;;;;;;;; The exception is that, if you link the GUILE library with other files;;;; to produce an executable, this does not by itself cause the;;;; resulting executable to be covered by the GNU General Public License.;;;; Your use of that executable is in no way restricted on account of;;;; linking the GUILE library code into it.;;;;;;;; This exception does not however invalidate any other reasons why;;;; the executable file might be covered by the GNU General Public License.;;;;;;;; This exception applies only to the code released by the;;;; Free Software Foundation under the name GUILE.  If you copy;;;; code from other Free Software Foundation releases into a copy of;;;; GUILE, as the General Public License permits, the exception does;;;; not apply to the code that you add in this way.  To avoid misleading;;;; anyone as to the status of such modified files, you must delete;;;; this exception notice from them.;;;;;;;; If you write modifications of your own for GUILE, it is your choice;;;; whether to permit this exception to apply to your modifications.;;;; If you do not wish that, delete this exception notice.;;;;(define-module (ice-9 slib)  :export (slib:load	   implementation-vicinity	   library-vicinity	   home-vicinity	   scheme-implementation-type	   scheme-implementation-version	   make-random-state	   require)  :no-backtrace)(define (eval-load <filename> evl)  (if (not (file-exists? <filename>))      (set! <filename> (string-append <filename> (scheme-file-suffix))))  (call-with-input-file <filename>    (lambda (port)      (let ((old-load-pathname *load-pathname*))	(set! *load-pathname* <filename>)	(do ((o (read port) (read port)))	    ((eof-object? o))	  (evl o))	(set! *load-pathname* old-load-pathname)))))(define slib:exit quit)(define slib:error error)(define slib:warn warn)(define slib:eval (lambda (x) (eval x slib-module)))(define defmacro:eval (lambda (x) (eval x (interaction-environment))))(define logical:logand logand)(define logical:logior logior)(define logical:logxor logxor)(define logical:lognot lognot)(define logical:ash ash)(define logical:logcount logcount)(define logical:integer-length integer-length)(define logical:bit-extract bit-extract)(define logical:integer-expt integer-expt)(define logical:ipow-by-squaring ipow-by-squaring)(define slib:eval-load eval-load)(define slib:tab #\tab)(define slib:form-feed #\page)(define slib-module (current-module))(define (defined? symbol)  (module-defined? slib-module symbol))(define slib:features  (append '(source	    eval	    abort	    alist	    defmacro	    delay	    dynamic-wind	    full-continuation	    hash	    hash-table	    line-i/o	    logical	    multiarg/and-	    multiarg-apply	    promise	    rev2-procedures	    rev4-optional-procedures	    string-port	    with-file)	  (if (defined? 'getenv)	      '(getenv)	      '())	  (if (defined? 'current-time)	      '(current-time)	      '())	  (if (defined? 'system)	      '(system)	      '())	  (if (defined? 'array?)	      '(array)	      '())	  (if (defined? 'char-ready?)	      '(char-ready?)	      '())	  (if (defined? 'array-for-each)	      '(array-for-each)	      '())	  (if (and (string->number "0.0") (inexact? (string->number "0.0")))	      '(inexact)	      '())	  (if (rational? (string->number "1/19"))	      '(rational)	      '())	  (if (real? (string->number "0.0"))	      '(real)	      ())	  (if (complex? (string->number "1+i"))	      '(complex)	      '())	  (let ((n (string->number "9999999999999999999999999999999")))	    (if (and n (exact? n))		'(bignum)		'()))));;; FIXME: Because uers want require to search the path, this uses;;; load-from-path, which probably isn't a hot idea.  slib;;; doesn't expect this function to search a path, so I expect to get;;; bug reports at some point complaining that the wrong file gets;;; loaded when something accidentally appears in the path before;;; slib, etc. ad nauseum.  However, the right fix seems to involve;;; changing catalog:get in slib/require.scm, and I don't expect;;; Aubrey will integrate such a change.  So I'm just going to punt;;; for the time being.(define (slib:load name)  (save-module-excursion   (lambda ()     (set-current-module slib-module)     (let ((errinfo (catch 'system-error			   (lambda ()			     (load-from-path name)			     #f)			   (lambda args args))))       (if (and errinfo		(catch 'system-error		       (lambda ()			 (load-from-path			  (string-append name ".scm"))			 #f)		       (lambda args args)))	   (apply throw errinfo))))))(define slib:load-source slib:load)(define defmacro:load slib:load)(define slib-parent-dir  (let* ((path (%search-load-path "slib/require.scm")))    (if path	(substring path 0 (- (string-length path) 17))	(error "Could not find slib/require.scm in " %load-path))))(define (implementation-vicinity)  (string-append slib-parent-dir "/"))(define (library-vicinity)  (string-append (implementation-vicinity) "slib/"))(define home-vicinity  (let ((home-path (getenv "HOME")))    (lambda () home-path)))(define (scheme-implementation-type) 'guile)(define (scheme-implementation-version) "")(define (output-port-width . arg) 80)(define (output-port-height . arg) 24)(define (identity x) x);;; {Random numbers};;;(define (make-random-state . args)  (let ((seed (if (null? args) *random-state* (car args))))    (cond ((string? seed))	  ((number? seed) (set! seed (number->string seed)))	  (else (let ()		  (require 'object->string)		  (set! seed (object->limited-string seed 50)))))    (seed->random-state seed)));;; {Time};;;(define difftime -)(define offset-time +)(define %system-define define)(define define  (procedure->memoizing-macro   (lambda (exp env)     (if (= (length env) 1)	 `(define-public ,@(cdr exp))	 `(%system-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)))(define (software-type)  "Return a symbol describing the current platform's operating system.This may be one of AIX, VMS, UNIX, COHERENT, WINDOWS, MS-DOS, OS/2,THINKC, AMIGA, ATARIST, MACH, or ACORN.Note that most varieties of Unix are considered to be simply \"UNIX\".That is because when a program depends on features that are not presenton every operating system, it is usually better to test for the presenceor absence of that specific feature.  The return value of@code{software-type} should only be used for this purpose when there isno other easy or unambiguous way of detecting such features." 'UNIX)(slib:load (in-vicinity (library-vicinity) "require.scm"))(define require require:require);; {Extensions to the require system so that the user can add new;;  require modules easily.}(define *vicinity-table*  (list   (cons 'implementation (implementation-vicinity))   (cons 'library (library-vicinity))))(define (install-require-vicinity name vicinity)  (let ((entry (assq name *vicinity-table*)))    (if entry	(set-cdr! entry vicinity)	(set! *vicinity-table*	      (acons name vicinity *vicinity-table*)))))(define (install-require-module name vicinity-name file-name)  (if (not *catalog*)	     ;Fix which loads catalog in slib      (catalog:get 'random)) ;(doesn't load the feature 'random)  (let ((entry (assq name *catalog*))	(vicinity (cdr (assq vicinity-name *vicinity-table*))))    (let ((path-name (in-vicinity vicinity file-name)))      (if entry	  (set-cdr! entry path-name)	  (set! *catalog*		(acons name path-name *catalog*))))))(define (make-exchanger obj)  (lambda (rep) (let ((old obj)) (set! obj rep) old)))

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?