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

📄 csi.scm

📁 Scheme跨平台编译器
💻 SCM
📖 第 1 页 / 共 3 页
字号:
			  (memq #:tinyclos ##sys#features)			  (eq? ##tinyclos#entity-tag (##sys#slot x (fx- len 1))) ) ;XXX handle this in tinyclos egg (difficult)		     (describe-object x out)		     (descseq 		      (sprintf "procedure with code pointer ~X" (##sys#peek-unsigned-integer x 0))		      ##sys#size ##sys#slot 1) ) ) ]	      [(port? x)	       (fprintf out			"~A port of type ~A with name ~S and file pointer ~X~%"			(if (##sys#slot x 1) "input" "output")			(##sys#slot x 7)			(##sys#slot x 3)			(##sys#peek-unsigned-integer x 0) ) ]	      [(and (memq #:tinyclos ##sys#features) (instance? x)) ; XXX put into tinyclos egg	       (describe-object x out) ]	      [(##sys#locative? x)	       (fprintf out "locative~%  pointer ~X~%  index ~A~%  type ~A~%"			(##sys#peek-unsigned-integer x 0)			(##sys#slot x 1)			(case (##sys#slot x 2) 			  [(0) "slot"]			  [(1) "char"]			  [(2) "u8vector"]			  [(3) "s8vector"]			  [(4) "u16vector"]			  [(5) "s16vector"]			  [(6) "u32vector"]			  [(7) "s32vector"]			  [(8) "f32vector"]			  [(9) "f64vector"] ) ) ]	      [(##sys#pointer? x) (fprintf out "machine pointer ~X~%" (##sys#peek-unsigned-integer x 0))]	      [(##sys#bytevector? x)	       (let ([len (##sys#size x)])		 (fprintf out "blob of size ~S:~%" len)		 (hexdump x len ##sys#byte out) ) ]	      [(##core#inline "C_lambdainfop" x)	       (fprintf out "lambda information: ~s~%" (##sys#lambda-info->string x)) ]	      [(##sys#structure? x 'hash-table)	       (let ((n (##sys#slot x 2)))		 (fprintf out "hash-table with ~S element~a~%  comparison procedure: ~A~%"			  n (if (fx= n 1) "" "s")  (##sys#slot x 3)) )	       (fprintf out "  hash function: ~a~%" (##sys#slot x 4))	       (hash-table-walk		x		(lambda (k v) (fprintf out " ~S\t-> ~S~%" k v)) ) ]	      [(##sys#structure? x 'condition)	       (fprintf out "condition: ~s~%" (##sys#slot x 1))	       (for-each		(lambda (k)		  (fprintf out " ~s~%" k)		  (let loop ((props (##sys#slot x 2)))		    (unless (null? props)		      (when (eq? k (caar props))			(fprintf out "\t~s: ~s~%" (cdar props) (cadr props)) )		      (loop (cddr props)) ) ) )		(##sys#slot x 1) ) ]	      [(and (##sys#structure? x 'meroon-instance) (provided? 'meroon)) ; XXX put this into meroon egg (really!)	       (unveil x out) ]	      [(##sys#generic-structure? x)	       (let ([st (##sys#slot x 0)])		 (cond ((hash-table-ref/default describer-table st #f) => (cut <> x out))		       ((assq st bytevector-data) =>			(lambda (data)			  (apply descseq (append (map eval (cdr data)) (list 0)))) )		       (else			(fprintf out "structure of type `~S':~%" (##sys#slot x 0))			(descseq #f ##sys#size ##sys#slot 1) ) ) ) ]	      [else (fprintf out "unknown object~%")] )	(##sys#void) ) ) ) )(define set-describer!  (let ((hash-table-set! hash-table-set!))    (lambda (tag proc)      (hash-table-set! describer-table tag proc) ) ) );;; Display hexdump:(define dump  (lambda (x . len-out)    (let-optionals len-out	([len #f]	 [out ##sys#standard-output] )      (define (bestlen n) (if len (min len n) n))      (cond [(##sys#immediate? x) (##sys#error 'dump "can not dump immediate object" x)]	    [(##sys#bytevector? x) (hexdump x (bestlen (##sys#size x)) ##sys#byte out)]	    [(string? x) (hexdump x (bestlen (##sys#size x)) ##sys#byte out)]	    [(and (not (##sys#immediate? x)) (##sys#pointer? x))	     (hexdump x 32 ##sys#peek-byte out) ]	    [(and (##sys#generic-structure? x) (assq (##sys#slot x 0) bytevector-data))	     (let ([bv (##sys#slot x 1)])	       (hexdump bv (bestlen (##sys#size bv)) ##sys#byte out) ) ]	    [else (##sys#error 'dump "can not dump object" x)] ) ) ) )(define hexdump  (let ([display display]	[string-append string-append]	[make-string make-string]	[write-char write-char] )    (lambda (bv len ref out)      (define (justify n m base lead)	(let* ([s (number->string n base)]	       [len (##sys#size s)] )	  (if (fx< len m)	      (string-append (make-string (fx- m len) lead) s)	      s) ) )      (do ([a 0 (fx+ a 16)])	  ((fx>= a len))	(display (justify a 4 10 #\space) out)	(write-char #\: out)	(do ([j 0 (fx+ j 1)]	     [a a (fx+ a 1)] )	    ((or (fx>= j 16) (fx>= a len))	     (and-let* ([(fx>= a len)]			[o (fxmod len 16)]			[(not (fx= o 0))] )	       (do ([k (fx- 16 o) (fx- k 1)])		   ((fx= k 0))		 (display "   " out) ) ) )	  (write-char #\space out)	  (display (justify (ref bv a) 2 16 #\0) out) )	(write-char #\space out)	(do ([j 0 (fx+ j 1)]	     [a a (fx+ a 1)] )	    ((or (fx>= j 16) (fx>= a len)))	  (let ([c (ref bv a)])	    (if (and (fx>= c 32) (fx< c 128))		(write-char (integer->char c) out)		(write-char #\. out) ) ) ) 	(##sys#write-char-0 #\newline out) ) ) ) );;; Start interpreting:(define (deldups lis . maybe-=)  (let ((elt= (:optional maybe-= equal?)))    (let recur ((lis lis))      (if (null? lis) lis	  (let* ((x (car lis))		 (tail (cdr lis))		 (new-tail (recur (del x tail elt=))))	    (if (eq? tail new-tail) lis (cons x new-tail)))))))(define (member* keys set)  (let loop ((set set))    (and (pair? set)	 (let find ((ks keys))	   (cond ((null? ks) (loop (cdr set)))		 ((equal? (car ks) (car set)) set)		 (else (find (cdr ks))) ) ) ) ) )(define-constant short-options   '(#\k #\s #\v #\h #\D #\e #\i #\R #\b #\n #\q #\w #\- #\I #\p #\P) )(define-constant long-options  '("-keyword-style" "-script" "-version" "-help" "--help" "--" "-feature"     "-eval" "-case-insensitive"    "-require-extension" "-batch" "-quiet" "-no-warnings" "-no-init"     "-include-path" "-release" "-ss"    "-print" "-pretty-print") )(define (canonicalize-args args)  (let loop ((args args))    (if (null? args)	'()	(let ((x (car args)))	  (cond 	   ((member x '("-s" "-ss" "-script" "--")) args)	   ((and (fx> (##sys#size x) 2)		 (char=? #\- (##core#inline "C_subchar" x 0))		 (not (member x long-options)) )	    (if (char=? #\: (##core#inline "C_subchar" x 1))		(loop (cdr args))		(let ((cs (string->list (substring x 1))))		  (if (findall cs short-options)		      (append (map (cut string #\- <>) cs) (loop (cdr args)))		      (##sys#error "invalid option" x) ) ) ) )	   (else (cons x (loop (cdr args)))))))))(define (findall chars clist)  (let loop ((chars chars))    (or (null? chars)	(and (memq (car chars) clist)	     (loop (cdr chars))))))(define (run)  (let* ([extraopts (parse-option-string (or (getenv "CSI_OPTIONS") ""))]	 [args (canonicalize-args (command-line-arguments))]	 [kwstyle (member* '("-k" "-keyword-style") args)]	 [script (member* '("-s" "-ss" "-script") args)])    (cond [script	   (when (or (not (pair? (cdr script)))		     (zero? (string-length (cadr script)))		     (char=? #\- (string-ref (cadr script) 0)) )	     (##sys#error "missing or invalid script argument"))	   (program-name (cadr script))	   (command-line-arguments (cddr script))	   (register-feature! 'script)	   (set-cdr! (cdr script) '()) 	   (when ##sys#windows-platform	     (and-let* ((sname (lookup-script-file (cadr script))))	       (set-car! (cdr script) sname) ) ) ]	  [else	   (set! args (append (canonicalize-args extraopts) args))	   (and-let* ([p (member "--" args)])	     (set-cdr! p '()) ) ] )    (let* ([eval? (member* '("-e" "-p" "-P" "-eval" "-print" "-pretty-print") args)]	   [batch (or script (member* '("-b" "-batch") args) eval?)]	   [quietflag (member* '("-q" "-quiet") args)]	   [quiet (or script quietflag eval?)]	   [ipath (map chop-separator (string-split (or (getenv "CHICKEN_INCLUDE_PATH") "") ";"))] )            (define (collect-options opt)	(let loop ([opts args])	  (cond [(member opt opts) 		 => (lambda (p)		      (if (null? (cdr p))			  (##sys#error "missing argument to command-line option" opt)			  (cons (cadr p) (loop (cddr p)))) ) ]		[else '()] ) ) )      (define (loadinit)	(let ([fn (##sys#string-append "./" init-file)])	  (if (file-exists? fn)	      (load fn)	      (let* ([prefix (chop-separator (or (getenv "HOME") "."))]		     [fn (string-append prefix "/" init-file)] )		(when (file-exists? fn) 		  (load fn) ) ) ) ) )      (define (evalstring str #!optional (rec (lambda _ (void))))	(let ((in (open-input-string str)))	  (do ([x (read in) (read in)])	      ((eof-object? x))	    (rec (receive (eval x))) ) ) )      (when quietflag (set! ##sys#eval-debug-level 0))      (when (member* '("-h" "-help" "--help") args)	(print-usage)	(exit 0) )      (when (member* '("-v" "-version") args)	(print-banner)	(exit 0) )      (when (member "-release" args)	(print (chicken-version))	(exit 0) )      (when (member* '("-w" "-no-warnings") args)	(unless quiet (display "Warnings are disabled\n"))	(set! ##sys#warnings-enabled #f) )      (unless quiet	(load-verbose #t)	(print-banner) )      (when (member* '("-i" "-case-insensitive") args)	(unless quiet (display "Identifiers and symbols are case insensitive\n"))	(register-feature! 'case-insensitive)	(case-sensitive #f) )      (for-each register-feature! (collect-options "-feature"))      (for-each register-feature! (collect-options "-D"))      (set! ##sys#include-pathnames 	(deldups	 (append (map chop-separator (collect-options "-include-path"))		 (map chop-separator (collect-options "-I"))		 ##sys#include-pathnames		 ipath)	 string=?) )      (set! ##sys#features (cons #:match ##sys#features))      (provide 'match)      (when kwstyle	(cond [(not (pair? (cdr kwstyle)))	       (##sys#error "missing argument to `-keyword-style' option") ]	      [(string=? "prefix" (cadr kwstyle))	       (keyword-style #:prefix) ]	      [(string=? "none" (cadr kwstyle))	       (keyword-style #:none) ]	      [(string=? "suffix" (cadr kwstyle))	       (keyword-style #:suffix) ] ) )      (unless (or (member* '("-n" "-no-init") args) script) (loadinit))      (do ([args args (cdr args)])	  ((null? args)	   (unless batch 	     (repl)	     (##sys#write-char-0 #\newline ##sys#standard-output) ) )	(let* ([arg (car args)]	       [len (string-length arg)] )	  (cond ((member 		  arg 		  '("--" "-batch" "-quiet" "-no-init" "-no-warnings" "-script"		    "-b" "-q" "-n" "-w" "-s" "-i"		    "-case-insensitive" "-ss") ) )		((member arg '("-feature" "-include-path" "-keyword-style" 			       "-D" "-I" "-k"))		 (set! args (cdr args)) )		((or (string=? "-R" arg) (string=? "-require-extension" arg))		 (eval `(##core#require-extension ',(string->symbol (cadr args))))		 (set! args (cdr args)) )		((or (string=? "-e" arg) (string=? "-eval" arg))		 (evalstring (cadr args))		 (set! args (cdr args)) )		((or (string=? "-p" arg) (string=? "-print" arg))		 (evalstring 		  (cadr args)		  (cut for-each print <...>) )		 (set! args (cdr args)) )		((or (string=? "-P" arg) (string=? "-pretty-print" arg))		 (evalstring 		  (cadr args)		  (cut for-each pretty-print <...>) )		 (set! args (cdr args)) )		(else		 (load arg) 		 (when (and script (string=? "-ss" (car script)))		   (call-with-values (cut main (command-line-arguments))		     (lambda results		       (exit			(if (and (pair? results) (fixnum? (car results)))			    (car results)			    0) ) ) ) ) ) ) ) ) ) ) )(run)

⌨️ 快捷键说明

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