宏对于调试非常有用。但是,当在任何宏上使用时,它就会停止。就像我试着做以下几件事:
CL-USER> (trace push)
然后,它会错误地说:
can't use encapsulation to trace anonymous function #<FUNCTION (MACRO-FUNCTION
PUSH) {100053FB9B}>
[Condition of type SIMPLE-ERROR]
这很明显,因为的clhs页
我已经查看了Lisp、实用的Common和SO档案,以便自己回答这个问题,但是这些尝试都因为我无法给出我感兴趣的概念命名而受挫。如果有人能告诉我这类事情的规范术语,我将不胜感激。
这个问题最好用一个例子来解释。假设我想在通用Lisp中实现Python风格的列表理解。在Python中,我会写:
[x*2 for x in range(1,10) if x > 3]
所以我首先写下来:
(listc (* 2 x) x (range 1 10) (> x 3))
然后定义一个宏,将上述内容转换为正确的理解。到目前一切尚好。
然而,对于不熟悉Python列表理解的读者来说,对该表达式的解
在SBCL中,我可以获得函数的文档字符串,如下所示:
(documentation #'mapcar t)
但是,我不明白如何获得宏的文档字符串。例如,给定宏:
(defmacro with-lines-in-file ((line filename) &body body)
"Runs body for each line in the file specified by filename."
(let ((file (gensym)))
`(with-open-file (,file ,filename)
(do ((,line
我对宏和函数之间的区别感到困惑;特别是在第一部分成功的情况下,为什么第二部分会失败。
(defun foo () "foo")
(setf a 3) ;; sets the symbol value cell to 3
(setf a #'foo) ;; PART ONE
(funcall a) ;; returns foo
(defmacro bar () "bar")
(setf b #'bar) ;; Error the macro name bar was found as an argument to function PART TW
我看到一些像邪恶改变或邪恶删除这样的功能是在邪恶视觉状态下的视觉区域的开始和结束中采取的。我看过这些函数的“source commands.el”中的源代码,但它们的'beg‘和'end’参数似乎无处可寻。还有一些(比如下面的)甚至不是交互式的。
为什么这样做,以及我如何用自己的方法做同样的事情?
下面只是我看过的一种方法的一个例子:
;; Defined in ~/.emacs.d/elpa/evil-20170712.2350/evil-commands.el
(evil-define-operator evil-invert-char (beg end type)
&