2012-02-01 25 views
5

Từ số Yesod Book.Hamlet tự động truy cập vào các biến trong phạm vi

Ấp tự động có quyền truy cập vào các biến trong phạm vi khi được gọi. Không cần phải chuyển các biến cụ thể vào.

Phép thuật sâu này là gì? Làm thế nào nó có thể tự động biết các biến nào nằm trong phạm vi?

+0

Trong khi tôi không biết gì, đó có thể là mẫu haskell. Tất nhiên (đối với tôi) mẫu haskell là ma thuật sâu, vì vậy có bạn đi :) Một ví dụ đơn giản của cùng một điều là QuickCheck quickcheckAll: nó kỳ diệu biết về tất cả các bind_ * bindings của bạn và chạy chúng. –

Trả lời

9

Ấp dựa trên Template Haskell; cụ thể, một quasiquoter (ví dụ: [hamlet| ... |]) được sử dụng cho mẫu nội tuyến và một mối nối (ví dụ: $(hamletFile "foo")) được sử dụng để tạo mẫu từ tệp. Các biến này sau đó được truy cập với các tính năng nội tâm của Template Haskell.

này có những lợi ích vượt quá cho phép truy cập tự động để biến:

  • Các mẫu kết quả có thể sẽ hiệu quả hơn so với các phân tích và giải thích trong thời gian chạy, vì Ấp mẫu được biên dịch sang mã Haskell thường xuyên tại thời gian biên dịch.

  • Khi đọc mẫu từ tệp, tệp được phân tích cú pháp tại thời gian biên dịch và được nhúng vào kết quả nhị phân, do đó các mẫu không cần phải được lưu giữ trong cùng một vị trí trong thời gian chạy và giá trị của các mẫu được đảm bảo tĩnh.

Tôi tin rằng những lợi thế này áp dụng cho tất cả các mẫu gia đình Shakespeare. The Haddock documentation có thêm thông tin về các quasiquoters có sẵn và các mối nối.

+0

Liên kết trên Haddock bị hỏng, nhưng chúng có thể trỏ đúng hướng: http://www.haskell.org/haskellwiki/Template_Haskell#Template_Haskell_tutorials_and_papers –

4

Đó là một tính năng của Haskell's quasiquotation, là cú pháp [xxx| .... |].

Trình quasiquoter có thể truy cập bất kỳ biến nào nằm trong phạm vi, vì vậy chúng có thể được nội suy. Việc thực hiện nội suy thực tế (nếu có) phụ thuộc vào chính quasiquoter.

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