"# '(Lambda…" ve "(lambda…"? [Duplicate] arasında bir fark var mı?

Dec 14 2020

Gelen Pratik Common Lisp bir örneği var REMOVE-IF-NOTbir lambda'da:

CL-USER> (remove-if-not #'(lambda (x) (evenp x)) '(1 2 3 4 5))
(2 4)

Bu şunlardan farklı mı?

CL-USER> (remove-if-not (lambda (x) (evenp x)) '(1 2 3 4 5))
(2 4)

Bir (lambda..)değer, alıntılanan işlev biçimiyle çakışıyor #'(..)mu? REPL'de öyle görünüyor, ancak Lisp'te yeniyken bir şeyi gözden kaçırabilirim (ve lafı kesinlikle yanlış anladım, bu yüzden lütfen beni de düzeltin).

Yanıtlar

4 tfb Dec 14 2020 at 19:03

Şüphelendiğiniz gibi bu iki şey aynıdır:

  • #'bir okuma makrosudur ve #'xolarak okunur (function x). Bu nedenle #'(lambda (...) ...), CL'deki argümanının bir işlevi gösterdiğini söyleyen özel operatör (function (lambda (...) ...))nerede function;
  • lambdagenişlemesi: bir makro olarak tanımlanır (lambda (...) ...)IS (function (lambda (...) ...): öncekine özdeş bir şekilde.

Bu araçlar #'(lambda (...) ...), (lambda (...) ...)ve (function (lambda (...) ...))tüm CL aynı şeyi ifade eder fonksiyonu ile belirtilen tüm göstermektedirler (lambda (...) ...)geçerli sözcük ortamda.

İnsanların #'(lambda (...) ...)sürümü kullanmaya devam etmesinin iki nedeni vardır :

  • tutarlılık - örneğin bir işlev #'fooise ihtiyacınız var, foobu nedenle onu durum için kullanmak daha tutarlı görünebilir lambda;
  • lambdaŞu anda yaptığı makro tanımına sahip olan her zaman CL'de geçerli değildir, bu nedenle orijinal CL spesifikasyonu ile ANSI standardı arasında yazılan veya o zamanları hatırlayan kişiler tarafından yazılan kod, #'formu kullanabilir .