2013-05-14 46 views
5

Tôi có một tệp haskell biết chữ và muốn sử dụng trình biên dịch có điều kiện. Tôi sử dụng kiểu chim của chương trình biết chữ. Mã sau đây không hoạt động.Compilation Compitional bên trong Literate Haskell

> #if MIN_VERSION_base(4,6,0) 
> import Control.Exception 
> #endif 

Tôi cần một giải pháp cho cabal 1.14.0

EDIT:

cpphs có --unlit tùy chọn mà unlits sourcecode biết chữ, nhưng tôi không biết làm thế nào để chuyển thông tin này tùy chọn để cpphs trong cabal.

Trả lời

4

Khi @kosmikus chỉ ra, bạn có thể chỉ cần đặt các chỉ thị tiền xử lý C bên ngoài bất kỳ > hoặc \begin{code} và chúng sẽ hoạt động như mong đợi - nếu chúng không can thiệp vào việc xử lý các phần không mã của mã chữ của bạn. Bạn chỉ đơn giản là không thể sử dụng chỉ thị tiền xử lý C với lập trình biết chữ theo kiểu chim, vì bước không thay thế sẽ thay thế > bằng khoảng trắng, vì vậy bạn không có cơ hội nhận được # vào cột đầu tiên. Bạn có thể xác minh điều này bằng cách chuyển -keep-tmp-files tới GHC và thanh toán tệp .lpp được tạo.

Bạn có thể dùng đến \begin{code} ... \end{code} khối để có được cả hai, nhưng nếu bạn kết hợp chúng với họ > dòng kiểu mã, giữ cho không gian thêm trong tâm trí và thêm nó vào đường dây của bạn được bọc trong \begin{code} ... \end{code}:

> {-# LANGUAGE CPP #-} 

A literal comment 

\begin{code} 
#if MIN_VERSION_base(4,6,0) 
    import Control.Exception 
#endif 
\end{code} 

> main = return() 
+0

Bạn có thực sự phải chuyển sang khối mã không? Bạn không thể đặt các chỉ thị CPP trực tiếp trong tệp nguồn, không có bất kỳ '>' trước nào? – kosmikus

+0

Ups, tôi nghĩ rằng tôi đã cố gắng đầu tiên, nhưng thực sự đó là trường hợp. –