版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
4. 一直用 基本求值过程的实现,apply SchemeSchemeScheme系统(的支持)但实际可行:Scheme表达式的求值也是一种计算。如果一个语言Scheme解释器。SchemeScheme表达式求值也是一些符号操作,SchemeLisp方言都特别Scheme程序求值的状态 eval负责表达式求值,apply相互递归调用,evalevalapplyassignment-variableassignment-valuemake-procedure构造复合过程(构造过程对象lookup-variable-value取变量的值(在环境中检索apply-primitive-procedureevalapply evalexpenvexpbegincondif过程和所有实参送给apply,要求执行过程应用 (define(evalexp(cond((self-evaluating?exp)((variable?exp)(lookup-variable-valueexpenv))((quoted?exp)(text-of-quotationexp))((assignment?exp)(eval-assignmentexpenv))((definition?exp)(eval-definitionexpenv))((if?exp)(eval-ifexp((lambda?(make-procedure(lambda-parameters(lambda-bodyexp)((begin?
(eval-sequence(begin-actionsexp)env))((coexp(eval(cond->ifexpenv))((applicatione工作更方便(apply(eval(operatorexp)env)
(list-of-values(operandsexp)
(error"Unknownexpressiontype--EVAL" apply-primitive-procedure(define(applyprocedurearguments)(cond((primitive-procedure?procedure)(apply-primitive-procedureprocedurearguments))((compound-procedure?procedure)(eval-(procedure-bodyprocedure)(procedure-parametersprocedure)(procedure-environment(error"Unknownproceduretype--APPLY" eval(define(list-of-valuesexpsenv)(if(no-operands?exps)(cons(eval(first-operandexps)(list-of-values(rest-operandsexps) eval-if(define(eval-ifexp(if(true?(eval(if-predicateexp)env))(eval(if-consequentexp)env)(eval(if-alternativeexp)env)))true?(Scheme)里 (define(eval-assignmentexp(set-variable-value!(assignment-variable(eval(assignment-valueexp)env)(define(eval-definitionexp(define-variable!(definition-variable(eval(definition-valueexp)env)分别由! lambda体(过程体begincond(define(eval-sequenceexps(cond((last-exp?exps)(eval(first-expexps)env))(else(eval(first-expexps)env)(eval-sequence(rest-expsexps) (define(self-evaluating?exp)(cond((number?exp)true)((string?exp)true)(elsefalse)))(define(variable?exp)(symbol? (define(tagged-list?exptag)(if(pair?exp)(eq?(carexp)tag)(quotetext-of-quotation的语法过程:(define(quoted?exp)(tagged-list?exp'quote))(define(text-of-quotationexp)(cadrexp))(setvarvalue的语法过程(define(assignment?exp)(tagged-list?exp'set!))(define(assignment-variableexp)(cadrexp))(define(assignment-valueexp)(caddrexp)) 定义表达式有两种形式:(define<var><value>)(define(<var><parameter1>...<parametern>)(define<var>(lambda(<parameter1>...<parametern>)(define(definition?exp)(tagged-list?exp'define))(define(definition-variableexp)(if(symbol?(cadr(cadrexp)(caadrexp)))(define(definition-valueexp)(if(symbol?(cadrexp))(caddr(make-lambda(cdadr ;formal(cddrexp)))); (define(lambda?exp)(tagged-list?exp'lambda))(define(lambda-parametersexp)(cadrexp))(define(lambda-bodyexp)(cddrexp))(define(make-lambdaparametersbody)(cons'lambda(consparametersbody))) (define(if?exp)(tagged-list?exp'if))(define(if-predicateexp)(cadrexp))(define(if-consequentexp)(caddrexp))(define(if-alternativeexp)(if(not(null?(cdddrexp)))(cadddrexp)if表达式的构造函数(cond时要用(define(make-ifpredicateconsequentalternative)(list'ifpredicateconsequentalternative)) begin包装一系列表达式,要求对它们顺序求值:(define(begin?exp)(tagged-list?expbegin))(define(begin-actionsexp)(cdrexp))(define(last-exp?seq)(null?(cdrseq)))(define(first-expseq)(carseq))(define(rest-expsseq)(cdrsequence->exp(cond->if里),它把包含多个表达式的序列包装为一个begin表达式:(define(sequence->expseq)(cond((null?seq)seq)((last-exp?seq)(first-expseq))(else(make-beginseq))))(define(make-beginseq)(cons'begin (define(application?exp)(pair?exp))(define(operatorexp)(carexp))(define(operandsexp)(cdrexp))(define(no-operands?ops)(null?ops))(define(first-operandops)(carops))(define(rest-operandsops)(cdrops))cond等 condifcond(define(cond?exp)(tagged-list?exp'cond))(define(cond-clausesexp)(cdrexp))(define(cond-else-clause?clause)(eq?(cond-predicateclause)'else))(define(cond-predicateclause)(carclause)) ;noelse(let((first(carclauses))(if(null?rest)(sequence->exp(cond-actionsfirst))(error"ELSEclauseisn'tlast--COND->IF"(expand-clausesrest)))))) false对象都当作逻辑真(define(true?x)(not(eq?xfalse)))(define(false?x)(eq?xfalse))(apply-primitive-procedureproc><args>)(primitive-procedure?proc>)(define(make-procedureparametersbodyenv)(list'procedureparametersbodyenv))(define(compound-procedure?p)(tagged-list?p'procedure))(define(procedure-parametersp)(cadrp))(define(procedure-bodyp)(caddr(define(procedure-environmentp)(cadddr (lookup-variable-value<var>>>(extend-environment<variables><values><base->>(define-variable!<var><value><env<var<value(set-variable-value!<var><value>>>> (define(first-frameenv)(car(define(enclosing-environmentenv)(cdrenv))(definethe-empty-environment'())car是变量表,cdr(define(make-framevariablesvalues)(consvariablesvalues))(define(frame-variablesframe)(carframe))(define(frame-valuesframe)(cdr(define(add-binding-to-frame!varvalframe)(set-car!frame(consvar(carframe)))(set-cdr!frame(consval(cdr (define(extend-environmentvarsvalsbase-env)(if(=(lengthvars)(lengthvals))(cons(make-framevarsvals)base-env)(if(<(lengthvars)(lengthvals))(error"Toomanyargumentssupplied"varsvals)(error"Toofewargumentssupplied"varsvals)))) (define(lookup-variable-valuevarenv0)(define(env-loopenv)(define(scanvarsvals)(cond((null?vars)(env-loop(enclosing-environmentenv)))((eq?var(carvars))(carvals))(else(scan(cdrvars)(cdrvals)))))(if(eq?envthe-empty-environment)(error"Unboundvariable"var)(let((frame(first-frameenv)))(scan(frame-variablesframe)(frame-values(env-loop (define(set-variable-value!varvalenv0)(define(env-loopenv)(define(scanvarsvals)(cond((null?vars)(env-loop(enclosing-environmentenv)))((eq?var(carvars))(set-car!valsval))(else(scan(cdrvars)(cdrvals)))))(if(eq?envthe-empty-environment)(error"Unboundvariable--SET!"var)(let((frame(first-frameenv)))(scan(frame-variablesframe)(frame-valuesframe)))))(env-loopenv0)) (define(define-variable!varvalenv)(let((frame(first-frameenv)))(define(scanvarsvals)(cond((null?(add-binding-to-frame!varvalframe))((eq?var(carvars))(set-car!valsval))(else(scan(cdrvars)(cdr(scan(frame-variablesframe)(frame-values Scheme求值模型的一个严格描述(Scheme语eval在求值中能找到相应过程对象并把它传给apply联,还需要包含true和false等符号(名字)的约束 (define(setup-environment)(let((initial-env(extend-environment(primitive-procedure-(define-variable!'truetrueinitial-env)(define-variable!'falsefalseinitial-env)(definethe-global-environment(setup-apply能识别这一类别,而后 (define(primitive-procedure?proc)(tagged-list?proc'primitive))(define(primitive-implementationproc)(cadrproc))(defineprimitive-procedures(list(list'carcar)(list'cdrcdr)(list'conscons)(list'null?<more(define(primitive-procedure-names)(mapcarprimitive-procedures))(define(primitive-procedure-(map(lambda(proc)(list'primitive(cadrproc))) (define(apply-primitive-procedureprocargs)(primitive-implementationproc)apply-in-underlying-schemeScheme(defineapply-in-underlying-schemeapply-primitive-procedure就可以调用到基础系统里原来的apply基本过程 Scheme系统,给元循环求值器定义一个基本(defineinput-prompt";;;M-Eval(defineoutput-prompt";;;M-Evalvalue:")(define(driver-loop)(prompt-for-inputinput-prompt)(let((input(read)))(let((output(evalinputthe-global-environment)))(announce-outputoutput-prompt)(user-printoutput)))(define(prompt-for-input(newline)(newline)(displaystring)(define(announce-outputstring)(newline)(displaystring)(newline
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/CSEA 35-2025纺织机械零件热喷涂陶瓷涂层 技术条件
- T/UNP 415-2024高性能汽车燃油喷射系统用不锈钢功能材料
- T/GSET 001-2025不同品牌、不同型号电梯群控调度方法和要求
- T/CI 864-2024市政管道清淤施工及验收技术规范
- T/CAFFCI 70-2023食品添加剂 缬草油
- T/CSAE 350-2024轮胎静态刚度特性通用试验方法
- 2025~2026学年江苏省南通市通州区苏教版五年级上册期中数学试卷【附答案】
- 2026学年湖南省常宁市六年级数学期末点睛提升能力提升卷详细参考解析详细答案和解析
- Photoshop专业技能考试试题及详细答案
- 2026年国家公务员政治理论应知应会知识试题库与答案
- 家政入股协议合同范本
- 建筑企业市场开发策略及执行方案
- 2025年江苏省南通市继续教育公需课考试题(含答案)
- 2022北信源第二代防火墙使用手册
- 考古学课件教学课件
- GJB9764-2020可编程逻辑器件软件文档编制规范
- 医学美容科室介绍
- 口腔器械规范打包流程与标准
- 烤烟种植土地流转协议书
- 大学生职业规划大赛《通信工程专业》生涯发展展示
- 矩阵理论 课件 第4章第5节凯莱-哈密顿定理与矩阵的最小多项式
评论
0/150
提交评论