T: Kapan, jika pernah, berguna untuk mengutip dengan tajam lambda
, dan kapan, haruskah kita tidak mengutip dengan tajam lambda
?
Orang menggunakan lambda
s dalam tiga cara:
- polos:
(lambda (x) x)
- dikutip:
'(lambda (x) x)
- dikutip tajam:
#'(lambda (x) x)
Utas SO ini membahas tiga jenis, utas SO ini menjelaskan mengapa tidak mengutip (NB: bukan kutipan tajam ) lambda
, dan utas SO ini juga membahas perbedaan antara kutipan dan kutipan tajam.
Sekarang, simpul manual pada fungsi anonim dan dokumentasi untuk lambda
catatan bahwa lambda
s adalah kutipan sendiri:
Panggilan formulir
(lambda ARGS DOCSTRING INTERACTIVE BODY)
mengutip diri sendiri; hasil mengevaluasi ekspresi lambda adalah ekspresi itu sendiri. Ekspresi lambda kemudian dapat diperlakukan sebagai fungsi ...
Jadi, tampaknya itu (lambda (x) x)
dan #'(lambda (x) x)
setara, tetapi '(lambda (x) x)
tidak (yang paling penting, ketika byte-compiling).
Sepertinya satu jarang ingin mengutip sebuah lambda
, tetapi tidak jelas bagi saya ketika, jika pernah, kita harus, atau tidak harus, tajam-quote:
- Apakah mengutip dengan tajam
lambda
hanyalah pilihan gaya, atau adakah situasi di mana kutipan tajam itu bermanfaat? - Apakah ada keadaan di mana kita tidak boleh mengutip dengan tajam a
lambda
, yaitu, ketika melakukan itu akan mengubah makna kode?
lambda
telah didefinisikan sebagai makro yang menambahkanfunction
sebanyak mungkin kembali. TKI jika#'
diperlukan di beberapa titik, itu dalam kode pengembangan yang sangat awal. Itu pasti tidak diperlukan sudah di Emacs-18.Karena
lambda
tidak masuk akal ketika tidak dikutip, versi terbaru dari Emacs Lisp mengikuti (ANSI) Common Lisp dalam menafsirkan tanda kutip(lambda...)
sebagai#'(lambda...)
. Kedua notasi tersebut hampir persis sama (kecuali dalam struktur yang dikutip).Apakah lebih suka
(lambda...)
atau#'(lambda...)
karena itu murni masalah gaya. Beberapa orang lebih suka bentuk telanjang, yang menghindari kebisingan sintaksis, sementara yang lain (termasuk saya) lebih suka bentuk yang dikutip.sumber
Menambahkan sedikit sejarah tambahan, karena melihat warisan sejarah Is # '(lambda ...)?
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=4290 menyarankan bahwa:
Saya tidak tahu tentang byte-compiler, tapi saya bisa melihat bahwa setidaknya pada tahun 1993
lambda
makro itu sendiri mengembalikan(function (lambda ...))
formulir.https://www.iro.umontreal.ca/~monnier/hopl-4-emacs-lisp.pdf juga mengatakan:
sumber
Hanya ingin memberikan contoh praktis menggunakan ekspresi lambda backtic. Ini tentang lexical-binding / variable shadowing, menggunakan ekspresi lambda backtic dan referensi variabel dengan koma memungkinkan untuk mendapatkan nilai global mereka.
M-x [RET] eval-buffer
keluaran "Acak lama"M-x [RET] eval-buffer
output "Acak"Contoh ketiga menggabungkan variabel global dan variabel lokal
M-x [RET] eval-buffer
output "Acak" "Acak lama"sumber