- 1、本文档共3页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)