这是做什么的?
(add-hook 'compilation-mode-hook #'my-setup-compile-mode)
Run Code Online (Sandbox Code Playgroud)
......和它有什么不同
(add-hook 'compilation-mode-hook 'my-setup-compile-mode)
Run Code Online (Sandbox Code Playgroud) 我熟悉Emacs Lisp,但不熟悉Common(或任何其他)Lisp.一些Lisp程序员建议(例如,emacs的一个基本函数),它可以#'在Lisp代码中的函数参数前使用.例如:
(mapc #'my-fun '(1 2 3))
Run Code Online (Sandbox Code Playgroud)
在Emacs Lisp中,我相信这相当于
(mapc 'my-fun '(1 2 3))
Run Code Online (Sandbox Code Playgroud)
从elisp手册,第12.7节.
读取语法
#'是使用的简写function.以下表格都是等效的:Run Code Online (Sandbox Code Playgroud)(lambda (x) (* x x)) (function (lambda (x) (* x x))) #'(lambda (x) (* x x))
和帮助 function
功能是一种特殊的形式
eval.c.Run Code Online (Sandbox Code Playgroud)(function ARG)喜欢
quote,但对于作为功能的对象更喜欢.在字节编译中,function导致其参数被编译.quote不能那样做.
所以这似乎是一个潜在的优化,但不再是.此外,来自ML/Haskell背景,以不同于任何其他数据的方式处理函数似乎很奇怪.
你是否同意#'应该在emacs-lisp函数参数中使用?(简要说明Common Lisp中为什么需要它们也会很棒.)
我认为当#'省略(值与函数)时它可能会读取不同的单元格.但这似乎是错误的,因为文档function没有说明抓住功能单元格.这是通过使用来实现的symbol-function.
相关问题是
但他们似乎认为这#'是不必要的,至少在lambdas中是这样.
我目前正在阅读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"一书中学习Lisp.有一次,我应该输入以下代码:
[1] (remove-if-not #'evenp '(1 2 3 4 5 6 7 8 9 10))
(2 4 6 8 10)
Run Code Online (Sandbox Code Playgroud)
我想这里的想法当然是remove-if-not想要一个在向它提供参数时可以返回T或NIL的函数,然后将该函数应用于列表中的所有符号,返回仅包含列表的列表那些返回NIL的符号.
但是,如果我现在在CLISP中编写以下代码:
[2] (remove-if-not 'evenp '(1 2 3 4 5 6 7 8 9 10)
(2 4 6 8 10)
Run Code Online (Sandbox Code Playgroud)
它仍然有效!所以我的问题是,是否使用尖引号表示法,或仅仅使用引用是否足够?现在看起来额外的锐利只是让程序员知道"嘿,这是一个功能,而不仅仅是一些随机的符号!" - 但如果它有任何其他用途,我很想知道它.
我使用的是GNU CLISP 2.49(2010-07-07,sheesh,实际上很老).
如何在列表中的每个元素上执行功能?例如说我有一个清单:
(1 x q)
Run Code Online (Sandbox Code Playgroud)
我是使用my-function上1,x,q。有预定义的功能吗?类似于foreach“高级”语言?还是我必须使用car和手动完成它cdr?
任何帮助将非常感激!