Reify là hợp vệ sinh, bởi vì nó lưu các biểu tượng cùng với Ident và cây này.
Nếu kết quả mở rộng macro của bạn không có biểu tượng gắn liền với idents (ví dụ bạn chỉ có Ident ("x") để chỉ định tham chiếu đến cái gì đó có tên là x), thì việc gõ lại macro sau đó sẽ ràng buộc x nằm trong phạm vi của trang web cuộc gọi (hoặc nếu phạm vi đó không có x, bạn sẽ nhận được lỗi biên dịch).
Để tương phản, khi mở rộng macro của bạn có biểu tượng cho idents của nó, typechecker doesnt cố gắng tái giải quyết chúng, và chỉ đơn giản là sử dụng những gì nó có. Điều này có nghĩa là khi bạn reify một biểu thức và sử dụng kết quả trong một macro mở rộng, sau đó nó sẽ mang biểu tượng của nó vào trang gọi. Vâng, không phải tất cả các biểu tượng, ví dụ: không thể tham chiếu đến các biến cục bộ hoặc các thứ riêng tư/được bảo vệ, nhưng các tham chiếu đến các khai báo có thể truy cập trên toàn cầu được duy trì.
Điểm mấu chốt là để kiểm tra xem macro của bạn có hợp vệ sinh hay không, hãy kiểm tra xem idents và thiseses của bạn có biểu tượng gắn liền với chúng hay không. Bạn có thể đạt được điều này bằng cách sửa đổi hoặc bằng cách gán các biểu tượng thủ công cho cây được chế tác thủ công của bạn.
Nguồn
2012-04-24 03:19:10
Đọc qua [Wikipedia> Macro vệ sinh] (http://en.wikipedia.org/wiki/Hygienic_macro) có thể hữu ích. Tôi không có nhiều kinh nghiệm với các macro nên tốt nhất tôi có thể làm là cập nhật thông tin Wikipedia. –
Vâng - Tôi quen thuộc với các macro Lisp và C++ từ các kiếp trước. Nhưng những gì làm việc trong một ngôn ngữ không nhất thiết phải chuyển trực tiếp đến một ngôn ngữ khác :-) –