Mit etwas Hilfe von lunaryorn auf reddit konnte ich wohl verstehen, warum Sie das "seltsame" Verhalten beobachten.
Das Problem ist, dass Sie den Ausdruck zitieren
'("foo" . (λ () (message "bar")))
Welches ist gleichbedeutend mit der Form
(cons "foo" '(λ () (message "bar")))
Wenn emacs jetzt eine Datei mit der Erweiterung "foo" öffnet, geschieht Folgendes
(funcall '(λ () (message "bar")))
Beachten Sie das zusätzliche Zitat, bevor (λ
dies offensichtlich keine gültige Funktion ist und Sie den Fehler erhalten. Invalid function: ...
Aber warum funktioniert das ("foo" . (lambda () (message "bar")))
? Dies wird durch die Beobachtung von lunaryorn erklärt
Eine „Lambda-Liste“, dh eine Liste, deren Auto Lambda ist, ist ebenfalls eine gültige Funktion
Ist dies '(lambda () (message "bar"))
also eine gültige Funktion, kann dies durch den folgenden Code überprüft werden
(functionp (lambda () "hello")) => t
(functionp (λ () "hello")) => t
(functionp '(lambda () "hello")) => t
(functionp '(λ () "hello")) => nil
Die Lösung wäre also, den Ausdruck einfach nicht zu zitieren und stattdessen Folgendes zu verwenden
(add-to-list 'auto-mode-alist (cons "foo" (λ () (bar))))
defalias
, aber Sie möchten vielleicht auschecken, was Ihnenprettify-symbols-mode
unter anderem ermöglicht, anzuzeigenlambda
,λ
ohne den zugrunde liegenden Text tatsächlich zu ändern.