Моє сучасне розуміння полягає в тому, що макроси можуть реалізувати будь-яку уявну концепцію, включаючи монад, тому що вони "мають компілятор в руках". Це правда? Наприклад, я натрапив на це посилання
Будь ласка, дайте мені факти та приклади, не пристрасні відповіді. Дякую.
Відповіді:
7 для відповіді № 1Це своєрідне непарне порівняння. Це трохи схоже на запитання: "що може зробити автомобіль з бензиновим двигуном, який не може зробити дизельні генератори?" Ну, добре, ці люди не є такими самими класами ...
Lisp макроси [я майже нічого не знаю]дозволить вам виконувати мета-програмування часу компіляції. Ви можете використовувати це для досягнення різного роду корисних речей, від виключення трохи кодувального коду до практично визначення всієї нової мови програмування.
Хасакельські монади - це корисний спосіб структуруватипевні види обчислень. Вони дозволяють легко робити певні речі, які в іншому випадку трохи нудний. (Наприклад, перевірка результату кожної функції, щоб переконатися, що вона була успішною, перш ніж виконувати наступну функцію.) Все це є час виконання річ, хоча; це не має нічого спільного з генерацією коду компіляції часу.
3 для відповіді № 2
Якщо ви можете застосувати щось з Lisp, ви можете покращити його синтаксис за допомогою макросу. Таким чином, макро-частина полягає лише в тому, щоб зробити її краще виглядати або зменшити розмір коду.
Вам не потрібні макроси для здійснення монад. Марин Хавербек зробив реалізація монади використовуючи defstruct
і defgeneic
.
Звичайно defstruct
і defgeneric
може використовувати макроси, щоб реалізувати його магію, алеце не дійсно потрібно для реалізації монадів.Ви можете здійснити монад з закриттями.У коді нижче його використовується як рудиментарний О.О з інкапсуляцією та проходження повідомлення.
(defun maybe (val)
(lambda (msg &optional f m)
(case msg
((bind) (if val (funcall f val) m))
(otherwise val))))
(defun bind (m f)
(funcall m "bind f m)) ;message passing
(defun value (m)
(funcall m "value)) ; message passig
Макроси - це функції, які працюють під синтаксисом. У ледачій мові, наприклад, маски Haskell можуть бути замінені функціями, оскільки аргументи оцінюються лише тоді, коли це необхідно. Напр. У CL, який має намір оцінити, вам знадобиться макрос, щоб зробити його власним if
але ви можете зробити те ж саме з функцією в Haskell.