Eu tenho isso no meu .emacs:
(defalias 'λ 'lambda)
o que funciona bem para coisas simples como (funcall (λ (x) x) 1)
.
Mas quando faço algo como (org-add-link-type "foo" (λ (s) (message s)))
ou (add-to-list 'auto-mode-alist '("foo" . (λ () (message "bar"))))
, não funciona e recebo
org-open-at-point: Função inválida: (λ (s) (mensagem (s))
e
Erro de especificação do modo de arquivo: (função inválida (λ nil (mensagem "barra"))))
respectivamente.
Alguém sabe o que há de errado aqui?
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.lambda
(aλ
):pretty-lambdada.el
.Respostas:
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
Que é equivalente ao formulário
Agora, quando o emacs abre um arquivo com a extensão "foo", ele faz algo como o seguinte
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 lunaryornPortanto,
'(lambda () (message "bar"))
é uma função válida, que pode ser verificada pelo seguinte códigoPortanto, a solução seria simplesmente não citar a expressão, use o seguinte
fonte
Parece que o problema não está no
defalias
, mas onde e como você está ligandoλ
.funcall
usa, como argumentos, uma função e os argumentos dessa função; portanto, seufuncall
exemplo funciona perfeitamente.Ambos
org-add-link-type
eauto-mode-alist
, no entanto, esperam símbolos que contenham as funções relevantes. Portanto, com base nos seus exemplos, o seguinte deve funcionar:Se você está procurando principalmente para ter
λ
aparecer em seu buffer, considerar a experimentarprettify-symbols-mode
, que irá mostrarlambda
comoλ
sem alterar texto th do buffer.fonte
lambda
diretamente.lambda
macro retorna umlambda
formulário especial auto-citado , que o alias não está captando, mas pode haver mais magia negra aqui. Convocar @Malabarba.