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

📄 c-platform.scm

📁 Scheme跨平台编译器
💻 SCM
📖 第 1 页 / 共 4 页
字号:
	       (lambda (x y)		 (if (and (eq? 'quote (node-class y)) (= 2 (first (node-parameters y))))		     (make-node '##core#inline '("C_fixnum_shift_left") (list x (qnode 1)))		     (make-node '##core#inline '("C_fixnum_times") (list x y)) ) )	       callargs) ) ) ]	   [else #f] ) ) ) )(rewrite  '- 8  (lambda (db classargs cont callargs)   ;; (- <x>) -> (##core#inline "C_fixnum_negate" <x>)  [fixnum-mode]   ;; (- <x>) -> (##core#inline "C_u_fixnum_negate" <x>)  [fixnum-mode + unsafe]   ;; (- <x1> ...) -> (##core#inline "C_fixnum_difference" <x1> (##core#inline "C_fixnum_difference" ...)) [fixnum-mode]   ;; (- <x1> ...) -> (##core#inline "C_u_fixnum_difference" <x1> (##core#inline "C_u_fixnum_difference" ...))    ;;    [fixnum-mode + unsafe]   ;; - Remove "0" from arguments, if more than 1.   (cond [(null? callargs) #f]	 [(and (null? (cdr callargs)) (eq? number-type 'fixnum))	  (make-node	   '##core#call '(#t)	   (list cont		 (make-node '##core#inline			    (if unsafe '("C_u_fixnum_negate") '("C_fixnum_negate"))			    callargs)) ) ]	 [else	  (let ([callargs		 (cons (car callargs)		       (remove			(lambda (x)			  (and (eq? 'quote (node-class x))			       (zero? (first (node-parameters x))) ) ) 			(cdr callargs) ) ) ] )	    (and (eq? number-type 'fixnum)		 (>= (length callargs) 2)		 (make-node		  '##core#call '(#t)		  (list 		   cont		   (fold-inner		    (lambda (x y)		      (make-node '##core#inline 				 (if unsafe '("C_u_fixnum_difference") '("C_fixnum_difference"))				 (list x y) ) )		    callargs) ) ) ) ) ] ) ) )(rewrite  '/ 8  (lambda (db classargs cont callargs)   ;; (/ <x1> ...) -> (##core#inline "C_fixnum_divide" <x1> (##core#inline "C_fixnum_divide" ...)) [fixnum-mode]   ;; - Remove "1" from arguments, if more than 1.   ;; - Replace divisions by 2 with shift right. [fixnum-mode]   (and (>= (length callargs) 2)	(let ([callargs	       (cons (car callargs)		     (remove		      (lambda (x)			(and (eq? 'quote (node-class x))			     (= 1 (first (node-parameters x))) ) ) 		      (cdr callargs) ) ) ] )	  (and (eq? number-type 'fixnum)	       (>= (length callargs) 2)	       (make-node		'##core#call '(#t)		(list		 cont		 (fold-inner		  (lambda (x y)		    (if (and (eq? 'quote (node-class y)) (= 2 (first (node-parameters y))))			(make-node '##core#inline '("C_fixnum_shift_right") (list x (qnode 1)))			(make-node '##core#inline '("C_fixnum_divide") (list x y)) ) )		  callargs) ) ) ) ) ) ) )(rewrite 'quotient 8 (lambda (db classargs cont callargs)   ;; (quotient <x> 2) -> (##core#inline "C_fixnum_shift_right" <x> 1) [fixnum-mode]   ;; (quotient <x> <y>) -> (##core#inline "C_fixnum_divide" <x> <y>) [fixnum-mode]   ;; (quotient <x> <y>) -> ((##core#proc "C_quotient") <x> <y>)   (and (= (length callargs) 2)	(if (eq? 'fixnum number-type)	    (make-node	     '##core#call '(#t)	     (let ([arg2 (second callargs)])	       (list cont 		     (if (and (eq? 'quote (node-class arg2)) 			      (= 2 (first (node-parameters arg2))) )			 (make-node 			  '##core#inline '("C_fixnum_shift_right") 			  (list (first callargs) (qnode 1)) )			 (make-node '##core#inline '("C_fixnum_divide") callargs) ) ) ) )	    (make-node	     '##core#call '(#t)	     (cons* (make-node '##core#proc '("C_quotient" #t) '()) cont callargs) ) ) ) ) )(rewrite 'eqv? 8 (lambda (db classargs cont callargs)   ;; (eqv? <var> <var>) -> (quote #t)   ;; (eqv? ...) -> (##core#inline "C_eqp" ...) [one argument is a constant and not a flonum]   (and (= (length callargs) 2)	(let ([arg1 (first callargs)]	      [arg2 (second callargs)] )	  (or (and (eq? '##core#variable (node-class arg1))		   (eq? '##core#variable (node-class arg2))		   (equal? (node-parameters arg1) (node-parameters arg2))		   (make-node '##core#call '(#t) (list cont (qnode #t))) )	      (and (or (and (eq? 'quote (node-class arg1))			    (not (flonum? (first (node-parameters arg1)))) )		       (and (eq? 'quote (node-class arg2))			    (not (flonum? (first (node-parameters arg2)))) ) )		   (make-node		    '##core#call '(#t) 		    (list cont (make-node '##core#inline '("C_eqp") callargs)) ) ) ) ) ) ) )(rewrite 'equal? 8 (lambda (db classargs cont callargs)   ;; (equal? <var> <var>) -> (quote #t)   ;; (equal? ...) -> (##core#inline "C_eqp" ...) [one argument is a constant and immediate or a symbol]   ;; (equal? ...) -> (##core#inline "C_i_equalp" ...)   (and (= (length callargs) 2)	(let ([arg1 (first callargs)]	      [arg2 (second callargs)] )	  (or (and (eq? '##core#variable (node-class arg1))		   (eq? '##core#variable (node-class arg2))		   (equal? (node-parameters arg1) (node-parameters arg2))		   (make-node '##core#call '(#t) (list cont (qnode #t))) )	      (and (or (and (eq? 'quote (node-class arg1))			    (let ([f (first (node-parameters arg1))])			      (or (immediate? f) (symbol? f)) ) )		       (and (eq? 'quote (node-class arg2))			    (let ([f (first (node-parameters arg2))])			      (or (immediate? f) (symbol? f)) ) ) )		   (make-node		    '##core#call '(#t) 		    (list cont (make-node '##core#inline '("C_eqp") callargs)) ) )	      (make-node	       '##core#call '(#t) 	       (list cont (make-node '##core#inline '("C_i_equalp") callargs)) ) ) ) ) ) )(let ()  (define (rewrite-apply db classargs cont callargs)    ;; (apply <fn> <x1> ... '(<y1> ...)) -> (<fn> <x1> ... '<y1> ...)    ;; (apply ...) -> ((##core#proc "C_apply") ...)    ;; (apply values <lst>) -> ((##core#proc "C_apply_values") lst)    ;; (apply ##sys#values <lst>) -> ((##core#proc "C_apply_values") lst)    (and (pair? callargs)	 (let ([lastarg (last callargs)]	       [proc (car callargs)] )	   (if (eq? 'quote (node-class lastarg))	       (make-node		'##core#call '(#f)		(cons* (first callargs)		       cont 		       (append (cdr (butlast callargs)) (map qnode (first (node-parameters lastarg)))) ) )	       (or (and (eq? '##core#variable (node-class proc))			(= 2 (length callargs))			(let ([name (car (node-parameters proc))])			  (and (memq name '(values ##sys#values))			       (or (get db name 'standard-binding)				   (get db name 'extended-binding) )			       (make-node				'##core#call '(#t)				(list (make-node '##core#proc '("C_apply_values" #t) '())				      cont				      (cadr callargs) ) ) ) ) ) 		   (make-node		    '##core#call '(#t)		    (cons* (make-node '##core#proc '("C_apply" #t) '())			   cont callargs) ) ) ) ) ) )  (rewrite 'apply 8 rewrite-apply)  (rewrite '##sys#apply 8 rewrite-apply) )(let ()  (define (rewrite-c..r op iop1 iop2 index)    (rewrite     op 8     (lambda (db classargs cont callargs)       ;; (<op> <rest-vector>) -> (##core#inline "C_i_vector_ref"/"C_slot" <rest-vector> (quote <index>))       ;; (<op> <x>) -> (##core#inline <iop1> <x>) [safe]       ;; (<op> <x>) -> (##core#inline <iop2> <x>) [unsafe]       (and (= (length callargs) 1)	    (call-with-current-continuation	     (lambda (return)	       (let ([arg (first callargs)])		 (make-node		  '##core#call '(#t)		  (list		   cont		   (cond [(and (eq? '##core#variable (node-class arg))			       (eq? 'vector (get db (first (node-parameters arg)) 'rest-parameter)) )			  (make-node			   '##core#inline 			   (if unsafe			       '("C_slot")			       '("C_i_vector_ref") )			   (list arg (qnode index)) ) ]			 [(and unsafe iop2) (make-node '##core#inline (list iop2) callargs)]			 [iop1 (make-node '##core#inline (list iop1) callargs)]			 [else (return #f)] ) ) ) ) ) ) ) ) ) )  (rewrite-c..r 'car "C_i_car" "C_u_i_car" 0)  (rewrite-c..r 'cadr "C_i_cadr" "C_u_i_cadr" 1)  (rewrite-c..r 'caddr "C_i_caddr" "C_u_i_caddr" 2)  (rewrite-c..r 'cadddr "C_i_cadddr" "C_u_i_cadddr" 3)  (rewrite-c..r 'first "C_i_car" "C_u_i_car" 0)  (rewrite-c..r 'second "C_i_cadr" "C_u_i_cadr" 1)  (rewrite-c..r 'third "C_i_caddr" "C_u_i_caddr" 2)  (rewrite-c..r 'fourth "C_i_cadddr" "C_u_i_cadddr" 3) )(let ([rvalues       (lambda (db classargs cont callargs)	 ;; (values <x>) -> <x>	 (and (= (length callargs) 1)	      (make-node '##core#call '(#t) (cons cont callargs) ) ) ) ] )  (rewrite 'values 8 rvalues)  (rewrite '##sys#values 8 rvalues) )(let ()  (define (rewrite-c-w-v db classargs cont callargs)   ;; (call-with-values <var1> <var2>) -> (let ((k (lambda (r) (<var2> <k0> r)))) (<var1> k))   ;; - if <var2> is a known lambda of a single argument   (and (= 2 (length callargs))	(let ((arg1 (car callargs))	      (arg2 (cadr callargs)) )	  (and (eq? '##core#variable (node-class arg1))	; probably not needed	       (eq? '##core#variable (node-class arg2))	       (and-let* ((sym (car (node-parameters arg2)))			  (val (get db sym 'value)) )		 (and (eq? '##core#lambda (node-class val))		      (let ((llist (third (node-parameters val))))			(and (proper-list? llist)			     (= 2 (length (third (node-parameters val))))			     (let ((tmp (gensym))				   (tmpk (gensym 'r)) )			       (debugging 'o "removing single-valued `call-with-values'" (node-parameters val))			       (make-node				'let (list tmp)				(list (make-node				       '##core#lambda				       (list (gensym 'f_) #f (list tmpk) 0)				       (list (make-node					      '##core#call '(#t)					      (list arg2 cont (varnode tmpk)) ) ) ) 				      (make-node				       '##core#call '(#t)				       (list arg1 (varnode tmp)) ) ) ) ) ) ) ) ) ) ) ) )  (rewrite 'call-with-values 8 rewrite-c-w-v)  (rewrite '##sys#call-with-values 8 rewrite-c-w-v) )(rewrite 'values 13 "C_values" #t)(rewrite '##sys#values 13 "C_values" #t)(rewrite 'call-with-values 13 "C_u_call_with_values" #f)(rewrite 'call-with-values 13 "C_call_with_values" #t)(rewrite '##sys#call-with-values 13 "C_u_call_with_values" #f)(rewrite '##sys#call-with-values 13 "C_call_with_values" #t)(rewrite 'cpu-time 13 "C_cpu_time" #t)(rewrite 'locative-ref 13 "C_locative_ref" #t)(rewrite '##sys#continuation-graft 13 "C_continuation_graft" #t)(rewrite 'caar 2 1 "C_u_i_caar" #f #f)(rewrite 'cdar 2 1 "C_u_i_cdar" #f #f)(rewrite 'cddr 2 1 "C_u_i_cddr" #f #f)(rewrite 'caaar 2 1 "C_u_i_caaar" #f #f)(rewrite 'cadar 2 1 "C_u_i_cadar" #f #f)(rewrite 'caddr 2 1 "C_u_i_caddr" #f #f)(rewrite 'cdaar 2 1 "C_u_i_cdaar" #f #f)(rewrite 'cdadr 2 1 "C_u_i_cdadr" #f #f)(rewrite 'cddar 2 1 "C_u_i_cddar" #f #f)(rewrite 'cdddr 2 1 "C_u_i_cdddr" #f #f)(rewrite 'caaaar 2 1 "C_u_i_caaaar" #f #f)(rewrite 'caadar 2 1 "C_u_i_caadar" #f #f)(rewrite 'caaddr 2 1 "C_u_i_caaddr" #f #f)(rewrite 'cadaar 2 1 "C_u_i_cadaar" #f #f)

⌨️ 快捷键说明

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