2010-03-30 3 views
10

다중 행 문자열 리터럴을 포함하는 하스켈 코드에서 CPP 확장을 사용할 수 있습니까? Haskell을위한 다른 조건 컴파일 기술이 있습니까? 예를 들어하스켈의 CPP 확장 및 다중 라인 리터럴

,의이 코드 보자 :

[1 of 1] Compiling Main    (cpp-multiline.hs, cpp-multiline.o) 

cpp-multiline.hs:4:17: 
    lexical error in string/character literal at character 'o' 

가 GHC 6.12.1을 사용 cpphs가 있습니다 : 나는 {-# LANGUAGE CPP #-} 주석을 제거하면

-- If the next line is uncommented, the program does not compile. 
-- {-# LANGUAGE CPP #-} 

msg = "Hello\ 
    \ Wor\ 
    \ld!" 

main = putStrLn msg 

을 다음 GHC는 어휘 오류로이 코드를 반박 .

나는 cpphs.compat 래퍼와 -pgmP cpphs.compat 옵션을 사용하는 것이 도움이되지만 사용자 지정 쉘 스크립트에 의존하지 않는 솔루션을 갖고 싶습니다. -pgmP cpphs이 작동하지 않습니다.

P. GHC < 6.12와 GHC> = 6.12에 대해 다른 코드를 사용할 필요가 있는데, 전 처리기없이 가능합니까?

UPD. Ganesh의 대답에 덧붙여, 또 다른 해결 방법은 모든 조건부 선언을 {-# LANGUAGE CPP #-}이라는 별도의 모듈에 넣는 것입니다. 따라서 여러 줄 문자열을 사용하는 모듈에서 CPP를 피하십시오.

+0

"Hello"++ "Wor"++ "ld!"'를 사용하지 않는 이유는 무엇입니까? – kennytm

+0

''Hello \ whitespace + \ World! ''는 하스켈 98이기 때문에 사용하는 코드가 있기 때문에. 왜냐하면''++ '''는 더 많은 공간을 필요로하기 때문입니다. 마지막으로 프로젝트의 모든 다중 행 문자열을 다시 묶고 다시 포맷하지 않고 패치를 작성하고 싶습니다. – sastanin

답변

6

cpphs를 읽고 난의 compat 스크립트가 불필요하게 생각 --cpp 옵션 자체를 가지고 다음 cpphs 참조 1.3 진입 http://haskell.org/cpphs/

이 동작을 사용하려면 -optP --cpp을 GHC (물론 -pgmP cpphs)로 전달해야한다고 생각합니다.

2

그것은 GHC 사용자 설명서 주소이 보인다 Section 4.10.3.1 지금

A small word of warning: -cpp is not friendly to “string gaps”.. In other words, strings such as the following:

strmod = "\ 
\ p \ 
\ " 

don't work with -cpp; /usr/bin/cpp elides the backslash-newline pairs.

However, it appears that if you add a space at the end of the line, then cpp (at least GNU cpp and possibly other cpps) leaves the backslash-space pairs alone and the string gap works as expected.

+0

감사합니다. \ 뒤에 후행 공백을 추가하려고했지만 cpp는'백 슬래시와 개행을 공백으로 구분하여 경고합니다 .'라는 메시지를 표시하고 코드는 여전히 컴파일되지 않습니다. GNU cpp 사용하기 4.4.3. – sastanin