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

📄 library.scm

📁 Scheme跨平台编译器
💻 SCM
📖 第 1 页 / 共 5 页
字号:
(define (eqv? x y) (##core#inline "C_i_eqvp" x y))(define (equal? x y) (##core#inline "C_i_equalp" x y));;; Pairs and lists:(define (pair? x) (##core#inline "C_i_pairp" x))(define (cons x y) (##core#inline_allocate ("C_a_i_cons" 3) x y))(define (car x) (##core#inline "C_i_car" x))(define (cdr x) (##core#inline "C_i_cdr" x))(define (set-car! x y) (##core#inline "C_i_set_car" x y))(define (set-cdr! x y) (##core#inline "C_i_set_cdr" x y))(define (cadr x) (##core#inline "C_i_cadr" x))(define (caddr x) (##core#inline "C_i_caddr" x))(define (cadddr x) (##core#inline "C_i_cadddr" x))(define (cddddr x) (##core#inline "C_i_cddddr" x))(define (caar x) (car (car x)))(define (cdar x) (cdr (car x)))(define (cddr x) (cdr (cdr x)))(define (caaar x) (car (car (car x))))(define (caadr x) (car (##core#inline "C_i_cadr" x)))(define (cadar x) (##core#inline "C_i_cadr" (car x)))(define (cdaar x) (cdr (car (car x))))(define (cdadr x) (cdr (##core#inline "C_i_cadr" x)))(define (cddar x) (cdr (cdr (car x))))(define (cdddr x) (cdr (cdr (cdr x))))(define (caaaar x) (car (car (car (car x)))))(define (caaadr x) (car (car (##core#inline "C_i_cadr" x))))(define (caadar x) (car (##core#inline "C_i_cadr" (car x))))(define (caaddr x) (car (##core#inline "C_i_caddr" x)))(define (cadaar x) (##core#inline "C_i_cadr" (car (car x))))(define (cadadr x) (##core#inline "C_i_cadr" (##core#inline "C_i_cadr" x)))(define (caddar x) (##core#inline "C_i_caddr" (car x)))(define (cdaaar x) (cdr (car (car (car x)))))(define (cdaadr x) (cdr (car (##core#inline "C_i_cadr" x))))(define (cdadar x) (cdr (##core#inline "C_i_cadr" (car x))))(define (cdaddr x) (cdr (##core#inline "C_i_caddr" x)))(define (cddaar x) (cdr (cdr (car (car x)))))(define (cddadr x) (cdr (cdr (##core#inline "C_i_cadr" x))))(define (cdddar x) (cdr (cdr (cdr (car x)))))(define (null? x) (eq? x '()))(define (list . lst) lst)(define (length lst) (##core#inline "C_i_length" lst))(define (list-tail lst i) (##core#inline "C_i_list_tail" lst i))(define (list-ref lst i) (##core#inline "C_i_list_ref" lst i))(define (##sys#delq x lst)  (let loop ([lst lst])    (cond ((null? lst) lst)	  ((eq? x (##sys#slot lst 0)) (##sys#slot lst 1))	  (else (cons (##sys#slot lst 0) (loop (##sys#slot lst 1)))) ) ) )(define ##sys#not-a-proper-list-error  (lambda (arg . loc)    (##sys#signal-hook #:type-error (if (pair? loc) (car loc) #f) "argument is not a proper list" arg) ) )(define append  (lambda lsts    (if (eq? lsts '())	lsts	(let loop ((lsts lsts))	  (if (eq? (##sys#slot lsts 1) '())	      (##sys#slot lsts 0)	      (let copy ((node (##sys#slot lsts 0)))		(cond-expand		 [unsafe		  (if (eq? node '()) 		      (loop (##sys#slot lsts 1))		      (cons (##sys#slot node 0) (copy (##sys#slot node 1))) ) ]		 [else		  (cond ((eq? node '()) (loop (##sys#slot lsts 1)))			((pair? node)			 (cons (##sys#slot node 0) (copy (##sys#slot node 1))) )			(else (##sys#not-a-proper-list-error (##sys#slot lsts 0) 'append)) ) ] ) ) ) ) ) ) )(define reverse   (lambda (lst0)    (let loop ((lst lst0) (rest '()))      (cond-expand       [unsafe	(if (eq? lst '()) 	    rest	    (loop (##sys#slot lst 1) (cons (##sys#slot lst 0) rest))  ) ]       [else	(cond ((eq? lst '()) rest)	      ((pair? lst)	       (loop (##sys#slot lst 1) (cons (##sys#slot lst 0) rest)) )	      (else (##sys#not-a-proper-list-error lst0 'reverse)) ) ] ) ) ) )(define (memq x lst) (##core#inline "C_i_memq" x lst))(define (memv x lst) (##core#inline "C_i_memv" x lst))(define (member x lst) (##core#inline "C_i_member" x lst))(define (assq x lst) (##core#inline "C_i_assq" x lst))(define (assv x lst) (##core#inline "C_i_assv" x lst))(define (assoc x lst) (##core#inline "C_i_assoc" x lst))(define (list? x) (##core#inline "C_i_listp" x));;; Strings:(define (string? x) (##core#inline "C_i_stringp" x))(define (string-length s) (##core#inline "C_i_string_length" s))(define (string-ref s i) (##core#inline "C_i_string_ref" s i))(define (string-set! s i c) (##core#inline "C_i_string_set" s i c))(define-inline (%make-string size fill)  (##sys#allocate-vector size #t fill #f) )(define (##sys#make-string size #!optional (fill #\space))  (%make-string size fill))(define (make-string size . fill)  (##sys#check-exact size 'make-string)  #+(not unsafe)  (when (fx< size 0)    (##sys#signal-hook #:bounds-error 'make-string "size is negative" size))  (%make-string size                (if (null? fill)                    #\space                    (let ((c (car fill)))                      (##sys#check-char c 'make-string)                      c ) ) ) )(define ##sys#string->list   (lambda (s)    (##sys#check-string s 'string->list)    (let ((len (##core#inline "C_block_size" s)))      (let loop ((i 0))	(if (fx>= i len)	    '()	    (cons (##core#inline "C_subchar" s i)		  (loop (fx+ i 1)) ) ) ) ) ) )(define string->list ##sys#string->list)(define (##sys#list->string lst0)  (cond-expand    [unsafe    (let* ([len (length lst0)]           [s (##sys#make-string len)] )      (do ([i 0 (fx+ i 1)]           [lst lst0 (##sys#slot lst 1)] )        ((fx>= i len) s)        (##core#inline "C_setsubchar" s i (##sys#slot lst 0)) ) )]    [else    (if (not (list? lst0))      (##sys#not-a-proper-list-error lst0 'list->string)      (let* ([len (length lst0)]             [s (##sys#make-string len)] )        (do ([i 0 (fx+ i 1)]             [lst lst0 (##sys#slot lst 1)] )          ((fx>= i len) s)          (let ([c (##sys#slot lst 0)])            (##sys#check-char c 'list->string)            (##core#inline "C_setsubchar" s i c) ) ) ) )]    ))(define list->string ##sys#list->string);;; By Sven Hartrumpf:(define (##sys#reverse-list->string l)  (cond-expand    [unsafe    (let* ((n (length l))           (s (##sys#make-string n)))      (let iter ((l2 l) (n2 (fx- n 1)))        (cond ((fx>= n2 0)               (##core#inline "C_setsubchar" s n2 (##sys#slot l2 0))               (iter (##sys#slot l2 1) (fx- n2 1)) ) ) )      s ) ]    [else    (if (list? l)      (let* ((n (length l))             (s (##sys#make-string n)))        (let iter ((l2 l) (n2 (fx- n 1)))          (cond ((fx>= n2 0)                 (let ((c (##sys#slot l2 0)))                   (##sys#check-char c 'reverse-list->string)                   (##core#inline "C_setsubchar" s n2 c) )                 (iter (##sys#slot l2 1) (fx- n2 1)) ) ) )        s )      (##sys#not-a-proper-list-error l 'reverse-list->string) ) ]    ) )(define reverse-list->string ##sys#reverse-list->string)(define (string-fill! s c)  (##sys#check-string s 'string-fill!)  (##sys#check-char c 'string-fill!)  (##core#inline "C_set_memory" s c (##sys#size s))  (##core#undefined) )(define string-copy  (lambda (s)    (##sys#check-string s 'string-copy)    (let* ([len (##sys#size s)]	   [s2 (##sys#make-string len)] )      (##core#inline "C_copy_memory" s2 s len)      s2) ) )(define substring  (lambda (s start . end)    (##sys#check-string s 'substring)    (##sys#check-exact start 'substring)    (let ([end (if (pair? end) 		   (let ([end (car end)])		     (##sys#check-exact end 'substring)		     end) 		   (##sys#size s) ) ] )      (cond-expand       [unsafe (##sys#substring s start end)]       [else	(let ([len (##sys#size s)])	  (if (and (fx<= start end)		   (fx>= start 0)		   (fx<= end len) )	      (##sys#substring s start end)	      (##sys#signal-hook #:bounds-error 'substring "index out of bounds" start end) ) ) ] ) ) ) )(define ##sys#substring  (lambda (s start end)    (let ([s2 (##sys#make-string (fx- end start))])      (##core#inline "C_substring_copy" s s2 start end 0)      s2) ) )(define (string=? x y)  (cond-expand [unsafe (##core#inline "C_u_i_string_equal_p" x y)]	       [else (##core#inline "C_i_string_equal_p" x y)] ) )(define (string-ci=? x y) (##core#inline "C_i_string_ci_equal_p" x y))(letrec ((compare 	  (lambda (s1 s2 loc k)	    (##sys#check-string s1 loc)	    (##sys#check-string s2 loc)	    (let ((len1 (##core#inline "C_block_size" s1))		  (len2 (##core#inline "C_block_size" s2)) )	      (k len1 len2		 (##core#inline "C_string_compare"			    s1			    s2			    (if (fx< len1 len2)				len1				len2) ) ) ) ) ) )  (set! string<? (lambda (s1 s2)		   (compare 		    s1 s2 'string<?		    (lambda (len1 len2 cmp)		      (or (fx< cmp 0)			  (and (fx< len1 len2)			       (eq? cmp 0) ) ) ) ) ) )  (set! string>? (lambda (s1 s2)		   (compare 		    s1 s2 'string>?		    (lambda (len1 len2 cmp)		      (or (fx> cmp 0)			  (and (fx< len2 len1)			       (eq? cmp 0) ) ) ) ) ) )  (set! string<=? (lambda (s1 s2)		    (compare 		     s1 s2 'string<=?		     (lambda (len1 len2 cmp)		       (if (eq? cmp 0)			   (fx<= len1 len2)			   (fx< cmp 0) ) ) ) ) )  (set! string>=? (lambda (s1 s2)		    (compare 		     s1 s2 'string>=?		     (lambda (len1 len2 cmp)		       (if (eq? cmp 0)			   (fx>= len1 len2)			   (fx> cmp 0) ) ) ) ) ) )(letrec ((compare 	  (lambda (s1 s2 loc k)	    (##sys#check-string s1 loc)	    (##sys#check-string s2 loc)	    (let ((len1 (##core#inline "C_block_size" s1))		  (len2 (##core#inline "C_block_size" s2)) )	      (k len1 len2		 (##core#inline "C_string_compare_case_insensitive"				s1				s2				(if (fx< len1 len2)				    len1				    len2) ) ) ) ) ) )  (set! string-ci<? (lambda (s1 s2)		      (compare 		       s1 s2 'string-ci<?		       (lambda (len1 len2 cmp)			 (or (fx< cmp 0)			     (and (fx< len1 len2)				  (eq? cmp 0) ) ) ) ) ) )  (set! string-ci>? (lambda (s1 s2)		      (compare 		       s1 s2 'string-ci>?		       (lambda (len1 len2 cmp)			 (or (fx> cmp 0)			     (and (fx< len2 len1)				  (eq? cmp 0) ) ) ) ) ) )  (set! string-ci<=? (lambda (s1 s2)		       (compare 			s1 s2 'string-ci<=?			(lambda (len1 len2 cmp)			  (if (eq? cmp 0)			      (fx>= len1 len2)			      (fx< cmp 0) ) ) ) ) )  (set! string-ci>=? (lambda (s1 s2)		       (compare 			s1 s2 'string-ci>=?			(lambda (len1 len2 cmp)			  (if (eq? cmp 0)			      (fx<= len1 len2)			      (fx> cmp 0) ) ) ) ) ) )(define (##sys#string-append x y)  (let* ([s1 (##sys#size x)]	 [s2 (##sys#size y)] 	 [z (##sys#make-string (fx+ s1 s2))] )    (##core#inline "C_substring_copy" x z 0 s1 0)    (##core#inline "C_substring_copy" y z 0 s2 s1)    z) )(define string-append  (lambda all    (let ([snew #f])      (let loop ([strs all] [n 0])	(if (eq? strs '())	    (set! snew (##sys#make-string n))	    (let ([s (##sys#slot strs 0)])	      (##sys#check-string s 'string-append)	      (let ([len (##sys#size s)])		(loop (##sys#slot strs 1) (fx+ n len))		(##core#inline "C_substring_copy" s snew 0 len n) ) ) ) )      snew) ) )(define string  (let ([list->string list->string])    (lambda chars (list->string chars)) ) )(define (##sys#fragments->string total fs)  (let ([dest (##sys#make-string total)])    (let loop ([fs fs] [pos 0])      (if (null? fs)	  dest	  (let* ([f (##sys#slot fs 0)]		 [flen (##sys#size f)] )	    (##core#inline "C_substring_copy" f dest 0 flen pos)	    (loop (##sys#slot fs 1) (fx+ pos flen)) ) ) ) ) );;; Numeric routines:(define (fixnum? x) (##core#inline "C_fixnump" x))(define (fx+ x y) (##core#inline "C_fixnum_plus" x y))(define (fx- x y) (##core#inline "C_fixnum_difference" x y))(define (fx* x y) (##core#inline "C_fixnum_times" x y))(define (fx= x y) (eq? x y))(define (fx> x y) (##core#inline "C_fixnum_greaterp" x y))(define (fx< x y) (##core#inline "C_fixnum_lessp" x y))(define (fx>= x y) (##core#inline "C_fixnum_greater_or_equal_p" x y))(define (fx<= x y) (##core#inline "C_fixnum_less_or_equal_p" x y))(define (fxmin x y) (##core#inline "C_i_fixnum_min" x y))(define (fxmax x y) (##core#inline "C_i_fixnum_max" x y))(define (fxneg x) (##core#inline "C_fixnum_negate" x))(define (fxand x y) (##core#inline "C_fixnum_and" x y))(define (fxior x y) (##core#inline "C_fixnum_or" x y))(define (fxxor x y) (##core#inline "C_fixnum_xor" x y))(define (fxnot x) (##core#inline "C_fixnum_not" x))(define (fxshl x y) (##core#inline "C_fixnum_shift_left" x y))(define (fxshr x y) (##core#inline "C_fixnum_shift_right" x y))(define fx/  (lambda (x y)    (cond-expand     [unsafe (##core#inline "C_fixnum_divide" x y)]     [else      (if (eq? y 0)	  (##sys#signal-hook #:arithmetic-error 'fx/ "division by zero" x y)	  (##core#inline "C_fixnum_divide" x y) ) ] ) ) )(define fxmod  (lambda (x y)    (cond-expand     [unsafe (##core#inline "C_fixnum_modulo" x y)]     [else      (if (eq? y 0)	  (##sys#signal-hook #:arithmetic-error 'fxmod "division by zero" x y)	  (##core#inline "C_fixnum_modulo" x y) ) ] ) ) )

⌨️ 快捷键说明

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