我熟悉Emacs Lisp,但不是Common Lisp(或其他任何)Lisp。一些Lisp程序员建议(例如Emacs的基本函数),在Lisp代码中在函数参数前使用#'
是很好的。例如:
(mapc #'my-fun '(1 2 3))
在Emacs Lisp中,我相信这等同于。(mapc 'my-fun '(1 2 3))
从elisp手册第12.7节中得知。
读取语法
#'
是使用function
的一种简写方式。以下形式都是等价的:
(lambda (x) (* x x))
(function (lambda (x) (* x x)))
#'(lambda (x) (* x x))
并且帮助function
函数
function
是在eval.c
中的一个特殊形式。
(function ARG)
与quote
类似,但更适用于函数对象。在字节编译中,function
使其参数被编译。而quote
则不能实现此功能。
所以这似乎是一个潜在的优化,但也不过如此。此外,来自ML/Haskell背景的人会觉得将函数与任何其他数据区别对待很奇怪。
问题:
你是否认为应该在emacs-lisp
函数参数中使用#'
?(简要说明为什么它们在Common Lisp中需要也很好)
注:
我原以为当省略#'
时会读取不同的单元格(值与函数),但这似乎是错误的,因为function
的文档没有提到获取函数单元格。可以使用symbol-function
来实现。相关问题如下:
- The #' in common lisp
- Writing lambda expressions in common lisp
- Why #' is used before lambda in Common Lisp?
但它们似乎表明在Lambda中至少不需要#'
。
EL
和CL
都是LISP2的一部分。也就是说,它们在函数和变量方面具有不同的命名空间。并非所有的LISPs都是这样的,例如,Scheme
只有一个命名空间,因此根本不需要funcall
。例如:(let ((x (lambda (y) (+ y y)))) (x 5))
- Sylwester