【发布时间】:2017-05-04 01:41:48
【问题描述】:
我刚刚开始学习宏函数的概念。
我的老师要求我们创建一个与incf 完全相同的宏函数。
这是他给我们的流行音乐示例
(defmacro mypop (nom)
(list 'prog1 (list 'car nom) (list 'setq nom (list 'cdr nom))) )
这是我试图变成宏的常规函数:
(defun iincf (elem &optional num )
(cond
((not num) (setq elem (+ 1 elem)))
(t (setq elem (+ num elem))) ) )
这是我将其变成宏的尝试:
(defmacro myincf (elem &optional num )
(list 'cond
((list 'not num) (list 'setq elem (list '+ 1 elem)))
(t (list 'setq elem (list '+ num elem))) ) )
但是,我得到了这个错误,我不知道为什么:
*** - system::%expand-form: (list 'not num) should be a lambda expression
另外,我不确定我的函数是否真的会改变顶层变量的值。
这是我的两个问题:
- 为什么会出现此错误?
- 我试图将其转换为宏的函数是否正常? (如果成功地把它变成一个宏函数,它会做我打算做的吗?)
PS:我知道这个练习可能会违反 lisp 中的许多常见规则,但这只是为了练习。谢谢! :)
【问题讨论】:
-
我只想告诉你Portacle,一个可移植的多平台 Common Lisp 开发环境(包含 Emacs、SBCL、Slime、Quicklips 和 Git),因为它是获得优秀开发人员的最简单方法环境,我知道我确实很高兴找到它 :) 以及关于 lisp-lang.org,一个吸引人和现代网站在 CL 上,以防你认为它不存在(就像我一样)!
标签: macros lisp common-lisp