امتداد CPP و Multiline Distalals في Haskell
-
23-09-2019 - |
سؤال
هل من الممكن استخدام امتداد CPP على رمز Haskell الذي يحتوي على حرفيات سلسلة متعددة؟ هل هناك تقنيات تجميع مشروطة أخرى لـ Haskell؟
على سبيل المثال ، لنأخذ هذا الرمز:
-- If the next line is uncommented, the program does not compile.
-- {-# LANGUAGE CPP #-}
msg = "Hello\
\ Wor\
\ld!"
main = putStrLn msg
إذا كنت غير متوفرة {-# LANGUAGE CPP #-}
, ، ثم يدحض GHC هذا الرمز بخطأ معجمي:
[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.
أؤكد ذلك باستخدام CPPHS.Compat غلاف و -pgmP cpphs.compat
يساعد الخيار ، لكنني أرغب في الحصول على حل لا يعتمد على البرامج النصية المخصصة. -pgmP cpphs
لا يعمل.
ملاحظة: أحتاج إلى استخدام رمز مختلف لـ GHC <6.12 و GHC> = 6.12 ، هل هو ممكن بدون المعالج المسبق؟
UPD. بالإضافة إلى الإجابة المقبولة لجانيش ، وجدت أيضًا أن حلًا آخر هو وضع جميع التصريحات المشروطة في وحدة منفصلة مع {-# LANGUAGE CPP #-}
وبالتالي تجنب CPP في الوحدات النمطية مع سلاسل متعددة.
المحلول
لدى CPPHS الآن خيار CPP نفسه ، والذي أعتقد أنه يجعل البرنامج النصي Compat غير ضروري: انظر إدخال CPPHS 1.3 على http://haskell.org/cpphs/
أعتقد أنك ستحتاج إلى المرور -optP --cpp
إلى GHC (وكذلك -pgmP cpphs
) لتمكين هذا السلوك.
نصائح أخرى
يبدو أن دليل مستخدم GHC يعالج هذا: القسم 4.10.3.1 يقرأ
كلمة تحذير صغيرة: -CPP ليست ودية لـ "فجوات السلسلة" .. وبعبارة أخرى ، سلاسل مثل ما يلي:
strmod = "\
\ p \
\ "
لا تعمل مع -CPP ؛ /usr/bin/cPP ينقل أزواج خط الوسط.
ومع ذلك ، يبدو أنه إذا قمت بإضافة مساحة في نهاية الخط ، فإن CPP (على الأقل GNU CPP وربما CPPs أخرى) تترك أزواج الفضاء الخلف وحدها وتعمل فجوة السلسلة كما هو متوقع.