Com alguma ajuda de lunaryorn no reddit , acho que consegui entender por que você está observando o comportamento "estranho".
O problema é que você está citando a expressão
'("foo" . (λ () (message "bar")))
Que é equivalente ao formulário
(cons "foo" '(λ () (message "bar")))
Agora, quando o emacs abre um arquivo com a extensão "foo", ele faz algo como o seguinte
(funcall '(λ () (message "bar")))
Observe a cotação extra, antes (λ
, isso obviamente não é uma função válida e você obtém o erro. Invalid function: ...
Mas por que ("foo" . (lambda () (message "bar")))
funciona, isso é explicado pela observação de lunaryorn
Uma “lista lambda”, ou seja, uma lista cujo carro é lambda, também é uma função válida
Portanto, '(lambda () (message "bar"))
é uma função válida, que pode ser verificada pelo seguinte código
(functionp (lambda () "hello")) => t
(functionp (λ () "hello")) => t
(functionp '(lambda () "hello")) => t
(functionp '(λ () "hello")) => nil
Portanto, a solução seria simplesmente não citar a expressão, use o seguinte
(add-to-list 'auto-mode-alist (cons "foo" (λ () (bar))))
defalias
, mas você pode querer verificar para foraprettify-symbols-mode
, o que, entre outras coisas, permitirá que você exibirlambda
comoλ
sem realmente mudar o texto subjacente.