第十章:宏.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第十章:宏

第⼗章:宏 Lisp 代码是由 Lisp 对象的列表来表⽰。2.3 节宣称这让 Lisp 可以写出可⾃⼰写程序的 程序。本章将⽰范如何跨越表达式 代码的界线。 10 .1 求值 (Eval) 10 .2 宏 (Macros) 10 .3 反引号 (Backquote) 10 .4 ⽰例:快速排序法(Example: Quicksort) 10 . 设计宏 (Macro Design) 10 .6 通⽤化引⽤ (Generalized Reference) 10 .7 ⽰例:实⽤的宏函数 (Example: Macro Utilities) 10 .8 源⾃ Lisp (On Lisp) Chapter 10 总结 (Summary) Chapter 10 练习 (Exercises) 10.1 求值 (Eval) 如何产⽣表达式是很直观的:调⽤ list 即可。我们没有考虑到的是,如何使 Lisp 将 列表视为代码。这之间缺少的⼀环是函数 eval,它接受⼀个表达式,将其求值,然 后返回它的值: (eval (+ 1 2 3)) 6 (eval (format t Hello)) Hello NIL 如果这看起很熟悉的话,这是应该的。这就是我们⼀直交谈的那个 eval 。下⾯这个 函数实现了 顶层⾮常相似的东西: (defun our-toplevel () (do () (nil) (format t % ) (print (eval (read))))) 也是因为这个原因,顶层也称为读取─求值─打印循环 (read-eval-print loop , REPL) 。 调⽤ eval 是跨越代码 列表界线的⼀种⽅法。但它不是⼀个好⽅法: 1. 它的效率低下: eval 处理的是原始列表 (raw list) ,或者当下编译它,或者⽤ 直译器求值。两种⽅法都⽐执⾏编译过的代码来得慢许多。 2. 表达式在没有词法语境 (lexical context)的情况下被求值。举例来说,如果你在 ⼀个 let ⾥调⽤ eval ,传给 eval 的表达式将⽆法引⽤由 let 所设置的变 量。 有许多更好的⽅法 (下⼀节叙述)来利⽤产⽣代码的这个可能性。当然 eval 也是有⽤ 的,唯⼀合法的⽤途像是在顶层循环使⽤它。 对于程序员来说, eval 的主要价值⼤概是作为 Lisp 的概念模型。我们可以想像 Lisp 是由⼀个长的 cond 表达式定义⽽成: (defun eval (expr env) (cond ... ((eql (car expr) quote) (cdr expr)) ... (t (apply (symbol-function (car expr)) (mapcar #(lambda (x) (eval x env)) (cdr expr)))))) 许多表达式由预设⼦句 (default clause)来处理,预设⼦句获得 car 所引⽤的函数, 将 cdr 所有的参数求值,并返回将前者应⽤⾄后者的结果。 [1] 但是像 (quote x) 那样的句⼦就不能⽤这样的⽅式来处理,因为 quote 就是为了 防⽌它的参数被求值⽽存在的。所以我们需要给quote 写⼀个特别的⼦句。这也是为 什么本质上将其称为特殊操作符 (special operator): ⼀个需要被实现为 eval 的⼀个特 殊情况的操作符。 函数 coerce compile 提供了⼀个类似的桥梁,让你把列表转成代码。你可 以 coerce ⼀个 lambda 表达式,使其成为函数, (coerce (lambda (x) x) function) #Interpreted-Function BF9D96 ⽽如果你将 nil 作为第⼀个参数传给 compile ,它会编译作为第⼆个参数传⼊的 lambda 表达式。 (compile nil (lambda (x) (+ x 2))) #Compil

文档评论(0)

精品报告 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档