Это команда cpphs-hugs, которую можно запустить в провайдере бесплатного хостинга OnWorks, используя одну из наших многочисленных бесплатных онлайн-рабочих станций, таких как Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS.
ПРОГРАММА:
ИМЯ
cpphs - либерализованный препроцессор типа cpp-a для Haskell
СИНТАКСИС
cpphs [ИМЯ ФАЙЛА|ВАРИАНТ] ...
ОПИСАНИЕ
cpphs является либерализованным повторным внедрением CPP (1) препроцессор C, в и для
Хаскелл.
Зачем заново внедрять cpp? Верно или нет, но препроцессор C широко используется в Haskell.
исходный код. Позволяет условную компиляцию для разных компиляторов, разных
версии одного и того же компилятора и разные платформы ОС. Также иногда используется
для своего макроязыка, который может включать определенные формы специфичных для платформы деталей -
заполнение, такое как утомительная шаблонная генерация определений экземпляров и FFI
декларации. Однако с cpp есть две проблемы, помимо очевидной эстетики.
из них:
Для некоторых систем Haskell, особенно Hugs в Windows, настоящий cpp недоступен для
по умолчанию.
Даже для других систем Haskell общий cpp, предоставляемый серией gcc 3.x
тонко меняется, что несовместимо с синтаксисом Haskell. Там есть
всегда были проблемы, например, с пробелами в строке и простыми символами в
идентификаторы. Эти проблемы будут только усугубляться.
Итак, казалось правильным попытаться предоставить альтернативу cpp, более совместимую с
Haskell и сам написан на Haskell, чтобы его можно было распространять с компиляторами.
cpphs в значительной степени полнофункциональный и совместим с -традиционный стиль cpp.
Имеет два режима:
только условная компиляция (--номакро),
и полное расширение макроса (по умолчанию).
In --номакро Режим, cpphs выполняет только действия условной компиляции, т.е. #включают«S,
#еслии #ифдефобрабатываются в соответствии с определениями замены текста (обе команды -
строка и внутренняя), но параметризованное раскрытие макроса не выполняется. В полном объеме
режим совместимости (по умолчанию), текстовые замены и расширения макросов также
обрабатывается в оставшейся части текста, отличного от cpp.
Рабочие особенности:
#ифдеф простая условная компиляция
#если полный логический язык определенных (), &&, ||, == и т. д.
#элиф связанные условные выражения
#define
встроенные определения (замены текста и макросы)
#ундеф оперативный отзыв определений
#включают
включение файла
#линия директивы номеров строк
\n продолжения строк во всех # директивах
/ ** / цепочка токенов в макроопределении
## Связь токенов в стиле ANSI
# Стрингизация токенов в стиле ANSI
__ФАЙЛ__
специальная замена текста для сообщений об ошибках DIY
__ЛИНИЯ__
специальная замена текста для сообщений об ошибках DIY
__ДАТА__
специальная замена текста
__ВРЕМЯ__
специальная замена текста
Макрорасширение является рекурсивным. Переопределение имени макроса не вызывает предупреждения.
Макросы можно определить в командной строке с помощью -D точно так же, как текстовые замены. Макрос
имена могут быть идентификаторами Haskell, например, с штрихом `и обратным апострофом ´
символы, которые немного свободнее, чем в C, но они все равно могут не включать оператор
символы.
Нумерация строк на выходе сохраняется, так что любой более поздний процессор может дать
содержательные сообщения об ошибках. Когда файл #включают'г, cpphs вставки #линия директивы для
по той же причине. Нумерация должна быть правильной даже при наличии продолжений линий.
Если ты не хочешь #линия директивы в окончательном выводе, используйте - нолайн опцию.
Любые синтаксические ошибки в директивах cpp выдают сообщение на stderr и останавливают программу.
Неспособность найти файл # include'd выдает предупреждение для stderr, но обработка продолжается.
Вы можете указать любое количество имен файлов в командной строке. Результаты привязаны к
стандартный вывод.
-Dсим определить текстовую замену (значение по умолчанию - 1)
-Dsym =волна
определить текстовую замену с определенным значением
-Iпуть добавить каталог в путь поиска для # include
-Oфайл указать файл для вывода (по умолчанию stdout)
--номакро
обрабатывать только # ifdef и # include,
не раскрывать макросы
- нолайн
удалить # строчные отбросы из вывода
--полоска
конвертировать комментарии в стиле C в пробелы, даже за их пределами
директивы cpp
- хэш
распознают оператор строкового преобразования ANSI # и ## для
цепочка токенов в макросах
--текст обрабатывать ввод как простой текст, а не код Haskell
--макет
сохранять символы новой строки в расширениях макросов
- не горит
удалить комментарии в грамотном стиле
--версия
сообщить номер версии cpphs и остановить
По умолчанию НЕТ текстовых замен. (Нормальный cpp обычно имеет определения
для машины, ОС и т. д. Их можно легко добавить в исходный код cpphs, если хотите.)
Путь поиска ищется в порядке -I варианты, за исключением того, что каталог
сначала выполняется поиск вызывающего файла, а затем текущего каталога. Опять же, нет
путь поиска по умолчанию (и, опять же, это можно легко изменить).
РАЗЛИЧИЯ от CPP
Как правило, cpphs основывается на -традиционный поведение, а не ANSI C, и имеет
следующие основные отличия от стандартного cpp.
Общие
Команда # который вводит любую директиву cpp, должен быть в первом столбце строки (тогда как
ANSI разрешает пробелы перед # ).
Создает #линия n "имя файла"синтаксис, а не # n "имя файла"вариант.
Комментарии C удаляются только из директив cpp. Они не отделены от других
текст. Рассмотрим, например, что в Haskell все следующие допустимые операторы
символы: /* */ * / * Однако вы можете включить удаление C-комментария с помощью --полоска опцию.
Макрос язык
Принимает / ** / для вставки токена в определение макроса. Тем не мение, /* */ (с любым текстом
между комментарием открытия / закрытия) вставляет пробел.
ANSI ## Оператор вставки токена доступен с - хэш флаг. Это чтобы избежать
неверная интерпретация любого допустимого оператора Haskell с тем же именем.
Заменяет формальный параметр макроса на фактический, даже внутри строки (двойной или одиночный
цитируется). Это традиционное поведение, не поддерживаемое в ANSI.
Признает # оператор строковой обработки в определении макроса, только если вы используете - хэш
вариант. (Это дополнение ANSI, оно необходимо только потому, что цитируемая строка (см. Выше)
запрещено ANSI.)
Точно сохраняет пробелы в текстовом определении замены (по модулю новой строки),
но пробелы в начале и в конце исключаются.
Точно сохраняет пробелы в определении макроса (и в конце его) (по модулю
новые строки), но ведущий пробел удаляется.
Точно сохраняет пробелы в аргументах макроса (включая символы новой строки), но в начале
и конечное пространство исключается.
Для --макет опция, продолжение строки в текстовой замене или определении макроса
сохраняются как разрывы строк в вызове макроса. (Полезно для чувствительного к макету кода в
Хаскелл.)
Используйте cpphs-hugs онлайн с помощью сервисов onworks.net