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

📄 scheme.scm

📁 Scheme跨平台编译器
💻 SCM
📖 第 1 页 / 共 3 页
字号:
           (let ((y (caddr expr)))             (let ((proc (cons 'lambda (cons (bindings->vars y) (cdddr expr)))))               (scheme-comp (cons (list 'letrec (list (list x proc)) x)                                  (bindings->vals y))                            env))))          ((pair? x)           (scheme-comp (cons (cons 'lambda (cons (bindings->vars x) (cddr expr)))                              (bindings->vals x))                        env))          (else           (comp-body (cddr expr) env)))))(define (bindings->vars bindings)  (if (pair? bindings)    (let ((binding (car bindings)))      (shape binding 2)      (let ((x (car binding)))        (variable x)        (cons x (bindings->vars (cdr bindings)))))    '()))(define (bindings->vals bindings)  (if (pair? bindings)    (let ((binding (car bindings)))      (cons (cadr binding) (bindings->vals (cdr bindings))))    '())); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(define (comp-let* expr env)  (shape expr 3)  (let ((bindings (cadr expr)))    (if (pair? bindings)      (scheme-comp (list 'let                         (list (car bindings))                         (cons 'let* (cons (cdr bindings) (cddr expr))))                   env)      (comp-body (cddr expr) env)))); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(define (comp-letrec expr env)  (shape expr 3)  (let ((bindings (cadr expr)))    (comp-letrec-aux (bindings->vars bindings)                     (bindings->vals bindings)                     (cddr expr)                     env)))(define (comp-letrec-aux vars vals body env)  (if (pair? vars)    (let ((new-env (push-frame vars env)))      (gen-letrec (comp-vals vals new-env)                  (comp-body body new-env)))    (comp-body body env)))(define (comp-vals l env)  (if (pair? l)    (cons (scheme-comp (car l) env) (comp-vals (cdr l) env))    '())); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(define (comp-begin expr env)  (shape expr 2)  (comp-sequence (cdr expr) env))(define (comp-sequence exprs env)  (if (pair? exprs)    (comp-sequence-aux exprs env)    (gen-cst '())))(define (comp-sequence-aux exprs env)  (let ((code (scheme-comp (car exprs) env))        (rest (cdr exprs)))    (if (pair? rest) (gen-sequence code (comp-sequence-aux rest env)) code))); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(define (comp-do expr env)  (shape expr 3)  (let ((bindings (cadr expr))        (exit (caddr expr)))    (shape exit 1)    (let* ((vars (bindings->vars bindings))           (new-env1 (push-frame '(#f) env))           (new-env2 (push-frame vars new-env1)))      (gen-letrec        (list          (gen-lambda            (length vars)            (gen-if              (scheme-comp (car exit) new-env2)              (comp-sequence (cdr exit) new-env2)              (gen-sequence                (comp-sequence (cdddr expr) new-env2)                (gen-combination                  (gen-var-ref '(1 . 1))                  (comp-vals (bindings->steps bindings) new-env2))))))        (gen-combination          (gen-var-ref '(0 . 1))          (comp-vals (bindings->vals bindings) new-env1))))))(define (bindings->steps bindings)  (if (pair? bindings)    (let ((binding (car bindings)))      (cons (if (pair? (cddr binding)) (caddr binding) (car binding))            (bindings->steps (cdr bindings))))    '())); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(define (comp-define expr env)  (shape expr 3)  (let ((pattern (cadr expr)))    (let ((x (if (pair? pattern) (car pattern) pattern)))      (variable x)      (gen-sequence        (gen-var-set (lookup-var x env)                     (scheme-comp (if (pair? pattern)                                    (cons 'lambda (cons (cdr pattern) (cddr expr)))                                    (caddr expr))                                  env))        (gen-cst x))))); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(define (comp-define-macro expr env)  (let ((x (definition-name expr)))    (gen-macro x (scheme-eval (definition-value expr))))); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(define (comp-combination expr env)  (gen-combination (scheme-comp (car expr) env) (comp-vals (cdr expr) env)));------------------------------------------------------------------------------(define (gen-var-ref var)  (if (pair? var)    (gen-rte-ref (car var) (cdr var))    (gen-glo-ref (scheme-global-var var))))(define (gen-rte-ref up over)  (case up    ((0)  (gen-slot-ref-0 over))    ((1)  (gen-slot-ref-1 over))    (else (gen-slot-ref-up-2 (gen-rte-ref (- up 2) over)))))(define (gen-slot-ref-0 i)  (case i    ((0)  (lambda (rte) (vector-ref rte 0)))    ((1)  (lambda (rte) (vector-ref rte 1)))    ((2)  (lambda (rte) (vector-ref rte 2)))    ((3)  (lambda (rte) (vector-ref rte 3)))    (else (lambda (rte) (vector-ref rte i)))))(define (gen-slot-ref-1 i)  (case i    ((0)  (lambda (rte) (vector-ref (vector-ref rte 0) 0)))    ((1)  (lambda (rte) (vector-ref (vector-ref rte 0) 1)))    ((2)  (lambda (rte) (vector-ref (vector-ref rte 0) 2)))    ((3)  (lambda (rte) (vector-ref (vector-ref rte 0) 3)))    (else (lambda (rte) (vector-ref (vector-ref rte 0) i)))))(define (gen-slot-ref-up-2 code)  (lambda (rte) (code (vector-ref (vector-ref rte 0) 0))))(define (gen-glo-ref i)  (lambda (rte) (scheme-global-var-ref i))); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(define (gen-cst val)  (case val    ((()) (lambda (rte) '()))    ((#f) (lambda (rte) #f))    ((#t) (lambda (rte) #t))    ((-2) (lambda (rte) -2))    ((-1) (lambda (rte) -1))    ((0)  (lambda (rte) 0))    ((1)  (lambda (rte) 1))    ((2)  (lambda (rte) 2))    (else (lambda (rte) val)))); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(define (gen-append-form code1 code2)  (lambda (rte) (append (code1 rte) (code2 rte))))(define (gen-cons-form code1 code2)  (lambda (rte) (cons (code1 rte) (code2 rte))))(define (gen-vector-form code)  (lambda (rte) (lst->vector (code rte)))); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(define (gen-var-set var code)  (if (pair? var)    (gen-rte-set (car var) (cdr var) code)    (gen-glo-set (scheme-global-var var) code)))(define (gen-rte-set up over code)  (case up    ((0)  (gen-slot-set-0 over code))    ((1)  (gen-slot-set-1 over code))    (else (gen-slot-set-n (gen-rte-ref (- up 2) 0) over code))))(define (gen-slot-set-0 i code)  (case i    ((0)  (lambda (rte) (vector-set! rte 0 (code rte))))    ((1)  (lambda (rte) (vector-set! rte 1 (code rte))))    ((2)  (lambda (rte) (vector-set! rte 2 (code rte))))    ((3)  (lambda (rte) (vector-set! rte 3 (code rte))))    (else (lambda (rte) (vector-set! rte i (code rte))))))(define (gen-slot-set-1 i code)  (case i    ((0)  (lambda (rte) (vector-set! (vector-ref rte 0) 0 (code rte))))    ((1)  (lambda (rte) (vector-set! (vector-ref rte 0) 1 (code rte))))    ((2)  (lambda (rte) (vector-set! (vector-ref rte 0) 2 (code rte))))    ((3)  (lambda (rte) (vector-set! (vector-ref rte 0) 3 (code rte))))    (else (lambda (rte) (vector-set! (vector-ref rte 0) i (code rte))))))(define (gen-slot-set-n up i code)  (case i    ((0)  (lambda (rte) (vector-set! (up (vector-ref rte 0)) 0 (code rte))))    ((1)  (lambda (rte) (vector-set! (up (vector-ref rte 0)) 1 (code rte))))    ((2)  (lambda (rte) (vector-set! (up (vector-ref rte 0)) 2 (code rte))))    ((3)  (lambda (rte) (vector-set! (up (vector-ref rte 0)) 3 (code rte))))    (else (lambda (rte) (vector-set! (up (vector-ref rte 0)) i (code rte))))))(define (gen-glo-set i code)  (lambda (rte) (scheme-global-var-set! i (code rte)))); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(define (gen-lambda-rest nb-vars body)  (case nb-vars    ((1)  (gen-lambda-1-rest body))    ((2)  (gen-lambda-2-rest body))    ((3)  (gen-lambda-3-rest body))    (else (gen-lambda-n-rest nb-vars body))))(define (gen-lambda-1-rest body)  (lambda (rte)    (lambda a      (body (vector rte a)))))(define (gen-lambda-2-rest body)  (lambda (rte)    (lambda (a . b)      (body (vector rte a b)))))(define (gen-lambda-3-rest body)  (lambda (rte)    (lambda (a b . c)      (body (vector rte a b c)))))(define (gen-lambda-n-rest nb-vars body)  (lambda (rte)    (lambda (a b c . d)      (let ((x (make-vector (+ nb-vars 1))))        (vector-set! x 0 rte)        (vector-set! x 1 a)        (vector-set! x 2 b)        (vector-set! x 3 c)        (let loop ((n nb-vars) (x x) (i 4) (l d))          (if (< i n)            (begin (vector-set! x i (car l)) (loop n x (+ i 1) (cdr l)))            (vector-set! x i l)))        (body x)))))(define (gen-lambda nb-vars body)  (case nb-vars    ((0)  (gen-lambda-0 body))    ((1)  (gen-lambda-1 body))    ((2)  (gen-lambda-2 body))    ((3)  (gen-lambda-3 body))    (else (gen-lambda-n nb-vars body))))(define (gen-lambda-0 body)  (lambda (rte)    (lambda ()      (body rte))))(define (gen-lambda-1 body)  (lambda (rte)    (lambda (a)      (body (vector rte a)))))(define (gen-lambda-2 body)  (lambda (rte)    (lambda (a b)      (body (vector rte a b)))))(define (gen-lambda-3 body)  (lambda (rte)    (lambda (a b c)      (body (vector rte a b c)))))(define (gen-lambda-n nb-vars body)  (lambda (rte)    (lambda (a b c . d)      (let ((x (make-vector (+ nb-vars 1))))        (vector-set! x 0 rte)        (vector-set! x 1 a)        (vector-set! x 2 b)        (vector-set! x 3 c)        (let loop ((n nb-vars) (x x) (i 4) (l d))          (if (<= i n)            (begin (vector-set! x i (car l)) (loop n x (+ i 1) (cdr l)))))        (body x))))); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(define (gen-sequence code1 code2)  (lambda (rte) (code1 rte) (code2 rte))); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(define (gen-when code1 code2)  (lambda (rte)    (if (code1 rte)      (code2 rte)      '())))(define (gen-if code1 code2 code3)  (lambda (rte)    (if (code1 rte)      (code2 rte)      (code3 rte)))); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(define (gen-cond-send code1 code2 code3)  (lambda (rte)    (let ((temp (code1 rte)))      (if temp        ((code2 rte) temp)        (code3 rte)))))              ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(define (gen-and code1 code2)  (lambda (rte)    (let ((temp (code1 rte)))      (if temp        (code2 rte)        temp)))); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(define (gen-or code1 code2)  (lambda (rte)    (let ((temp (code1 rte)))      (if temp        temp        (code2 rte)))))

⌨️ 快捷键说明

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