Emacs/Elisp:井号(pound,number sign,octothorp)符号有什么用途?

126

这是什么作用?

(add-hook 'compilation-mode-hook #'my-setup-compile-mode)

...它与...有何不同?

(add-hook 'compilation-mode-hook 'my-setup-compile-mode)
4个回答

122

没有任何区别:

(eq 'my-add #'my-add)

产生 t

# 可以用在 lambda 表达式前面,告诉字节编译器以下表达式可以被字节编译,请参见匿名函数文档。但在符号的情况下没有什么可编译的。

一般来说,它与左尖括号 (<) 一起用于打印表示中,表示所打印的对象是一个描述(但无法读取)。例如:

#<buffer foo.txt>

它还被读者用于表示循环结构。请参阅循环对象读取语法文档。

另外,它用于表示整数的进制,例如#x2c -> 44

当然还有更多应用。


19
根据这篇文章,将#应用于单个符号的一个好处是,如果该符号未定义,则可以在编译时获得诊断信息。 - ajk
3
“在符号的情况下没有任何需要编译的东西”这种说法并不完全正确。字节编译器会解释 #'car 为“我总是引用函数'foo',而不是符号foo”。然后它可能会将foo的定义内联到字节编译的输出中。(编辑:不对,那实际上是错误的。#'symbol与'symbol一样进行字节编译,它只是一个意图的标记。) - Jonathan Klabunde Tomer
18
或许仍需提醒一下,'symbol 代表引用 (quote symbol),而 #'symbol 则代表函数 (function symbol) 的语法结构。 - tripleee

34
应该包含全面列表可以在Emacs lisp参考索引的顶部找到。 编辑: 或者更方便地,在Emacs内部:
  • M-x info RET (打开信息浏览器)

  • d m elisp RET (打开Elisp手册)

  • I # RET(列出索引中#的条目)


32
我在搜索“mode-line-format”时发现了这个问题,想知道其中的哈希值是什么意思。
#("-%-" 0 3
  (help-echo "Display as tooltip when mouse hovers or with display-local-help."))

这是一种用于字符串中的文本属性格式,其中:

  • "-%-",要应用属性的文本:一个破折号和一个%-construct,结果为"足以填充模式行的破折号",即著名的Emacs ------
  • 0,应用文本属性的第一个字符。
  • 3,应用文本属性的最后一个字符,即整个"-%-"
  • (help-echo "..."),一个属性和一个字符串作为其参数。

可以使用propertize函数创建此格式。

(propertize "Hover over me!" 'help-echo '"congratulations!")

(insert (propertize "Hover over me!" 'help-echo '"Congratulations!"))

就像是 #("将鼠标悬停在我上面!" 0 14 (help-echo "恭喜你!")) 一样:

Small example.

如果你正在使用字体锁定模式,使用buffer-substring命令可能会产生类似这样的结果:
(buffer-substring 1 28) ; First 27 characters in the current buffer
 ⇒ #(";; This buffer is for notes"
     0 3
     (fontified t face font-lock-comment-delimiter-face)
     3 27
     (fontified t face font-lock-comment-face))

所以你可以创建类似这样的东西:

Showing the corresponding propertize function for multiple properties.


propertize 的链接似乎已经失效了。请查看这个链接代替:https://www.gnu.org/software/emacs/manual/html_node/elisp/Text-Props-and-Strings.html - Valer

0
如果你想传递一个闭包,那就有所不同。
(setq lexical-binding t)

(defun foo () (message "outer"))
(let ((x 5))
  (cl-flet ((foo () (message "inner: %d" (+ x x))))
    (setq y 'foo)
    (setq z #'foo)))
(funcall y)
(funcall z)

输出
outer
inner: 10

虽然我认为这只是因为cl-flet宏对#',也就是(function ...)有特殊处理。当你展开它时,你会得到:
(let*
    ((--cl-foo--
      (cl-function
       (lambda nil
         (message "inner: %d"
                  (+ x x))))))
  (progn
    (message "%S" #''foo)
    (setq y 'foo)
    (setq z --cl-foo--)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接