#'
Sadece için kısaltmadır function
gibi, '
için kısaltmadır quote
.
Bayt derleyicisine veya yorumlayıcıya ya da bir insan okuyucusuna, argümanının bir işlev olması (işlev olarak kabul edilir) olduğunu belirtmek istediğiniz herhangi bir yerde kullanabilirsiniz.
Birçok bağlamda, örneğin, ( quote
veya '
) kullanmak yerine basitçe alıntı yaparsanız #'
(veya kullanırsanız) , bağımsız değişkenin nasıl ele alınacağını belirler function
. Örneğin, bir sembolün yalnızca symbol-function
özelliği için kullanıldığı , yani bir işlev olarak kullanıldığı bir bağlamda, yalnızca sembolü iletebilirsiniz (örneğin, alıntı yaparak veya değeri sembol olan bir değişkeni ileterek).
Ancak bazen #'
bu bağlamlarda kullanırsanız kod daha net olur . Emacs-Lisp'in kendisi, sembolün bu bağlamlarda bir işlev olarak kullanıldığını anlasa bile, bunu kodun bir insan okuyucusu için vurgulamak yardımcı olabilir.
Diğer bazı Lisps'lerde, basitçe alıntılanan (ile '
) veya alıntı yapılmayan lambda formlarının muamelesi, function
( #'
) kullanılarak alıntılandığında bir fonksiyon pozisyonundaki kullanımlarından farklı olabilir . Ancak Emacs Lisp. Emacs Lisp'de fonksiyon olarak değerlendirilmesini istediğiniz lambda formunu (ya '
da #'
sadece liste olarak değil) alıntılamanıza gerek yoktur . Sadece bir liste olarak, araba vb.İle işlenmesini istiyorsanız lambda
, alıntı yapın (ile '
) - aşağıdaki örnek bunu göstermektedir.
Anonim İşlevlerden (elisp) :
- Özel Form: function
function-object
Bu özel form FUNCTION-OBJECT
değerlendirilmeden geri döner .
Bu, quote
(* not Alıntı: :) benzer. Ancak, aksine
quote
, FUNCTION-OBJECT
bir işlev olarak kullanılması amaçlanan Emacs değerlendiricisi ve bayt derleyicisine bir not olarak hizmet eder . FUNCTION-OBJECT
Geçerli bir lambda ifadesi olduğunu varsayarsak , bunun iki etkisi vardır:
• Kod bayt-derlendiğinde, FUNCTION-OBJECT
bir bayt-kod fonksiyon nesnesine derlenir (* not Bayt Derleme: :).
• Sözcük bağlaması etkinleştirildiğinde, FUNCTION-OBJECT
bir kapağa dönüştürülür. * Not Kapanışları ::.
Okuma sözdizimi #'
, kullanımın kısa yoludur function
. Aşağıdaki formların hepsi eşdeğerdir:
(lambda (x) (* x x))
(function (lambda (x) (* x x)))
#'(lambda (x) (* x x))
Aşağıdaki örnekte, bir change-property
işlevi üçüncü bağımsız değişkeni olarak alan ve ardından anonim bir işlev ileterek double-property
yararlanan bir işlevi tanımlarız change-property
:
(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))))
lambda
Formu alıntılamadığımızı unutmayın .
Yukarıdaki kodu derlerseniz, anonim işlev de derlenir. Diyelim ki, isimsiz işlevi bir liste halinde vererek yapılandıysanız bu gerçekleşmez:
(defun double-property (symbol prop)
(change-property symbol prop '(lambda (x) (* 2 x))))
Bu durumda, anonim işlev derlenmiş kodda lambda ifadesi olarak tutulur. Bayt-derleyici, bir liste gibi görünse de bu listenin bir işlev olduğunu varsayamaz, çünkü listeyi işlev change-property
olarak kullanmayı amaçladığını bilmez
.