Chapter 10 练习 (Exercises)
- 如果
x
是a
,y
是b
以及z
是(c d)
,写出反引用表达式仅包含产生下列结果之一的变量:
(a) ((C D) A Z)
(b) (X B C D)
(c) ((C D A) Z)
- 使用
cond
来定义if
。 - 定义一个宏,接受一个数字 n ,伴随着一个或多个表达式,并返回第 n 个表达式的值:
> (let ((n 2))
(nth-expr n (/ 1 0) (+ 1 2) (/ 1 0)))
3
- 定义
ntimes
(167 页,译注: 10.5 节)使其展开成一个 (区域)递归函数,而不是一个do
表达式。 - 定义一个宏
n-of
,接受一个数字 n 与一个表达式,返回一个 n 个渐进值:
> (let ((i 0) (n 4))
(n-of n (incf i)))
(1 2 3 4)
- 定义一个宏,接受一变量列表以及一个代码主体,并确保变量在代码主体被求值后恢复 (revert)到原本的数值。
- 下面这个
push
的定义哪里错误?
(defmacro push (obj lst)
`(setf ,lst (cons ,obj ,lst)))
举出一个不会与实际 push 做一样事情的函数调用例子。
- 定义一个将其参数翻倍的宏:
> (let ((x 1))
(double x)
x)
2
脚注
[1] | 要真的复制一个 Lisp 的话, eval 会需要接受第二个参数 (这里的 env ) 来表示词法环境 (lexical enviroment)。这个模型的 eval 是不正确的,因为它在对参数求值前就取出函数,然而 Common Lisp 故意没有特别指出这两个操作的顺序。 |
当前内容版权归 readthedocs 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 readthedocs .