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

📄 dynamic.scm

📁 Scheme跨平台编译器
💻 SCM
📖 第 1 页 / 共 5 页
字号:
; dynamic-parse-begin(define (dynamic-parse-begin env args)  (dynamic-parse-action-begin-expression   (dynamic-parse-body env args))); dynamic-parse-cond(define (dynamic-parse-cond env args)  (if (and (pair? args) (list? args))      (dynamic-parse-action-cond-expression       (map (lambda (e)              (dynamic-parse-cond-clause env e))            args))      (error 'dynamic-parse-cond "Not a list of cond-clauses: ~s" args))); dynamic-parse-cond-clause(define (dynamic-parse-cond-clause env e)  ;; ***Note***: Only (<test> <sequence>) is permitted!  (if (pair? e)      (cons       (if (eqv? (car e) 'else)           (dynamic-parse-action-empty)           (dynamic-parse-expression env (car e)))       (dynamic-parse-body env (cdr e)))      (error 'dynamic-parse-cond-clause "Not a cond-clause: ~s" e))); dynamic-parse-and(define (dynamic-parse-and env args)  (if (list? args)      (dynamic-parse-action-and-expression       (dynamic-parse-expression* env args))      (error 'dynamic-parse-and "Not a list of arguments: ~s" args))); dynamic-parse-or(define (dynamic-parse-or env args)  (if (list? args)      (dynamic-parse-action-or-expression       (dynamic-parse-expression* env args))      (error 'dynamic-parse-or "Not a list of arguments: ~s" args))); dynamic-parse-case(define (dynamic-parse-case env args)  (if (and (list? args) (> (length args) 1))      (dynamic-parse-action-case-expression       (dynamic-parse-expression env (car args))       (map (lambda (e)               (dynamic-parse-case-clause env e))             (cdr args)))      (error 'dynamic-parse-case "Not a list of clauses: ~s" args))); dynamic-parse-case-clause(define (dynamic-parse-case-clause env e)  (if (pair? e)      (cons       (cond        ((eqv? (car e) 'else)         (list (dynamic-parse-action-empty)))        ((list? (car e))         (map dynamic-parse-datum (car e)))        (else (error 'dynamic-parse-case-clause "Not a datum list: ~s" (car e))))       (dynamic-parse-body env (cdr e)))      (error 'dynamic-parse-case-clause "Not case clause: ~s" e))); dynamic-parse-let(define (dynamic-parse-let env args)  (if (pair? args)      (if (symbol? (car args))          (dynamic-parse-named-let env args)          (dynamic-parse-normal-let env args))      (error 'dynamic-parse-let "Illegal bindings/body: ~s" args))); dynamic-parse-normal-let(define (dynamic-parse-normal-let env args)  ;; parses "normal" let-expressions  (let* ((bindings (car args))         (body (cdr args))         (env-ast (dynamic-parse-parallel-bindings env bindings))         (nenv (car env-ast))         (bresults (cdr env-ast)))    (dynamic-parse-action-let-expression     bresults     (dynamic-parse-body (extend-env-with-env env nenv) body)))); dynamic-parse-named-let(define (dynamic-parse-named-let env args)  ;; parses a named let-expression  (if (pair? (cdr args))      (let* ((variable (car args))             (bindings (cadr args))             (body (cddr args))             (vbind-vres (dynamic-parse-formal dynamic-empty-env variable))             (vbind (car vbind-vres))             (vres (cdr vbind-vres))             (env-ast (dynamic-parse-parallel-bindings env bindings))             (nenv (car env-ast))             (bresults (cdr env-ast)))        (dynamic-parse-action-named-let-expression         vres bresults         (dynamic-parse-body (extend-env-with-env                       (extend-env-with-binding env vbind)                      nenv) body)))      (error 'dynamic-parse-named-let "Illegal named let-expression: ~s" args))); dynamic-parse-parallel-bindings(define (dynamic-parse-parallel-bindings env bindings)  ; returns a pair consisting of an environment  ; and a list of pairs (variable . asg)  ; ***Note***: the list of pairs is returned in reverse unzipped form!  (if (list-of-list-of-2s? bindings)      (let* ((env-formals-asg             (dynamic-parse-formal* (map car bindings)))            (nenv (car env-formals-asg))            (bresults (cdr env-formals-asg))            (exprs-asg             (dynamic-parse-expression* env (map cadr bindings))))        (cons nenv (cons bresults exprs-asg)))      (error 'dynamic-parse-parallel-bindings             "Not a list of bindings: ~s" bindings))); dynamic-parse-let*(define (dynamic-parse-let* env args)  (if (pair? args)      (let* ((bindings (car args))             (body (cdr args))             (env-ast (dynamic-parse-sequential-bindings env bindings))             (nenv (car env-ast))             (bresults (cdr env-ast)))        (dynamic-parse-action-let*-expression         bresults         (dynamic-parse-body (extend-env-with-env env nenv) body)))      (error 'dynamic-parse-let* "Illegal bindings/body: ~s" args))); dynamic-parse-sequential-bindings(define (dynamic-parse-sequential-bindings env bindings)  ; returns a pair consisting of an environment  ; and a list of pairs (variable . asg)  ;; ***Note***: the list of pairs is returned in reverse unzipped form!  (letrec      ((psb        (lambda (f-env c-env var-defs expr-asgs binds)          ;; f-env: forbidden environment          ;; c-env: constructed environment          ;; var-defs: results of formals          ;; expr-asgs: results of corresponding expressions          ;; binds: reminding bindings to process          (cond           ((null? binds)            (cons f-env (cons var-defs expr-asgs)))           ((pair? binds)            (let ((fst-bind (car binds)))              (if (list-of-2? fst-bind)                  (let* ((fbinding-bres                          (dynamic-parse-formal f-env (car fst-bind)))                         (fbind (car fbinding-bres))                         (bres (cdr fbinding-bres))                         (new-expr-asg                          (dynamic-parse-expression c-env (cadr fst-bind))))                    (psb                     (extend-env-with-binding f-env fbind)                     (extend-env-with-binding c-env fbind)                     (cons bres var-defs)                     (cons new-expr-asg expr-asgs)                     (cdr binds)))                  (error 'dynamic-parse-sequential-bindings                         "Illegal binding: ~s" fst-bind))))           (else (error 'dynamic-parse-sequential-bindings                        "Illegal bindings: ~s" binds))))))    (let ((env-vdefs-easgs (psb dynamic-empty-env env '() '() bindings)))      (cons (car env-vdefs-easgs)            (cons (reverse (cadr env-vdefs-easgs))                  (reverse (cddr env-vdefs-easgs))))))); dynamic-parse-letrec(define (dynamic-parse-letrec env args)  (if (pair? args)      (let* ((bindings (car args))             (body (cdr args))             (env-ast (dynamic-parse-recursive-bindings env bindings))             (nenv (car env-ast))             (bresults (cdr env-ast)))        (dynamic-parse-action-letrec-expression          bresults          (dynamic-parse-body (extend-env-with-env env nenv) body)))      (error 'dynamic-parse-letrec "Illegal bindings/body: ~s" args))); dynamic-parse-recursive-bindings(define (dynamic-parse-recursive-bindings env bindings)  ;; ***Note***: the list of pairs is returned in reverse unzipped form!  (if (list-of-list-of-2s? bindings)      (let* ((env-formals-asg              (dynamic-parse-formal* (map car bindings)))             (formals-env              (car env-formals-asg))             (formals-res              (cdr env-formals-asg))             (exprs-asg              (dynamic-parse-expression*               (extend-env-with-env env formals-env)               (map cadr bindings))))        (cons         formals-env         (cons formals-res exprs-asg)))      (error 'dynamic-parse-recursive-bindings "Illegal bindings: ~s" bindings))); dynamic-parse-do(define (dynamic-parse-do env args)  ;; parses do-expressions  ;; ***Note***: Not implemented!  (error 'dynamic-parse-do "Nothing yet...")); dynamic-parse-quasiquote(define (dynamic-parse-quasiquote env args)  ;; ***Note***: Not implemented!  (error 'dynamic-parse-quasiquote "Nothing yet..."));; Command; dynamic-parse-command(define (dynamic-parse-command env c)  (if (pair? c)      (let ((op (car c))            (args (cdr c)))        (case op         ((define) (dynamic-parse-define env args));        ((begin) (dynamic-parse-command* env args))  ;; AKW         ((begin) (dynamic-parse-action-begin-expression (dynamic-parse-command* env args)))         (else (dynamic-parse-expression env c))))      (dynamic-parse-expression env c))); dynamic-parse-command*(define (dynamic-parse-command* env commands)  ;; parses a sequence of commands  (if (list? commands)      (map (lambda (command) (dynamic-parse-command env command)) commands)      (error 'dynamic-parse-command* "Invalid sequence of commands: ~s" commands))); dynamic-parse-define(define (dynamic-parse-define env args)  ;; three cases -- see IEEE Scheme, sect. 5.2  ;; ***Note***: the parser admits forms (define (x . y) ...)  ;; ***Note***: Variables are treated as applied occurrences!  (if (pair? args)      (let ((pattern (car args))            (exp-or-body (cdr args)))        (cond         ((symbol? pattern)          (if (list-of-1? exp-or-body)              (dynamic-parse-action-definition               (dynamic-parse-variable env pattern)               (dynamic-parse-expression env (car exp-or-body)))              (error 'dynamic-parse-define "Not a single expression: ~s" exp-or-body)))         ((pair? pattern)          (let* ((function-name (car pattern))                 (function-arg-names (cdr pattern))                 (env-ast (dynamic-parse-formals function-arg-names))                 (formals-env (car env-ast))                 (formals-ast (cdr env-ast)))            (dynamic-parse-action-function-definition             (dynamic-parse-variable env function-name)             formals-ast             (dynamic-parse-body (extend-env-with-env env formals-env) exp-or-body))))         (else (error 'dynamic-parse-define "Not a valid pattern: ~s" pattern))))      (error 'dynamic-parse-define "Not a valid definition: ~s" args)));; Auxiliary routines; forall?(define (forall? pred list)  (if (null? list)      #t      (and (pred (car list)) (forall? pred (cdr list))))); list-of-1?(define (list-of-1? l)  (and (pair? l) (null? (cdr l)))); list-of-2?(define (list-of-2? l)  (and (pair? l) (pair? (cdr l)) (null? (cddr l)))); list-of-3?(define (list-of-3? l)  (and (pair? l) (pair? (cdr l)) (pair? (cddr l)) (null? (cdddr l)))); list-of-list-of-2s?(define (list-of-list-of-2s? e)  (cond   ((null? e)    #t)   ((pair? e)    (and (list-of-2? (car e)) (list-of-list-of-2s? (cdr e))))   (else #f)));; File processing; dynamic-parse-from-port(define (dynamic-parse-from-port port)  (let ((next-input (read port)))    (if (eof-object? next-input)        '()        (dynamic-parse-action-commands         (dynamic-parse-command dynamic-empty-env next-input)         (dynamic-parse-from-port port))))); dynamic-parse-file(define (dynamic-parse-file file-name)  (let ((input-port (open-input-file file-name)))    (dynamic-parse-from-port input-port)));----------------------------------------------------------------------------; Implementation of Union/find data structure in Scheme;----------------------------------------------------------------------------;; for union/find the following attributes are necessary: rank, parent ;; (see Tarjan, "Data structures and network algorithms", 1983);; In the Scheme realization an element is represented as a single;; cons cell; its address is the element itself; the car field contains ;; the parent, the cdr field is an address for a cons;; cell containing the rank (car field) and the information (cdr field);; general union/find data structure;; ;; gen-element: Info -> Elem;; find: Elem -> Elem;; link: Elem! x Elem! -> Elem;; asymm-link: Elem! x Elem! -> Elem;; info: Elem -> Info;; set-info!: Elem! x Info -> Void(define (gen-element info)  ; generates a new element: the parent field is initialized to '(),  ; the rank field to 0  (cons '() (cons 0 info)))(define info (lambda (l) (cddr l)))  ; returns the information stored in an element(define (set-info! elem info)  ; sets the info-field of elem to info

⌨️ 快捷键说明

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