Apa saja aplikasi khas dari Lisp macro?

19

Saya mencoba mempelajari beberapa LISP dan saya telah membaca banyak tentang pentingnya makro LISP jadi saya ingin mendapatkan pengalaman kerja dengan mereka.

Bisakah Anda menyarankan area aplikasi praktis yang akan memungkinkan saya untuk menggunakan makro untuk memecahkan masalah dunia nyata, dan untuk memahami kegunaan konstruk pemrograman ini?

CATATAN

Ini bukan generik proyek apa yang harus saya lakukan pertanyaan selanjutnya . Saya tertarik untuk memahami masalah apa yang biasanya diselesaikan dengan makro LISP. Misalnya, apakah mereka baik untuk menerapkan tipe data abstrak? Mengapa konstruk ini ditambahkan ke bahasa? Jenis masalah apa yang dipecahkan yang tidak dapat dipecahkan dengan fungsi sederhana?

Giorgio
sumber

Jawaban:

9

Macro Lisp menggabungkan beberapa properti yang berbeda:

  1. Macro mendefinisikan sintaks baru ↔ mereka menggunakan kode sumber sebagai input
  2. Makro biasanya dijalankan pada waktu kompilasi
  3. Makro menghasilkan kode sumber

Aplikasi terbaik memanfaatkan semua aspek tersebut. Mungkin contoh yang paling terkenal adalah (loop ...) di Common Lisp, itu tidak akan mendekati kegunaannya tanpa salah satu fitur tersebut. Tanpa sumber sebagai input, akan sulit menentukan tindakan di dalam loop; tanpa perluasan waktu kompilasi, itu akan menjadi terlalu lambat; dan tanpa pembuatan kode tidak akan dapat dieksekusi.

Contoh lain yang baik adalah bab serialisasi biner dalam Praktis Common Lisp , Practical: Parsing Binary Files .

Makro kueri yang mengimplementasikan sesuatu yang mirip dengan LINQ mungkin merupakan aplikasi bagus lainnya. Tapi itu akan hilang penyelesaian otomatis yang membuat LINQ sebaik itu. Hampir semua hal yang saat ini diselesaikan oleh generator kode tujuan khusus dengan input XML (mis. XAML) juga dapat diimplementasikan menggunakan macro Lisp.

Patrick
sumber
Saya baru saja membeli buku "Praktis Common Lisp", saya akan melihat contoh yang Anda sarankan.
Giorgio
2

Cara saya suka berpikir tentang macro dalam common lisp adalah mereka adalah fungsi yang mengembalikan kode untuk dievaluasi, tetapi 'tidak' mengevaluasi argumen mereka sebelum mengembalikan kode itu. Fungsi mengembalikan sesuatu juga, tetapi mereka mengevaluasi setiap argumen sebelum tubuh mereka dievaluasi. Makro tidak.

Paul Graham dalam 'On Lisp' memberikan (IMHO) salah satu deskripsi terbaik tentang perbedaan antara makro dan fungsi, dan membahas tumpang tindih dan keunikannya. Banyak bit kode dapat ditulis sebagai fungsi atau makro, tetapi ada kasus di mana hanya makro yang akan berfungsi. Setelah Anda membungkus kepala Anda di sekitar ini, saya pikir Anda sudah mendapatkan inti dari macro di lisp.

Sebagai contoh makro di mana fungsi tidak akan bekerja, periksa 'aif' (anaforis jika). Itu hanya beberapa baris kode, dan rekomendasi saya di mana untuk memulai.

Dan lakukan referensi versi Common Lisp tentang anaforis jika, yang mengambil keuntungan dari penangkapan variabel yang disengaja. Versi skema otomatis-higienis bukan IMO 'real deal'. Pengambilan variabel adalah bagian penting dari makrologi lisp, dan beberapa makro yang lebih kuat dan bermanfaat tentu memanfaatkannya.

Clayton Stanley
sumber