网站大量收购闲置独家精品文档,联系QQ:2885784924

第十五章 定义语法.pdf

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十五章 定义语法

第⼗五章 定义语法 15.1 简介 15.2 实例:简单宏 15.3 syntax-rule的更多细节 15.1 简介 本章中,我会讲解如何⾃定义语法。⽤户定义语法称 宏 (Macro )。Lisp/Scheme 中 的宏⽐C语⾔中的宏更加强⼤。宏可以使你的程序优美⽽紧凑。 宏是代码的变换。代码在被求值或编译前进⾏变换,and the procedure continues as if the transformed codes are written from the be innin . 你可以在Scheme 中通过⽤符合R5RS规范的syntax-rules轻易地定义简单宏,相⽐ 之下,在Common Lisp 中⾃定义语法就复杂多了。使⽤syntax-rules可以直接定义 宏⽽不⽤担⼼变量的捕获 (Variable Capture )。On the other hand , definin complicated macros that cannot be defined usin the syntax-rules is more difficult than that of the Common Lisp . 15.2 实例:简单宏 我将以⼀个简单的宏 为例⼦。 [代码⽚段 1] ⼀个将变量赋值为’()的宏 (define-syntax nil! (syntax-rules () ((_ x) (set! x ())))) syntax-reuls的第⼆个参数由是变换前表达式构成的表。_代表宏的名字。简⾔ 之,代码⽚段1表⽰表达式(nil! x)会变换为(set! x ()). 这类过程不能通过函数来实现,这是因为函数的闭包性质限制它不能影响外部变量。 让我们来⽤函数实现代码⽚段1 ,并观察效果。 (define (f-nil! x) (set! x ())) (define a 1) ;Value: a (f-nil! a) ;Value: 1 a ;Value: 1 ; the value of a dose not change (nil! a) ;Value: 1 a ;Value: () ; a becomes () 我会演⽰另外⼀个例⼦。我们编写宏 hen,其语义为:当谓词求值为真时,求值相 应语句。 (define-syntax hen (syntax-rules () ((_ pred b1 ...) (if pred (begin b1 ...))))) 代码⽚段2 中的...代表了任意多个数的表达式 (包括0个表达式)。代码⽚段2揭⽰了 诸如表达式( hen pred b1 ...)会变换为(if pred (begin b1 ...))。 由于这个宏是将表达式变换为if特殊形式,因此它不能使⽤函数来实现。下⾯的例⼦ 演⽰了如何使⽤ hen。 (let ((i 0)) ( hen (= i 0) (display i == 0) (ne line))) i == 0 ;Unspecified return value 我会演⽰两个实宏: hile和for。只要谓词部分求值为真, hile就会对语句体求 值。⽽数字在指定的范围中,for就会对语句体求值。 (define-syntax hile (syntax-rules () ((_ pred b1 ...) (let loop () ( hen pred b1 ... (loop)))))) (define-syntax for (syntax-rules () ((_ (i from to) b1 ...) (let loop((i from)) ( hen ( i to) b1 ... (loop (1+ i))))))) 下⾯演⽰了如何实⽤它们: define-syntax hile (syntax-rules () ((_ pred b1 ...) (let loop () ( hen pred b1 ... (loop)))))) (define-syntax for (syntax-rules () ((_ (i from to) b

文档评论(0)

liwenhua11 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档