Які типові програми макросів Lisp?


19

Я намагаюся вивчити деякі LISP, і я багато читав про важливість макросів LISP, тому хотів би отримати трохи досвіду роботи з ними.

Чи можете ви запропонувати практичну область застосування, яка дозволила б мені використовувати макроси для вирішення реальної проблеми та зрозуміти корисність цієї програми програмування?

ПРИМІТКА

Це не загальне, який проект я повинен робити наступним питанням. Мені цікаво зрозуміти, які типи проблем зазвичай вирішуються за допомогою макросів LISP. Наприклад, чи вони гарні для впровадження абстрактних типів даних? Чому ця конструкція була додана до мови? Які проблеми вирішує, які неможливо вирішити за допомогою простих функцій?


Відповіді:


9

Макроси Lisp поєднують у собі декілька відмінних властивостей:

  1. Макроси визначають новий синтаксис ↔ вони використовують вихідний код як вхідний
  2. Макроси зазвичай запускаються під час компіляції
  3. Макроси генерують вихідний код

Найкращі програми використовують усі ці аспекти. Напевно, найвідоміший приклад - це (цикл…) у Common Lisp, без жодної з цих особливостей він ніде не був би близький до його корисності. Без джерела як вхідного даних було б незручно визначати дії всередині циклу; без розширення часу компіляції це було б занадто повільно; і без генерації коду це було б не виконуваним.

Ще один прекрасний приклад - розділ бінарної серіалізації в « Практичні загальні файли Lisp , Practical: Розбір бінарних файлів» .

Макрос запиту, який реалізує щось подібне до LINQ, може бути ще одним хорошим додатком. Але не було б пропущено автоматичне завершення, яке робить LINQ таким же приємним, як він є. Практично все, що сьогодні вирішується генераторами коду спеціального призначення з XML-входами (наприклад, XAML), також може бути реалізовано за допомогою макросів Lisp.


Щойно я купив книгу "Практичний звичайний лісп", я перегляну приклад, який ти запропонував.
Джорджіо

2

Те, як мені подобається думати про макроси у звичайному lisp, - це те, що вони є функціями, які повертають код для оцінки, але "не" оцінюють свої аргументи перед поверненням цього коду. Функції повертають щось теж, але вони оцінюють кожен аргумент ще до того, як оцінюється їхнє тіло. Макроси ні.

Пол Ґрехем у «On Lisp» надає (IMHO) один з найкращих описів відмінностей між макросами та функціями, а також обговорює їх накладення та унікальність. Багато біт коду можна записати як функцію або макрос, але є випадки, коли буде працювати лише макрос. Після того, як ти обернеш голову навколо цього, я думаю, що ти мастину макросів перекинувся.

Як приклад макросу, де функція не працюватиме, перегляньте "aif" (анафорично, якщо). Це лише кілька рядків коду, і моя рекомендація з того, з чого почати.

І посилайтеся на анафоричну версію Common Lisp, якщо це використовує навмисне уловлювання змінної. Автогігієнічна версія схеми - це не справжня угода IMO. Змінне захоплення є важливою частиною макрології lisp, і деякі більш потужні та корисні макроси, безумовно, користуються нею.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.