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 mana functionoperator 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 #'foojika fooadalah sebuah fungsi, sehingga akan terlihat lebih konsisten untuk menggunakannya juga untuk lambdakasus 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.