Apakah ada perbedaan antara `# '(lambda…` dan `(lambda…`? [Duplikat]
Dec 14 2020
Dalam Practical Common Lisp ada contoh REMOVE-IF-NOTdengan 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#'xdibaca sebagai(function x). Jadi#'(lambda (...) ...)dibaca(function (lambda (...) ...)), di manafunctionoperator khusus di CL yang mengatakan bahwa argumennya menunjukkan sebuah fungsi;lambdadidefinisikan 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
#'foojikafooadalah sebuah fungsi, sehingga akan terlihat lebih konsisten untuk menggunakannya juga untuklambdakasus tersebut; - tidak selalu kasus CL yang
lambdamemiliki 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.
Kiat Pemilik Anjing yang Bermanfaat: Mengapa Penting untuk Membiarkan Anjing Anda Mengendus di Jalan
Jana Duggar: Semua yang Dia Katakan Tentang Cinta dan Jendela 5 Tahunnya untuk Menemukan 'Yang Satu'