Saya melihat kutipan tajam digunakan dalam kode eLisp orang lain, dan saya menggunakannya sendiri, tetapi saya tidak sepenuhnya jelas kapan mereka sesuai dan kapan tidak.
Adakah yang bisa mengklarifikasi kapan tepatnya tepat menggunakan kutipan tajam dan kapan kutipan tunggal biasa digunakan?
#'
lambda (di mana jawabannya pada dasarnya "tidak pernah"), sedangkan pertanyaan @ izkon berlaku bukan pada penggunaan#'
simbol yang diterapkan.Jawaban:
#'
hanya singkatan untukfunction
, sama seperti'
singkatan untukquote
.Anda dapat menggunakannya di mana saja di mana Anda ingin menunjukkan ke byte-compiler atau interpreter atau pembaca manusia bahwa argumennya diharapkan (diperlakukan sebagai) fungsi.
Dalam banyak konteks, konteks menentukan bagaimana argumen diperlakukan jika, misalnya, Anda cukup mengutipnya (menggunakan
quote
atau'
) alih-alih menggunakan#'
(ataufunction
). Misalnya, dalam konteks di mana simbol hanya digunakan untuksymbol-function
propertinya, yaitu, ia digunakan sebagai fungsi, Anda bisa meneruskan simbol (misalnya dengan mengutip atau melewati variabel yang nilainya adalah simbol).Namun terkadang kode lebih jelas jika Anda menggunakannya
#'
dalam konteks seperti itu. Bahkan jika Emacs-Lisp sendiri memahami bahwa simbol digunakan sebagai fungsi dalam konteks seperti itu, mungkin membantu untuk menekankan ini untuk pembaca kode manusia.Dalam beberapa Lisps lain, perlakuan bentuk lambda yang hanya dikutip (dengan
'
) atau tidak dikutip dapat berbeda dari penggunaannya dalam posisi fungsi ketika dikutip menggunakanfunction
(#'
). Tetapi tidak di Emacs Lisp. Di Emacs Lisp Anda tidak perlu mengutip (menggunakan salah satu'
atau#'
) formulir lambda yang ingin Anda perlakukan sebagai fungsi (dan bukan hanya sebagai daftar). Jika Anda ingin itu ditangani hanya sebagai daftar, dengan mobillambda
dll, maka kutiplah (dengan'
) - contoh di bawah ini menggambarkan hal ini.Dari (elisp) Fungsi Anonim :
sumber
#'
(aliasfunction
) dapat digunakan di depan(lambda ...)
tetapi itu berlebihan di sana, jadi satu-satunya tempat di mana itu benar-benar bermakna adalah di depan simbol, seperti di#'car
. Dalam ELisp,#'car
dan'car
hampir sepenuhnya sama, jadi salah satu tujuan utamanya adalah untuk mendokumentasikan niat (yaitu untuk menunjukkan kepada siapa pun yang membaca kode ini bahwa Anda bermaksud menggunakan simbol ini sebagai fungsi). Namun ada beberapa keadaan, di mana perbedaannya lebih signifikan:#'car
akan memeriksa apakahcar
ada sebagai fungsi, dan jika tidak menemukannya, ia akan memancarkan peringatan, seperti halnya jika Anda memiliki panggilan ke fungsi tersebut .Di dalam
cl-flet
dancl-labels
, hanya#'f
bisa merujuk ke fungsi yang ditentukan secara lokalf
, karena'f
masih akan merujuk ke simbol globalf
(dan fungsi mana saja yang mungkin disimpan dalamsymbol-function
slotnya). Misalnyasumber