سؤال

هل من الممكن استخدام امتداد 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 أخرى) تترك أزواج الفضاء الخلف وحدها وتعمل فجوة السلسلة كما هو متوقع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top