ChatGPT解决这个技术问题 Extra ChatGPT

emacs/elisp: What is the hash (pound, number sign, octothorp) symbol used for?

What does this do?

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

...and is it different than

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

M
Mirzhan Irkegulov

There is no difference:

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

yields t

The # can be used in front of a lambda expression indicating to the byte-compiler that the following expression can be byte compiled, see the docs for Anonymous Functions. But there's nothing to compile in the case of a symbol.

In general, it is used in the printed representation along with the left angle bracket (<) to indicate that the object printed is a description (but cannot be read). For example:

#<buffer foo.txt>

It is also used in constructs by the reader to represent circular structures. See the docs for Read Syntax for Circular Objects.

And then you have its use for denoting the base for integers, e.g. #x2c -> 44.

Plus more I'm sure.


According to this article, one good reason for applying # to a lone symbol is to get diagnostics at compile time if that symbol is undefined.
It's not quite true that "there's nothing to compile in the case of a symbol." The byte compiler interprets #'car to mean "I am always referring to the function `foo', not the symbol foo." It may then actually inline the definition of foo in the byte-compiled output. (Edit: nope, that's actually wrong. #'symbol will not be byte-compiled any differently than 'symbol -- it's just a marker of intent.)
Perhaps still mention that 'symbol represents (quote symbol) and #'symbol represents (function symbol) syntactically.
i
itsjeyd

The should-be-comprehensive list can be found at the top of the Emacs lisp reference index.

Edit: Or even more conveniently, from within Emacs itself:

M-x info RET (open the info browser)

d m elisp RET (open the elisp manual)

I # RET (list the entries for # in the index)


I
Iceland_jack

I found this question while searching for what the hash meant in something I found while hacking mode-line-format:

#("-%-" 0 3
  (help-echo "Display as tooltip when mouse hovers or with display-local-help."))

which is a format used for text properties in strings where:

"-%-", text to be propertized: one dash and a %-construct that results in "dashes sufficient to fill the remainder of the mode line", resulting in the famous Emacs ------.

0, the first character upon which the text properties apply.

3, the last character upon which the text properties apply, i.e. the entire "-%-".

(help-echo "..."), a property and a string as its argument.

This can be created with the propertize function:

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

https://i.stack.imgur.com/iSamm.png

would be the same as #("Hover over me!" 0 14 (help-echo "Congratulations!")):

https://i.stack.imgur.com/lRxSn.png

If you're using font lock mode, using the buffer-substring command might produce something like this:

(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))

So you could create something like:

https://i.stack.imgur.com/Z69ld.png


关注公众号,不定期副业成功案例分享
Follow WeChat

Success story sharing

Want to stay one step ahead of the latest teleworks?

Subscribe Now