Saya punya ini di .emacs saya:
(defalias 'λ 'lambda)
yang berfungsi dengan baik untuk hal-hal sederhana seperti (funcall (λ (x) x) 1)
.
Tetapi ketika saya melakukan sesuatu seperti (org-add-link-type "foo" (λ (s) (message s)))
atau (add-to-list 'auto-mode-alist '("foo" . (λ () (message "bar"))))
, itu tidak berhasil dan saya mendapatkannya
org-open-at-point: Fungsi tidak valid: (λ (s) (pesan s))
dan
Kesalahan spesifikasi mode file: (fungsi tidak valid (λ nil (pesan "bilah")))
masing-masing.
Adakah yang tahu apa yang salah di sini?
defalias
, tetapi Anda mungkin ingin memeriksaprettify-symbols-mode
, yang, antara lain, akan memungkinkan Anda untuk menampilkanlambda
sebagaiλ
tanpa benar-benar mengubah teks yang mendasarinya.lambda
(untukλ
):pretty-lambdada.el
.Jawaban:
Dengan bantuan dari lunaryorn pada reddit , saya kira saya telah dapat memahami mengapa Anda mengamati perilaku "aneh".
Masalahnya adalah Anda mengutip ungkapan tersebut
Yang setara dengan formulir
Sekarang ketika emacs membuka file dengan ekstensi "foo", ia melakukan sesuatu seperti berikut ini
Perhatikan kutipan tambahan, sebelumnya
(λ
, ini jelas bukan fungsi yang valid dan Anda mendapatkan kesalahanInvalid function: ...
Tapi mengapa("foo" . (lambda () (message "bar")))
berhasil, ini dijelaskan oleh pengamatan lunaryornBegitu
'(lambda () (message "bar"))
juga fungsi yang valid, ini bisa diverifikasi dengan kode berikutJadi solusinya adalah dengan tidak mengutip ekspresi gunakan yang berikut ini sebagai gantinya
sumber
Sepertinya masalahnya bukan pada
defalias
, melainkan di mana dan bagaimana Anda meneleponλ
.funcall
mengambil, sebagai argumennya, fungsi dan argumen fungsi itu, jadifuncall
contoh Anda berfungsi dengan baik.Baik
org-add-link-type
danauto-mode-alist
, bagaimanapun, mengharapkan simbol yang berisi fungsi yang relevan. Karena itu, membangun contoh Anda, berikut ini harus bekerja:Jika Anda kebanyakan ingin memiliki
λ
muncul dalam buffer Anda, pertimbangkan mencobaprettify-symbols-mode
, yang akan menampilkanlambda
sebagaiλ
tanpa mengubah teks th buffer.sumber
lambda
secara langsung.lambda
makro mengembalikanlambda
bentuk khusus yang dikutip sendiri yang alias tidak diambil, tetapi mungkin ada lebih banyak ilmu hitam di sini. Panggil @Malabarba.