我想知道为什么我看到的大多数Common Lisp代码都有类似的东西
(mapcar #'(lambda (x) (* x x)) '(1 2 3))
而不仅仅是
(mapcar (lambda (x) (* x x)) '(1 2 3)),
这似乎也有效.我开始学习Common Lisp,并且在Scheme中有一些背景,这引起了我的兴趣.
编辑:我知道您需要带有函数名称的#',因为它们与变量位于不同的命名空间中.我的问题只是在lambda之前的#',因为lambda已经返回一个函数对象(我认为).#' - 由于宏扩展而减少lambdas的工作只会让它变得更有趣......
基本上,我什么时候应该使用Emacs Lisp的function程序?我还没有发现其中有行为上的差异,如果你函数作为参数传递的任何实例'like-this或#'like-this.事实上,如果我评估(eq 'goto-char #'goto-char)它返回t.
我遇到的Emacs Lisp代码很少使用function/ #'; 作者只是quote/ '一切.
例:(add-hook 'emacs-lisp-hook 'turn-on-eldoc-mode)
但是,我可以找到一些反例.这是Emacs 24.3源代码中的一个electric.el:
(add-hook 'post-self-insert-hook
#'electric-indent-post-self-insert-function
'append)
Run Code Online (Sandbox Code Playgroud)
(do-something '(lambda … (do-something (lambda …'和#',只要我使用一个版本的Emacs超过最近X?我目前正在阅读Paul Graham的ANSI Common Lisp,我有一个关于编写lambda表达式的问题.
我们需要在lambda表达式前加上#'?如果我在REPL中写这样的东西,它会正常工作
> ((lambda (x) (+ x 1)) 1)
2
Run Code Online (Sandbox Code Playgroud)
这样也会
> (mapcar (lambda (x) (+ x x)) '(1 2 3 4))
(2 4 6 8)
Run Code Online (Sandbox Code Playgroud)
我明白这#'表示一个功能.所以我的问题是,它是某种惯例还是推荐的做法?如果我不为lambdas添加前缀#',可能出现任何问题,是否依赖于实现?
在Practical Common Lisp一书的第3章中,有一个类似SQL的选择和函数的例子.这是它的简化版本:
(defun where (x)
#'(lambda (item)
(> item x)))
Run Code Online (Sandbox Code Playgroud)
它像这样使用:
(remove-if-not (where 2) (list 1 2 3 4))
Run Code Online (Sandbox Code Playgroud)
在本书的前面部分解释说,#'序列用于表示它后跟一个函数名,而不是一个需要评估的变量.我不明白为什么这里需要它.我尝试在where没有它的情况下实现该功能,它也可以工作:
(defun where (x)
(lambda (item)
(> item x)))
Run Code Online (Sandbox Code Playgroud)
我试着谷歌搜索它,并且,正如你可以想象的那样,通过这样一系列的角色,它不是一个非常有成效的搜索.我不知道这件事的名字.在上面的代码中是否有任何特殊原因需要它?
我之前从未编写过emacs函数,并且想知道是否有人可以帮助我开始.我希望有一个函数,它将突出显示的区域解析它(通过","),然后用已经内置到emacs中的另一个函数计算每个块.
突出显示的代码可能是这个样子:x <- function(w=NULL,y=1,z=20){}(R代码),我想刮出来w=NULL,y=1和z=20然后通过每一个功能已经包含emacs的.有关如何入门的任何建议?