参考sicp04核心过程evaleval以一个表达式exp环境env为_第1页
参考sicp04核心过程evaleval以一个表达式exp环境env为_第2页
参考sicp04核心过程evaleval以一个表达式exp环境env为_第3页
参考sicp04核心过程evaleval以一个表达式exp环境env为_第4页
参考sicp04核心过程evaleval以一个表达式exp环境env为_第5页
已阅读5页,还剩42页未读, 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论