Dit is het commando cpphs-hugs dat kan worden uitgevoerd in de gratis hostingprovider van OnWorks met behulp van een van onze meerdere gratis online werkstations zoals Ubuntu Online, Fedora Online, Windows online emulator of MAC OS online emulator
PROGRAMMA:
NAAM
cpphs - geliberaliseerde cpp-a-achtige preprocessor voor Haskell
KORTE INHOUD
cpps [BESTANDSNAAM|OPTIE] ...
PRODUCTBESCHRIJVING
cpps is een geliberaliseerde herimplementatie van cpp (1) de C pre-processor, in en voor
Haskell.
Waarom cpp opnieuw implementeren? Terecht of onterecht wordt de C-preprocessor veel gebruikt in Haskell
broncode. Het maakt voorwaardelijke compilatie mogelijk voor verschillende compilers, verschillend
versies van dezelfde compiler en verschillende OS-platforms. Het wordt ook af en toe gebruikt
vanwege zijn macrotaal, die bepaalde vormen van platformspecifieke detail-
vulling, zoals het vervelende standaard genereren van instantiedefinities en FFI
verklaringen. Er zijn echter twee problemen met cpp, afgezien van de voor de hand liggende esthetiek
degenen:
Voor sommige Haskell-systemen, met name Hugs op Windows, is er geen echte cpp beschikbaar
standaard.
Zelfs voor de andere Haskell-systemen, de gemeenschappelijke cpp die wordt geboden door de gcc 3.x-serie
verandert subtiel op manieren die onverenigbaar zijn met de syntaxis van Haskell. Er zijn
altijd problemen geweest met bijvoorbeeld string hiaten en hoofdpersonages in
ID's. Deze problemen worden alleen maar erger.
Het leek dus juist om te proberen een alternatief te bieden voor cpp, die beide beter compatibel zijn
Haskell, en zelf geschreven in Haskell zodat het kan worden gedistribueerd met compilers.
cpps is vrijwel compleet met functies en compatibel met de - traditioneel stijl van cpp.
Het heeft twee modi:
alleen voorwaardelijke compilatie (--nomacro),
en volledige macro-uitbreiding (standaard).
In --nomacro mode, cpps voert alleen voorwaardelijke compilatieacties uit, dwz #include'S,
#als's, en #ifdef's worden verwerkt volgens tekstvervangingsdefinities (beide commando-
lijn en intern), maar er wordt geen geparametriseerde macro-uitbreiding uitgevoerd. Volledig
compatibiliteitsmodus (de standaard), tekstuele vervangingen en macro-uitbreidingen zijn dat ook
verwerkt in de resterende tekst van niet-cpp-tekst.
Werkkenmerken:
#ifdef eenvoudige voorwaardelijke compilatie
#als de volledige booleaanse taal van defined(), &&, ||, ==, etc.
#elif geketende voorwaarden
#define
in-line definities (tekstvervangingen en macro's)
#undef in-line herroeping van definities
#include
bestandsopname
#lijn richtlijnen voor regelnummers
\n regelvoortzettingen binnen alle # richtlijnen
/ ** / token catenatie binnen een macrodefinitie
## ANSI-stijl token catenatie
# Tekenreeksen in ANSI-stijl
__HET DOSSIER__
speciale tekstvervanging voor doe-het-zelf-foutmeldingen
__LIJN__
speciale tekstvervanging voor doe-het-zelf-foutmeldingen
__DATUM__
speciale tekstvervanging
__TIJD__
speciale tekstvervanging
Macro-expansie is recursief. Het herdefiniëren van een macronaam genereert geen waarschuwing.
Macro's kunnen op de opdrachtregel worden gedefinieerd met -D net als tekstuele vervangingen. Makro
namen mogen Haskell-identificaties zijn, bijvoorbeeld met de hoofdletter ` en backtick ´
tekens, wat iets losser is dan in C, maar ze mogen nog steeds geen operator bevatten
symbolen.
Nummering van regels in de uitvoer blijft behouden, zodat elke latere processor kan geven
zinvolle foutmeldingen. Wanneer een bestand is #include'D, cpps inserts #lijn richtlijnen voor
dezelfde reden. De nummering moet correct zijn, zelfs als er lijnvoortzettingen zijn.
Als je niet wilt #lijn richtlijnen in de uiteindelijke uitvoer, gebruik dan de --geen lijn optie.
Elke syntaxisfout in cpp-richtlijnen geeft een bericht aan stderr en stopt het programma.
Het niet vinden van een #include'd bestand geeft een waarschuwing aan stderr, maar de verwerking gaat door.
U kunt een willekeurig aantal bestandsnamen opgeven op de opdrachtregel. De resultaten worden gecategoriseerd
standaard uitvoer.
-Dsym definieer een tekstuele vervanging (standaardwaarde is 1)
-Dsym=golf
definieer een tekstuele vervanging met een specifieke waarde
-Ipad voeg een map toe aan het zoekpad voor #include's
-Ofilet specificeer een bestand voor uitvoer (standaard is stdout)
--nomacro
verwerk alleen #ifdef's en #include's,
vouw geen macro's uit
--geen lijn
verwijder #lijnuitwerpselen uit de uitvoer
--strip
converteer opmerkingen in C-stijl naar witruimte, zelfs daarbuiten
cpp-richtlijnen
--hashes
herken de ANSI # stringise operator, en ## for
token catenation, binnen macro's
--tekst behandel de invoer als platte tekst, niet als Haskell-code
--lay-out
behoud nieuwe regels binnen macro-uitbreidingen
--onverlicht
verwijder opmerkingen in geletterde stijl
--versie
meld het versienummer van cpphs en stop
Standaard zijn er GEEN tekstuele vervangingen gedefinieerd. (Normale cpp heeft meestal definities
voor machine, besturingssysteem, enz. Deze kunnen eenvoudig worden toegevoegd aan de cpphs-broncode als u dat wenst.)
Het zoekpad wordt doorzocht in volgorde van de -I opties, behalve dat de directory van de
het oproepende bestand en vervolgens de huidige map worden altijd eerst doorzocht. Nogmaals, er is geen
standaard zoekpad (en nogmaals, dit kan gemakkelijk worden gewijzigd).
VERSCHILLEN NU CPP
Over het algemeen is cpphs gebaseerd op de - traditioneel gedrag, niet ANSI C, en heeft de
volgende belangrijkste verschillen met de standaard cpp.
Algemeen
De # die een cpp-richtlijn introduceert, moet in de eerste kolom van een regel staan (terwijl
ANSI staat witruimte toe voor de # ).
Genereert de #lijn n "bestandsnaam" syntaxis, niet de # n "bestandsnaam" variant.
C-opmerkingen worden alleen verwijderd binnen cpp-richtlijnen. Ze zijn niet ontdaan van andere
tekst. Bedenk bijvoorbeeld dat in Haskell alle volgende geldige operatoren zijn
symbolen: /* */ * / * U kunt het verwijderen van C-commentaar echter inschakelen met de --strip optie.
Macro taal
Accepteert / ** / voor het plakken van tokens in een macrodefinitie. Echter, /* */ (met elke tekst
tussen de opmerking openen/sluiten) voegt witruimte in.
De ANSI ## token-paste-operator is beschikbaar met de --hashes vlag. Dit is om te vermijden
een geldige Haskell-operator met dezelfde naam verkeerd interpreteren.
Vervangt een macro-formele parameter door de actuele, zelfs binnen een tekenreeks (dubbel of enkel
geciteerd). Dit is -traditioneel gedrag, niet ondersteund in ANSI.
Herkent de # tekenreeksoperator alleen in een macrodefinitie als u de --hashes
keuze. (Het is een ANSI-toevoeging, alleen nodig omdat geciteerde stringisatie (hierboven) is
verboden door ANSI.)
Behoudt witruimte binnen een tekstuele vervangingsdefinitie exact (modulo newlines),
maar voorloop- en volgruimte wordt geëlimineerd.
Behoudt witruimte binnen een macrodefinitie (en erachter) precies (modulo
newlines), maar voorloopruimte wordt geëlimineerd.
Behoudt witruimte binnen macro-aanroepargumenten exact (inclusief nieuwe regels), maar leidend
en volgruimte wordt geëlimineerd.
Met de --lay-out optie, regelvoortzettingen in een tekstuele vervanging of macrodefinitie
worden bewaard als regeleinden in de macro-oproep. (Nuttig voor lay-outgevoelige code in
Haskell.)
Gebruik cpphs-hugs online met behulp van onworks.net-services