Get in the habit of using sharp quote · Endless Parentheses
The sharp quote (or function quote, or simply #'
) is an abbreviation for the function
form. It is essentially a version of quote
(or '
) which enables byte-compilation, but its actual usefulness has changed throughout the years.
A little over two decades ago, it was used to quote lambda
forms. You see, '(lambda (x) (* x x))
was just a raw list to the byte-compiler, but #'(lambda (x) (* x x))
was an actual function that could be compiled. Now-a-days---or rather, now-a-decades---the lambda form sharp-quotes itself, meaning a plain (lambda (x) (* x x))
is identical to the #'
version. In fact, you should never quote your lambdas with either quotes.
On the other hand, just as you'd expect the sharp quote to become redundant for the elisp programmer, a new use arises for it. The compiler throws a warning whenever it notices you've used an undefined function, say (not-defined "oops")
, but it can't do the same for something like (mapcar 'not-defined some-list)
because it doesn't know that symbol is the name of a function. The sharp quote is a way of conveying that information to the compiler, so if it runs into (mapcar #'not-defined some-list)
, it can throw a warning accordingly.
So it is always good practice to sharp quote every symbol that is the name of a function, whether it's going into a mapcar
, an apply
, a funcall
, or anything else. Adhering to this actually unearthed a small bug in one of my packages.
And of course, we can make things more convenient.
(defun endless/sharp () "Insert #' unless in a string or comment." (interactive) (call-interactively #'self-insert-command) (let ((ppss (syntax-ppss))) (unless (or (elt ppss 3) (elt ppss 4) (eq (char-after) ?')) (insert "'")))) (define-key emacs-lisp-mode-map "#" #'endless/sharp)