⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eval.scm

📁 Scheme跨平台编译器
💻 SCM
📖 第 1 页 / 共 5 页
字号:
;;; Loading source/object files:(define load-verbose (make-parameter (##sys#fudge 13)))(define (##sys#abort-load) #f)(define ##sys#current-source-filename #f)(define ##sys#current-load-path "")(define-foreign-variable _dlerror c-string "C_dlerror")(define (set-dynamic-load-mode! mode)  (let ([mode (if (pair? mode) mode (list mode))]	[now #f]	[global #t] )    (let loop ([mode mode])      (when (pair? mode)	(case (##sys#slot mode 0)	  [(global) (set! global #t)]	  [(local) (set! global #f)]	  [(lazy) (set! now #f)]	  [(now) (set! now #t)]	  [else (##sys#signal-hook 'set-dynamic-load-mode! "invalid dynamic-load mode" (##sys#slot mode 0))] )	(loop (##sys#slot mode 1)) ) )    (##sys#set-dlopen-flags! now global) ) )(let ([read read]      [write write]      [display display]      [newline newline]      [eval eval]      [open-input-file open-input-file]      [close-input-port close-input-port]      [string-append string-append]       [load-verbose load-verbose]      [topentry (##sys#make-c-string "C_toplevel")] )  (define (has-sep? str)    (let loop ([i (fx- (##sys#size str) 1)])      (and (not (zero? i))	   (if (memq (##core#inline "C_subchar" str i) '(#\\ #\/))	       i	       (loop (fx- i 1)) ) ) ) )  (define (badfile x)    (##sys#signal-hook #:type-error 'load "bad argument type - not a port or string" x) )  (set! ##sys#load     (lambda (input evaluator pf #!optional timer printer)      (when (string? input) 	(set! input (##sys#expand-home-path input)) )      (let* ([isdir #f]	     [fname 	     (cond [(port? input) #f]		   [(not (string? input)) (badfile input)]		   [(and-let* ([info (##sys#file-info input)]			       [id (##sys#slot info 4)] )		      (set! isdir (eq? 1 id)) 		      (not id) )		    input]		   [else		    (let ([fname2 (##sys#string-append input ##sys#load-dynamic-extension)])		      (if (##sys#file-info fname2)			  fname2			  (let ([fname3 (##sys#string-append input source-file-extension)])			    (if (##sys#file-info fname3)				fname3				(and (not isdir) input) ) ) ) ) ] ) ]	    [evproc (or evaluator eval)] )	(cond [(and (string? input) (not fname))	       (##sys#signal-hook #:file-error 'load "can not open file" input) ]	      [(and (load-verbose) fname)	       (display "; loading ")	       (display fname)	       (display " ...\n") ] )	(or (and fname		 (or (##sys#dload (##sys#make-c-string fname) topentry #t) 		     (and (not (has-sep? fname))			  (##sys#dload (##sys#make-c-string (##sys#string-append "./" fname)) topentry #t) ) ) )	    (call-with-current-continuation	     (lambda (abrt)	       (fluid-let ([##sys#read-error-with-line-number #t]			   [##sys#current-source-filename fname]			   [##sys#current-load-path			    (and fname				 (let ((i (has-sep? fname)))				   (if i (##sys#substring fname 0 (fx+ i 1)) "") ) ) ]			   [##sys#abort-load (lambda () (abrt #f))] )		 (let ([in (if fname (open-input-file fname) input)])		   (##sys#dynamic-wind		    (lambda () #f)		    (lambda ()		      (let ([c1 (peek-char in)])			(when (char=? c1 (integer->char 127))			  (##sys#error 'load "unable to load compiled module" fname _dlerror) ) )		      (let ((x1 (read in)))			(do ((x x1 (read in)))			    ((eof-object? x))			  (when printer (printer x))			  (##sys#call-with-values			   (lambda () 			     (if timer				 (time (evproc x)) 				 (evproc x) ) )			   (lambda results			     (when pf			       (for-each				(lambda (r) 				  (write r)				  (newline) )				results) ) ) ) ) ) )		    (lambda () (close-input-port in)) ) ) ) ) ) )	(##core#undefined) ) ) )  (set! load    (lambda (filename . evaluator)      (##sys#load filename (:optional evaluator #f) #f) ) )  (set! load-relative    (lambda (filename . evaluator)      (##sys#load       (if (memq (string-ref filename 0) '(#\\ #\/))	   filename	   (##sys#string-append ##sys#current-load-path filename) )       (:optional evaluator #f) #f) ) )  (set! load-noisily    (lambda (filename #!key (evaluator #f) (time #f) (printer #f))      (##sys#load filename evaluator #t time printer) ) ) )(define ##sys#load-library-extension 	; this is crude...  (cond [(eq? (software-type) 'windows) windows-load-library-extension]	[(eq? (software-version) 'macosx) macosx-load-library-extension]	[(and (eq? (software-version) 'hpux) 	      (eq? (machine-type) 'hppa)) hppa-load-library-extension]	[else default-load-library-extension] ) )(define ##sys#load-dynamic-extension default-load-library-extension)(define ##sys#default-dynamic-load-libraries   (case (build-platform)    ((cygwin) cygwin-default-dynamic-load-libraries)    (else default-dynamic-load-libraries) ) )(define dynamic-load-libraries   (make-parameter   (map (cut ##sys#string-append <> ##sys#load-library-extension) ##sys#default-dynamic-load-libraries)   (lambda (x)     (##sys#check-list x)     x) ) )(define ##sys#load-library  (let ([load-verbose load-verbose]	[string-append string-append]	[dynamic-load-libraries dynamic-load-libraries]	[display display] )    (lambda (uname lib)      (let ([id (##sys#->feature-id uname)])	(or (memq id ##sys#features)	    (let ([libs		   (if lib		       (##sys#list lib)		       (cons (##sys#string-append (##sys#slot uname 1) ##sys#load-library-extension)			     (dynamic-load-libraries) ) ) ]		  [top 		   (##sys#make-c-string		    (string-append 		     "C_"		     (##sys#string->c-identifier (##sys#slot uname 1)) 		     "_toplevel") ) ] )	      (when (load-verbose)		(display "; loading library ")		(display uname)		(display " ...\n") )	      (let loop ([libs libs])		(cond [(null? libs) #f]		      [(##sys#dload (##sys#make-c-string (##sys#slot libs 0)) top #f)		       (unless (memq id ##sys#features) (set! ##sys#features (cons id ##sys#features)))		       #t]		      [else (loop (##sys#slot libs 1))] ) ) ) ) ) ) ) )(define load-library  (lambda (uname . lib)    (##sys#check-symbol uname 'load-library)    (or (##sys#load-library uname (and (pair? lib) (car lib)))	(##sys#error 'load-library "unable to load library" uname _dlerror) ) ) )(define ##sys#split-at-separator  (let ([reverse reverse] )    (lambda (str sep)      (let ([len (##sys#size str)])	(let loop ([items '()] [i 0] [j 0])	  (cond [(fx>= i len)		 (reverse (cons (##sys#substring str j len) items)) ]		[(char=? (##core#inline "C_subchar" str i) sep)		 (let ([i2 (fx+ i 1)])		   (loop (cons (##sys#substring str j i) items) i2 i2) ) ]		[else (loop items (fx+ i 1) j)] ) ) ) ) ) );;; Extensions:(define ##sys#canonicalize-extension-path  (let ([string-append string-append])    (lambda (id loc)      (define (err) (##sys#error loc "invalid extension path" id))      (define (sep? c) (or (char=? #\\ c) (char=? #\/ c)))      (let ([p (cond [(string? id) id]		     [(symbol? id) (##sys#symbol->string id)]		     [(list? id) 		      (let loop ([id id])			(if (null? id)			    ""			    (string-append 			     (let ([id0 (##sys#slot id 0)])			       (cond [(symbol? id0) (##sys#symbol->string id0)]				     [(string? id0) id0]				     [else (err)] ) )			     (if (null? (##sys#slot id 1))				 ""				 "/")			     (loop (##sys#slot id 1)) ) ) ) ] ) ] )	(let check ([p p])	  (let ([n (##sys#size p)])	    (cond [(fx= 0 n) (err)]		  [(sep? (string-ref p 0))		   (check (##sys#substring p 1 n)) ]		  [(sep? (string-ref p (fx- n 1)))		   (check (##sys#substring p 0 (fx- n 1))) ]		  [else p] ) ) ) ) ) ) )(define ##sys#repository-path  (make-parameter    (or (getenv repository-environment-variable)       (##sys#chicken-prefix 	(##sys#string-append 	 "lib/chicken/"	 (##sys#number->string (or (##sys#fudge 42) default-binary-version)) ) )       install-egg-home) ) )(define repository-path ##sys#repository-path)(define ##sys#find-extension  (let ([file-exists? file-exists?]	[string-append string-append] )    (lambda (p inc?)	(define (check path)	  (let ([p0 (string-append path "/" p)])	    (and (or (file-exists? (##sys#string-append p0 ##sys#load-dynamic-extension))		     (file-exists? (##sys#string-append p0 source-file-extension)) )		 p0) ) )	(let loop ([paths (##sys#append (list (##sys#repository-path))					(if inc? (##sys#append ##sys#include-pathnames '(".")) '()) ) ] )	  (and (pair? paths)	       (let ([pa (##sys#slot paths 0)])		 (or (check pa)		     (loop (##sys#slot paths 1)) ) ) ) ) ) ) )(define ##sys#loaded-extensions '())(define ##sys#load-extension  (let ((string->symbol string->symbol))    (lambda (id loc . err?)      (cond ((string? id) (set! id (string->symbol id)))	    (else (##sys#check-symbol id loc)) )      (let ([p (##sys#canonicalize-extension-path id loc)])	(cond ((member p ##sys#loaded-extensions))	      ((memq id ##sys#core-library-modules)	       (##sys#load-library id #f) )	      (else	       (let ([id2 (##sys#find-extension p #t)])		 (cond (id2			(##sys#load id2 #f #f)			(set! ##sys#loaded-extensions (cons p ##sys#loaded-extensions)) 			#t)		       ((:optional err? #t) (##sys#error loc "can not load extension" id))		       (else #f) ) ) ) ) ) ) ) )(define (##sys#provide . ids)  (for-each   (lambda (id)     (##sys#check-symbol id 'provide)     (let ([p (##sys#canonicalize-extension-path id 'provide)])       (set! ##sys#loaded-extensions (cons p ##sys#loaded-extensions)) ) )    ids) )(define provide ##sys#provide)(define (##sys#provided? id)  (and (member (##sys#canonicalize-extension-path id 'provided?) ##sys#loaded-extensions)        #t) )(define provided? ##sys#provided?)(define ##sys#require  (lambda ids    (for-each     (cut ##sys#load-extension <> 'require)      ids) ) )(define require ##sys#require)(define ##sys#extension-information  (let ([with-input-from-file with-input-from-file]	[file-exists? file-exists?]	[string-append string-append]	[read read] )    (lambda (id loc)      (let* ((p (##sys#canonicalize-extension-path id loc))	     (rpath (string-append (##sys#repository-path) "/" p ".")) )	(cond ((file-exists? (string-append rpath setup-file-extension))	       => (cut with-input-from-file <> read) )	      (else #f) ) ) ) ) )(define (extension-information ext)  (##sys#extension-information ext 'extension-information) )(define ##sys#lookup-runtime-requirements   (let ([with-input-from-file with-input-from-file]	[read read] )    (lambda (ids)      (let loop1 ([ids ids])	(if (null? ids)	    '()	    (append	     (or (and-let* ([info (##sys#extension-information (car ids) #f)]			    [a (assq 'require-at-runtime info)] )		   (cdr a) )		 '() )	     (loop1 (cdr ids)) ) ) ) ) ) )(define ##sys#do-the-right-thing  (let ((vector->list vector->list))    (lambda (id comp?)      (define (add-req id)	(when comp?	  (##sys#hash-table-update!	   ##compiler#file-requirements	   'syntax-requirements	   (cut lset-adjoin eq? <> id) 	   (lambda () (list id)))))      (define (doit id)	(cond ((or (memq id builtin-features)		   (if comp?		       (memq id builtin-features/compiled)		       (##sys#feature? id) ) )	       (values '(##sys#void) #t) )	      ((memq id special-syntax-files)	       (let ((fid (##sys#->feature-id id)))		 (unless (memq fid ##sys#features)		   (##sys#load (##sys#resolve-include-filename (##sys#symbol->string id) #t) #f #f) 		   (set! ##sys#features (cons fid ##sys#features)) )		 (values '(##sys#void) #t) ) )	      ((memq id ##sys#core-library-modules)	       (values		(if comp?		    `(##core#declare '(uses ,id))		    `(load-library ',id) )		#t) )	      ((memq id ##sys#explicit-library-modules)	       (let* ((info (##sys#extension-information id 'require-extension))		      (s (assq 'syntax info)))		 (values		  `(begin		     ,@(if s `((##core#require-for-syntax ',id)) '())		     ,(if comp?			  `(##core#declare '(uses ,id)) 			  `(load-library ',id) ) )		  #t) ) )	      (else	       (let ((info (##sys#extension-information id 'require-extension)))		 (cond (info			(let ((s (assq 'syntax info))			      (rr (assq 'require-at-runtime info)) )

⌨️ 快捷键说明

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