Con algo de ayuda de lunaryorn en reddit , creo que he podido entender por qué estás observando el comportamiento "extraño".
El problema es que estás citando la expresión
'("foo" . (λ () (message "bar")))
Que es equivalente a la forma
(cons "foo" '(λ () (message "bar")))
Ahora, cuando emacs abre un archivo con la extensión "foo", hace algo como lo siguiente
(funcall '(λ () (message "bar")))
Observe la cita adicional, antes (λ
, obviamente esta función no es válida y obtiene el error Invalid function: ...
Pero entonces, ¿por qué ("foo" . (lambda () (message "bar")))
funciona? Esto se explica por la observación de lunaryorn
Una "lista lambda", es decir, una lista cuyo automóvil es lambda, también es una función válida
Por '(lambda () (message "bar"))
lo tanto, es una función válida, esto se puede verificar con el siguiente código
(functionp (lambda () "hello")) => t
(functionp (λ () "hello")) => t
(functionp '(lambda () "hello")) => t
(functionp '(λ () "hello")) => nil
Entonces, la solución sería simplemente no citar la expresión, use lo siguiente
(add-to-list 'auto-mode-alist (cons "foo" (λ () (bar))))
defalias
, pero es posible que desee consultarprettify-symbols-mode
, que, entre otras cosas, le permitirá mostrarlambda
comoλ
sin cambiar realmente el texto subyacente.