Apakah ada perbedaan antara `# '(lambda…` dan `(lambda…`? [Duplikat]
Dec 14 2020
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 Dec 14 2020 at 19:03
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.
Jana Duggar: Semua yang Dia Katakan Tentang Cinta dan Jendela 5 Tahunnya untuk Menemukan 'Yang Satu'