Яка практична проблема є наслідком відсутності гігієнічних макросів у Clojure?


11

Я чув, що макроси Clojure простіше писати, але не такі надійні, як гігієнічні макроси Ракетки. Моє запитання має 2 частини:

  1. Чим gensymвідрізняються гігієнічні макроси?
  2. Що забезпечують макроси ракетки, які Clojure не роблять? (будь то безпека, компостування чи що-небудь)

2
Гігієнічні макроси - це макроси, розширення яких гарантовано не спричиняє випадкового захоплення ідентифікаторів. Загальна проблема випадкового захоплення була добре відома в спільноті Lisp ще до впровадження гігієнічних макросів. Письменники макросів використовували б мовні функції, які генерували б унікальні ідентифікатори (наприклад, gensym) або використовували блукані ідентифікатори, щоб уникнути проблеми. Гігієнічні макроси - це програмне рішення проблеми захоплення, яке інтегрується в сам розширювач макросів. en.wikipedia.org/wiki/Hygienic_macro
Роберт Харві

3
Оскільки гігієнічна макросистема [Racket's] має глибокі знання про те, як працює ваш макрос, ваш макрос надзвичайно добре інтегрований у навколишнє середовище: виділення синтаксису працює правильно, автоматичне перейменування змінної працює правильно, перехресне посилання працює правильно та так само, як і всі інші гладкі [Racket] функції IDE. Іншими словами, гігієна не просто захищає вас від простих помилок, таких як перехоплення змінних - вона дозволяє офіційно аналізувати ваш код інструментами, які просто не могли існувати для загального LISP. randomhacks.net/2002/09/13/hygienic-macros
Роберт Харві

Відповіді:


6

Перевага гігієнічних макросів не в мовних можливостях - ви можете писати макроси, які мають добру гігієну, використовуючи gensymта ретельне цитування / скасування запиту в потрібний час. Однак гігієнічні макроси забезпечують належну гігієну вашим макросам. У цьому відношенні це трохи схоже на перевірку типу.

Також можуть бути переваги інструментарію для гігієнічних макросів. Більшість гігієнічних макросистем накладають чіткий контроль того, що робить ваш макрос і як це робить (наприклад, ви не можете виконувати довільний код, коли макрос, визначений схемами, syntax-caseрозширюється). Це може полегшити написання програм, які "розуміють" ваш макрос і можуть надати додаткову підтримку інструментів.

З іншого боку, є деякі випадки, коли негігієнічні макроси можуть бути корисними. Наприклад, якщо ви дійсно хочете зафіксувати прив’язку для певної змінної (наприклад, анафоричні макроси ), то, я думаю, вам не пощастило, якщо у вас є лише гігієнічні макроси.


2
gensymзаважає макросу випадково возитися з користувачем макросу, але не заважає користувачеві макросу возитися з макросом. Наприклад, користувач макросу може переробити ifабо щось подібне. (Питання "навіщо хтось це робити" не має значення. Це простий приклад, який демонструє, що це можливо, і складно міркувати про негігієнічні макроси)
Філ

2
Негігієнічні макроси, безумовно, корисні. Я не впевнений у схемі, але Ракетка має багато операцій з "гігієнічного згинання". Мовні макроси за замовчуванням гігієнічні. Вони просто роблять вас дуже свідомими, коли ви порушуєте гігієну.
Філ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.