Ich habe dies in meinen .emacs:
(defalias 'λ 'lambda)
das funktioniert gut für einfache Dinge wie (funcall (λ (x) x) 1)
.
Aber wenn ich so etwas wie (org-add-link-type "foo" (λ (s) (message s)))
oder (add-to-list 'auto-mode-alist '("foo" . (λ () (message "bar"))))
mache, funktioniert es nicht und ich bekomme
org-open-at-point: Ungültige Funktion: (λ (s) (Nachricht s))
und
Dateimodus-Spezifikationsfehler: (ungültige Funktion (λ nil (Meldung "bar")))
beziehungsweise.
Weiß jemand, was hier los ist?
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.lambda
(zuλ
) verschönert :pretty-lambdada.el
.Antworten:
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
Welches ist gleichbedeutend mit der Form
Wenn emacs jetzt eine Datei mit der Erweiterung "foo" öffnet, geschieht Folgendes
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ärtIst dies
'(lambda () (message "bar"))
also eine gültige Funktion, kann dies durch den folgenden Code überprüft werdenDie Lösung wäre also, den Ausdruck einfach nicht zu zitieren und stattdessen Folgendes zu verwenden
quelle
Es sieht so aus, als ob das Problem nicht beim liegt
defalias
, sondern wo und wie Sie anrufenλ
.funcall
Nimmt als Argumente eine Funktion und die Argumente dieser Funktion, sodass Ihrfuncall
Beispiel einwandfrei funktioniert.Beide
org-add-link-type
und dieauto-mode-alist
erwarten jedoch Symbole, die die relevanten Funktionen enthalten. Ausgehend von Ihren Beispielen sollte daher Folgendes funktionieren:Wenn Sie hauptsächlich
λ
in Ihrem Pufferprettify-symbols-mode
angezeigt werden möchten, sollten Sie es ausprobieren. Dies wird angezeigtlambda
,λ
ohne den Text des Puffers zu ändern.quelle
lambda
direkt benutze .lambda
Makro eine selbst zitiertelambda
Sonderform zurückgibt, die der Alias nicht aufnimmt, aber hier könnte es mehr schwarze Magie geben. Beschwöre @Malabarba.