/ / Що можна зробити з монетою Haskell, яку неможливо виконати з маскою Lisp, і навпаки? [closed] - haskell, macros, lisp, monads

Що можна зробити з монетою Haskell, яку неможливо зробити з маскою Lisp, і навпаки? [closed] - haskell, macros, lisp, monads

Моє сучасне розуміння полягає в тому, що макроси можуть реалізувати будь-яку уявну концепцію, включаючи монад, тому що вони "мають компілятор в руках". Це правда? Наприклад, я натрапив на це посилання

Будь ласка, дайте мені факти та приклади, не пристрасні відповіді. Дякую.

Відповіді:

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.