2012-04-23 24 views
6

Thật dễ dàng để viết các macro hợp vệ sinh tại Scala bằng cách sử dụng reifyeval. Nhưng it's not always possible để sử dụng reifyeval.Đảm bảo vệ sinh khi không sửa đổi

Vì vậy, nếu không thể sử dụng chúng, các quy tắc sẽ đảm bảo rằng macro là hợp vệ sinh là gì? Và có cách nào để kiểm tra một vĩ mô để đảm bảo rằng không có vệ sinh xấu đã trượt qua các vết nứt?

cập nhật. Trong các mốc quan trọng sau này là 2.10.0, Expr.eval đã được đổi tên thành Expr.splice.

+0

Đọ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. –

+0

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 :-) –

Trả lời

10

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.

1

reify là macro, tôi chỉ xem xét triển khai của nó để tìm hiểu xem nó hoạt động như thế nào.

+0

Chắc chắn - đó sẽ là động thái tiếp theo của tôi :-) Tôi không chắc chắn rằng tôi sẽ "chỉ" nhìn vào nó mặc dù - việc thực hiện là khá tham gia và sẽ có một số chọn ngoài. Thấy không ai có thể có quy tắc để bàn tay, tôi đoán tôi sẽ xem nếu tôi có thể nắm bắt chúng và gửi chúng ở đây khi tôi đã làm như vậy. –

Các vấn đề liên quan