Vấn đề thực tế nào dẫn đến việc thiếu các macro vệ sinh trong Clojure?


11

Tôi đã nghe nói rằng macro Clojure dễ viết hơn nhưng không đáng tin cậy như macro vệ sinh của vợt. Câu hỏi của tôi có 2 phần:

  1. Làm thế nào gensymkhác với các macro vệ sinh?
  2. Các macro vợt cung cấp những gì Clojure không? (có thể là an toàn, khả năng kết hợp, hoặc bất cứ điều gì)

2
Các macro vệ sinh là các macro có sự mở rộng được đảm bảo không gây ra sự bắt giữ ngẫu nhiên các định danh. Vấn đề chung về việc bắt ngẫu nhiên đã được biết đến trong cộng đồng Lisp trước khi giới thiệu các macro vệ sinh. Các nhà văn vĩ mô sẽ sử dụng các tính năng ngôn ngữ sẽ tạo ra các định danh duy nhất (ví dụ: gensym) hoặc sử dụng các định danh bị che khuất để tránh sự cố. Các macro vệ sinh là một giải pháp lập trình cho vấn đề chụp được tích hợp vào chính thiết bị mở rộng macro. vi.wikipedia.org/wiki/Hygieneic_macro
Robert Harvey

3
Bởi vì hệ thống macro vệ sinh của [Vợt] có kiến ​​thức sâu về cách thức hoạt động của macro, macro của bạn được tích hợp rất tốt vào môi trường: tô sáng cú pháp hoạt động chính xác, đổi tên biến tự động hoạt động chính xác, tham chiếu chéo hoạt động chính xác và tất cả các hoạt động khác slick [Vợt] tính năng IDE. Nói cách khác, vệ sinh không chỉ bảo vệ bạn trước các lỗi đơn giản như bắt lỗi biến nó cho phép mã của bạn được phân tích chính thức bằng các công cụ đơn giản không thể tồn tại cho LISP chung. Randomhacks.net/2002/09/13/hygieneic-macros
Robert Harvey

Câu trả lời:


6

Ưu điểm của macro vệ sinh không phải là một trong khả năng ngôn ngữ - bạn có thể viết các macro có vệ sinh tốt bằng cách sử dụng gensymvà trích dẫn cẩn thận / không trích dẫn vào đúng thời điểm. Tuy nhiên, macro vệ sinh đảm bảo macro của bạn có vệ sinh tốt. Về mặt đó, nó hơi giống như kiểm tra kiểu.

Cũng có thể có những lợi thế về công cụ cho các macro vệ sinh. Hầu hết các hệ thống macro hợp vệ sinh áp đặt các kiểm soát chặt chẽ về những gì macro của bạn làm và cách thực hiện (ví dụ: bạn không thể thực thi mã tùy ý khi macro được xác định bởi Scheme syntax-caseđược mở rộng). Điều này có thể giúp viết các chương trình "hiểu" macro của bạn dễ dàng hơn và có thể cung cấp hỗ trợ công cụ bổ sung.

Mặt khác, có một số trường hợp macro không hợp vệ sinh có thể hữu ích. Ví dụ: nếu bạn thực sự muốn nắm bắt một ràng buộc cho một biến cụ thể (ví dụ: macro anaphoric ) thì tôi nghĩ bạn sẽ không gặp may nếu bạn chỉ có macro vệ sinh.


2
gensymngăn macro vô tình gây rối với người dùng macro, nhưng không ngăn người dùng macro làm phiền với macro. Ví dụ, một người dùng macro có thể xác định lại ifhoặc một cái gì đó tương tự. (Câu hỏi "tại sao ai sẽ làm điều đó" là không thích hợp Đây là một ví dụ đơn giản đó chứng tỏ rằng đó là có thể, và đó là khó khăn để lý do về macro không hợp vệ sinh.)
Phil

2
Macro không vệ sinh chắc chắn là hữu ích. Tôi không chắc chắn về Scheme, nhưng Vợt có nhiều thao tác "vệ sinh uốn cong". Các macro của ngôn ngữ được vệ sinh theo mặc định. Họ chỉ làm cho bạn rất ý thức khi bạn phá vỡ vệ sinh.
Phil
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.