Apakah ada perbedaan antara `# '(lambda…` dan `(lambda…`? [Duplikat]
Dalam Practical Common Lisp ada contoh REMOVE-IF-NOT
dengan lambda:
CL-USER> (remove-if-not #'(lambda (x) (evenp x)) '(1 2 3 4 5))
(2 4)
Apakah ini berbeda dengan:
CL-USER> (remove-if-not (lambda (x) (evenp x)) '(1 2 3 4 5))
(2 4)
Apakah suatu (lambda..)
nilai bertepatan dengan bentuk fungsi kutipan #'(..)
? Di REPL sepertinya begitu, tetapi karena saya baru mengenal Lisp, saya mungkin mengabaikan sesuatu (dan saya pasti salah bicara, jadi tolong koreksi saya juga).
Jawaban
4 tfb
Kedua hal ini, seperti yang Anda duga, sama:
#'
adalah makro baca, dan#'x
dibaca sebagai(function x)
. Jadi#'(lambda (...) ...)
dibaca(function (lambda (...) ...))
, di manafunction
operator khusus di CL yang mengatakan bahwa argumennya menunjukkan sebuah fungsi;lambda
didefinisikan sebagai makro: perluasan dari(lambda (...) ...)
is(function (lambda (...) ...)
: bentuk yang identik dengan yang sebelumnya.
Ini berarti bahwa #'(lambda (...) ...)
, (lambda (...) ...)
dan (function (lambda (...) ...))
semuanya sama di CL: semuanya menunjukkan fungsi yang ditentukan oleh (lambda (...) ...)
dalam lingkungan leksikal saat ini.
Ada dua alasan mengapa orang mungkin masih menggunakan #'(lambda (...) ...)
versi tersebut:
- konsistensi - Anda perlu, misalnya
#'foo
jikafoo
adalah sebuah fungsi, sehingga akan terlihat lebih konsisten untuk menggunakannya juga untuklambda
kasus tersebut; - tidak selalu kasus CL yang
lambda
memiliki definisi makro seperti sekarang, jadi kode yang ditulis antara spesifikasi CL asli dan standar ANSI, atau yang ditulis oleh orang-orang yang mengingat masa-masa itu, boleh menggunakan#'
formulir tersebut.
Selalu Menjadi Ancaman: Mengapa Orang Berkulit Coklat dan Hitam Tidak Bisa Nyaman di Amerika Serikat
Taylor Sheridan Baru Menambahkan 1 Bintang 'Yellowstone' Favoritnya ke Pemeran 'Lawmen: Bass Reeves'