#'
hanya singkatan untuk function
, sama seperti '
singkatan untuk quote
.
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 #'
(atau function
). Misalnya, dalam konteks di mana simbol hanya digunakan untuk symbol-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 menggunakan function
( #'
). 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 mobil lambda
dll, maka kutiplah (dengan '
) - contoh di bawah ini menggambarkan hal ini.
Dari (elisp) Fungsi Anonim :
- Formulir Khusus: function
function-object
Formulir khusus ini kembali FUNCTION-OBJECT
tanpa mengevaluasinya.
Dalam hal ini, mirip dengan quote
(* note Quoting: :). Tetapi tidak seperti
quote
itu, ia juga berfungsi sebagai catatan untuk evaluator Emacs dan byte-compiler yang FUNCTION-OBJECT
dimaksudkan untuk digunakan sebagai fungsi. Dengan asumsi FUNCTION-OBJECT
adalah ekspresi lambda yang valid, ini memiliki dua efek:
• Ketika kode dikompilasi dengan byte, FUNCTION-OBJECT
dikompilasi menjadi objek fungsi kode-byte (* note Kompilasi Byte: :).
• Ketika pengikatan leksikal diaktifkan, FUNCTION-OBJECT
diubah menjadi penutupan. * Catatan Penutupan ::.
Sintaks baca #'
adalah kependekan dari penggunaan function
. Formulir berikut semuanya setara:
(lambda (x) (* x x))
(function (lambda (x) (* x x)))
#'(lambda (x) (* x x))
Dalam contoh berikut, kami mendefinisikan change-property
fungsi yang menggunakan fungsi sebagai argumen ketiga, diikuti oleh double-property
fungsi yang memanfaatkannya change-property
dengan meneruskannya fungsi anonim:
(defun change-property (symbol prop function)
(let ((value (get symbol prop)))
(put symbol prop (funcall function value))))
(defun double-property (symbol prop)
(change-property symbol prop (lambda (x) (* 2 x))))
Perhatikan bahwa kami tidak mengutip lambda
formulir.
Jika Anda mengkompilasi kode di atas, fungsi anonim juga dikompilasi. Ini tidak akan terjadi jika, katakanlah, Anda telah membangun fungsi anonim dengan mengutipnya sebagai daftar:
(defun double-property (symbol prop)
(change-property symbol prop '(lambda (x) (* 2 x))))
Dalam hal itu, fungsi anonim disimpan sebagai ekspresi lambda dalam kode yang dikompilasi. Byte-compiler tidak dapat menganggap daftar ini sebagai suatu fungsi, walaupun ia terlihat seperti satu, karena ia tidak tahu yang
change-property
bermaksud menggunakannya sebagai suatu fungsi.