📄 boot-9.scm
字号:
;;;; Apply f to successive elements of l until exhaustion or while f returns #f.;; If returning early, return the return value of f.;;(define (or-map f lst) (let loop ((result #f) (l lst)) (or result (and (not (null? l)) (loop (f (car l)) (cdr l))))))(if (provided? 'posix) (primitive-load-path "ice-9/posix.scm"))(if (provided? 'socket) (primitive-load-path "ice-9/networking.scm"))(define file-exists? (if (provided? 'posix) (lambda (str) (access? str F_OK)) (lambda (str) (let ((port (catch 'system-error (lambda () (open-file str OPEN_READ)) (lambda args #f)))) (if port (begin (close-port port) #t) #f)))))(define file-is-directory? (if (provided? 'posix) (lambda (str) (eq? (stat:type (stat str)) 'directory)) (lambda (str) (let ((port (catch 'system-error (lambda () (open-file (string-append str "/.") OPEN_READ)) (lambda args #f)))) (if port (begin (close-port port) #t) #f)))))(define (has-suffix? str suffix) (let ((sufl (string-length suffix)) (sl (string-length str))) (and (> sl sufl) (string=? (substring str (- sl sufl) sl) suffix))))(define (system-error-errno args) (if (eq? (car args) 'system-error) (car (list-ref args 4)) #f));;; {Error Handling};;;(define (error . args) (save-stack) (if (null? args) (scm-error 'misc-error #f "?" #f #f) (let loop ((msg "~A") (rest (cdr args))) (if (not (null? rest)) (loop (string-append msg " ~S") (cdr rest)) (scm-error 'misc-error #f msg args #f)))));; bad-throw is the hook that is called upon a throw to a an unhandled;; key (unless the throw has four arguments, in which case;; it's usually interpreted as an error throw.);; If the key has a default handler (a throw-handler-default property),;; it is applied to the throw.;;(define (bad-throw key . args) (let ((default (symbol-property key 'throw-handler-default))) (or (and default (apply default key args)) (apply error "unhandled-exception:" key args))))(define (tm:sec obj) (vector-ref obj 0))(define (tm:min obj) (vector-ref obj 1))(define (tm:hour obj) (vector-ref obj 2))(define (tm:mday obj) (vector-ref obj 3))(define (tm:mon obj) (vector-ref obj 4))(define (tm:year obj) (vector-ref obj 5))(define (tm:wday obj) (vector-ref obj 6))(define (tm:yday obj) (vector-ref obj 7))(define (tm:isdst obj) (vector-ref obj 8))(define (tm:gmtoff obj) (vector-ref obj 9))(define (tm:zone obj) (vector-ref obj 10))(define (set-tm:sec obj val) (vector-set! obj 0 val))(define (set-tm:min obj val) (vector-set! obj 1 val))(define (set-tm:hour obj val) (vector-set! obj 2 val))(define (set-tm:mday obj val) (vector-set! obj 3 val))(define (set-tm:mon obj val) (vector-set! obj 4 val))(define (set-tm:year obj val) (vector-set! obj 5 val))(define (set-tm:wday obj val) (vector-set! obj 6 val))(define (set-tm:yday obj val) (vector-set! obj 7 val))(define (set-tm:isdst obj val) (vector-set! obj 8 val))(define (set-tm:gmtoff obj val) (vector-set! obj 9 val))(define (set-tm:zone obj val) (vector-set! obj 10 val))(define (tms:clock obj) (vector-ref obj 0))(define (tms:utime obj) (vector-ref obj 1))(define (tms:stime obj) (vector-ref obj 2))(define (tms:cutime obj) (vector-ref obj 3))(define (tms:cstime obj) (vector-ref obj 4))(define file-position ftell)(define (file-set-position port offset . whence) (let ((whence (if (eq? whence '()) SEEK_SET (car whence)))) (seek port offset whence)))(define (move->fdes fd/port fd) (cond ((integer? fd/port) (dup->fdes fd/port fd) (close fd/port) fd) (else (primitive-move->fdes fd/port fd) (set-port-revealed! fd/port 1) fd/port)))(define (release-port-handle port) (let ((revealed (port-revealed port))) (if (> revealed 0) (set-port-revealed! port (- revealed 1)))))(define (dup->port port/fd mode . maybe-fd) (let ((port (fdopen (apply dup->fdes port/fd maybe-fd) mode))) (if (pair? maybe-fd) (set-port-revealed! port 1)) port))(define (dup->inport port/fd . maybe-fd) (apply dup->port port/fd "r" maybe-fd))(define (dup->outport port/fd . maybe-fd) (apply dup->port port/fd "w" maybe-fd))(define (dup port/fd . maybe-fd) (if (integer? port/fd) (apply dup->fdes port/fd maybe-fd) (apply dup->port port/fd (port-mode port/fd) maybe-fd)))(define (duplicate-port port modes) (dup->port port modes))(define (fdes->inport fdes) (let loop ((rest-ports (fdes->ports fdes))) (cond ((null? rest-ports) (let ((result (fdopen fdes "r"))) (set-port-revealed! result 1) result)) ((input-port? (car rest-ports)) (set-port-revealed! (car rest-ports) (+ (port-revealed (car rest-ports)) 1)) (car rest-ports)) (else (loop (cdr rest-ports))))))(define (fdes->outport fdes) (let loop ((rest-ports (fdes->ports fdes))) (cond ((null? rest-ports) (let ((result (fdopen fdes "w"))) (set-port-revealed! result 1) result)) ((output-port? (car rest-ports)) (set-port-revealed! (car rest-ports) (+ (port-revealed (car rest-ports)) 1)) (car rest-ports)) (else (loop (cdr rest-ports))))))(define (port->fdes port) (set-port-revealed! port (+ (port-revealed port) 1)) (fileno port))(define (setenv name value) (if value (putenv (string-append name "=" value)) (putenv name)));;; {Load Paths};;;;;; Here for backward compatability;;(define scheme-file-suffix (lambda () ".scm"))(define (in-vicinity vicinity file) (let ((tail (let ((len (string-length vicinity))) (if (zero? len) #f (string-ref vicinity (- len 1)))))) (string-append vicinity (if (or (not tail) (eq? tail #\/)) "" "/") file)));;; {Help for scm_shell};;; The argument-processing code used by Guile-based shells generates;;; Scheme code based on the argument list. This page contains help;;; functions for the code it generates.(define (command-line) (program-arguments));; This is mostly for the internal use of the code generated by;; scm_compile_shell_switches.(define (load-user-init) (let* ((home (or (getenv "HOME") (false-if-exception (passwd:dir (getpwuid (getuid)))) "/")) ;; fallback for cygwin etc. (init-file (in-vicinity home ".guile"))) (if (file-exists? init-file) (primitive-load init-file))));;; {Loading by paths};;; Load a Scheme source file named NAME, searching for it in the;;; directories listed in %load-path, and applying each of the file;;; name extensions listed in %load-extensions.(define (load-from-path name) (start-stack 'load-stack (primitive-load-path name)));;; {Transcendental Functions};;;;;; Derived from "Transcen.scm", Complex trancendental functions for SCM.;;; Written by Jerry D. Hedden, (C) FSF.;;; See the file `COPYING' for terms applying to this program.;;;(define (exp z) (if (real? z) ($exp z) (make-polar ($exp (real-part z)) (imag-part z))))(define (log z) (if (and (real? z) (>= z 0)) ($log z) (make-rectangular ($log (magnitude z)) (angle z))))(define (sqrt z) (if (real? z) (if (negative? z) (make-rectangular 0 ($sqrt (- z))) ($sqrt z)) (make-polar ($sqrt (magnitude z)) (/ (angle z) 2))))(define expt (let ((integer-expt integer-expt)) (lambda (z1 z2) (cond ((integer? z2) (if (negative? z2) (/ 1 (integer-expt z1 (- z2))) (integer-expt z1 z2))) ((and (real? z2) (real? z1) (>= z1 0)) ($expt z1 z2)) (else (exp (* z2 (log z1))))))))(define (sinh z) (if (real? z) ($sinh z) (let ((x (real-part z)) (y (imag-part z))) (make-rectangular (* ($sinh x) ($cos y)) (* ($cosh x) ($sin y))))))(define (cosh z) (if (real? z) ($cosh z) (let ((x (real-part z)) (y (imag-part z))) (make-rectangular (* ($cosh x) ($cos y)) (* ($sinh x) ($sin y))))))(define (tanh z) (if (real? z) ($tanh z) (let* ((x (* 2 (real-part z))) (y (* 2 (imag-part z))) (w (+ ($cosh x) ($cos y)))) (make-rectangular (/ ($sinh x) w) (/ ($sin y) w)))))(define (asinh z) (if (real? z) ($asinh z) (log (+ z (sqrt (+ (* z z) 1))))))(define (acosh z) (if (and (real? z) (>= z 1)) ($acosh z) (log (+ z (sqrt (- (* z z) 1))))))(define (atanh z) (if (and (real? z) (> z -1) (< z 1)) ($atanh z) (/ (log (/ (+ 1 z) (- 1 z))) 2)))(define (sin z) (if (real? z) ($sin z) (let ((x (real-part z)) (y (imag-part z))) (make-rectangular (* ($sin x) ($cosh y)) (* ($cos x) ($sinh y))))))(define (cos z) (if (real? z) ($cos z) (let ((x (real-part z)) (y (imag-part z))) (make-rectangular (* ($cos x) ($cosh y)) (- (* ($sin x) ($sinh y)))))))(define (tan z) (if (real? z) ($tan z) (let* ((x (* 2 (real-part z))) (y (* 2 (imag-part z))) (w (+ ($cos x) ($cosh y)))) (make-rectangular (/ ($sin x) w) (/ ($sinh y) w)))))(define (asin z) (if (and (real? z) (>= z -1) (<= z 1)) ($asin z) (* -i (asinh (* +i z)))))(define (acos z) (if (and (real? z) (>= z -1) (<= z 1)) ($acos z) (+ (/ (angle -1) 2) (* +i (asinh (* +i z))))))(define (atan z . y) (if (null? y) (if (real? z) ($atan z) (/ (log (/ (- +i z) (+ +i z))) +2i)) ($atan2 z (car y))))(define (log10 arg) (/ (log arg) (log 10)));;; {Reader Extensions};;;;;; Reader code for various "#c" forms.;;;(read-hash-extend #\' (lambda (c port) (read port)))(define read-eval? (make-fluid))(fluid-set! read-eval? #f)(read-hash-extend #\. (lambda (c port) (if (fluid-ref read-eval?) (eval (read port) (interaction-environment)) (error "#. read expansion found and read-eval? is #f."))));;; {Command Line Options};;;(define (get-option argv kw-opts kw-args return) (cond ((null? argv) (return #f #f argv)) ((or (not (eq? #\- (string-ref (car argv) 0))) (eq? (string-length (car argv)) 1)) (return 'normal-arg (car argv) (cdr argv))) ((eq? #\- (string-ref (car argv) 1)) (let* ((kw-arg-pos (or (string-index (car argv) #\=) (string-length (car argv)))) (kw (symbol->keyword (substring (car argv) 2 kw-arg-pos))) (kw-opt? (member kw kw-opts)) (kw-arg? (member kw kw-args)) (arg (or (and (not (eq? kw-arg-pos (string-length (car argv)))) (substring (car argv) (+ kw-arg-pos 1) (string-length (car argv)))) (and kw-arg? (begin (set! argv (cdr argv)) (car argv)))))) (if (or kw-opt? kw-arg?) (return kw arg (cdr argv)) (return 'usage-error kw (cdr argv))))) (else (let* ((char (substring (car argv) 1 2)) (kw (symbol->keyword char))) (cond ((member kw kw-opts) (let* ((rest-car (substring (car argv) 2 (string-length (car argv)))) (new-argv (if (= 0 (string-length rest-car)) (cdr argv) (cons (string-append "-" rest-car) (cdr argv))))) (return kw #f new-argv))) ((member kw kw-args) (let* ((rest-car (substring (car argv) 2 (string-length (car argv)))) (arg (if (= 0 (string-length rest-car)) (cadr argv) rest-car)) (new-argv (if (= 0 (string-length rest-car)) (cddr argv) (cdr argv)))) (return kw arg new-argv))) (else (return 'usage-error kw argv)))))))(define (for-next-option proc argv kw-opts kw-args) (let loop ((argv argv)) (get-option argv kw-opts kw-args (lambda (opt opt-arg argv) (and opt (proc opt opt-arg argv loop))))))(define (display-usage-report kw-desc) (for-each (lambda (kw) (or (eq? (car kw) #t) (eq? (car kw) 'else) (let* ((opt-desc kw) (help (cadr opt-desc)) (opts (car opt-desc)) (opts-proper (if (string? (car opts)) (cdr opts) opts)) (arg-name (if (string? (car opts)) (string-append "<" (car opts) ">") "")) (left-part (string-append (with-output-to-string (lambda () (map (lambda (x) (display (keyword-symbol x)) (display " ")) opts-proper))) arg-name)) (middle-part (if (and (< (string-length left-part) 30) (< (string-length help) 40))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -