I programmering er et sigil [1] [2] et tegn knyttet til et variabelnavn , der angiver en datatype eller scope , normalt et præfiks, som i $foohvor $er sigilet.
Sigil , fra det latinske sigillum , der betyder "lille tegn", betyder et tegn eller billede, der angiveligt har magisk kraft . [3] Sigils kan bruges til at afgrænse navnerum , som har forskellige egenskaber og adfærd.
Brugen af sigils blev populært af BASIC -programmeringssproget . Det mest berømte eksempel på en sigil i BASIC er dollartegnet (“ $”) tilføjet til navnene på alle strenge . Mange dialekter af BASIC bruger også andre sigiler (såsom " %") til at repræsentere heltal , flydende kommatal og nogle gange andre typer.
Larry Wall tilføjede sigils til sit Perl -programmeringssprog og emulerede sigils i kommandolinjescripting . I Perl definerer sigils ikke datatyper såsom strenge og heltal, men mere generelle kategorier: scalars (præfiks " $" fra engelsk scalar ), arrays ( præfiks " @" fra engelsk array ), hashes (præfiks “ %”) og underrutiner (“ &”). Raku - sproget bruger også hjælpesigils mellem sigils og variabelnavne, twigils , [4] for at angive variable omfang. Levende eksempler på twigils i Raku: “ ^”, brugt med positionsargumenter for denne blok eller subrutine selv-erklæret i brødteksten af en blok eller subrutine; " ." bruges sammen med objektattributter (egenskaber og metoder).
I CLIPS sættes skalarvariabler foran med " ?", og flere variabler (såsom lister på et enkelt niveau) foranstilles med " $?".
I Common Lisp er variabler med dynamisk omfang normalt indesluttet i " *" ("øreværnekonvention"). Selvom dette kun er en konvention, og det slet ikke er nødvendigt at gøre det, bruger sproget selv denne praksis (for eksempel *standard-output*). Nogle programmører omslutter konstanter med " +".
I Cycle indledes variabler af et " ?"-tegn. [5] Konstante navne begynder med præfikset " #$" (udtales "hash dollar"). [6]
I Elixir er sigils former for syntaks, der begynder med tegnet " ~", hvilket giver dig mulighed for at erklære regulære udtryk, strenge bogstaver, lister, datoer. [7] [8]
I MAPPER (alias BIS) er navngivne variable omgivet af trekantede parenteser, da strenge og tegn ikke kræver anførselstegn.
I MIRC scripts skrives identifikatorer (som returnerer beregnede værdier [9] ) med et " $" præfiks, og variabler skrives med et " " præfiks %(både lokalt og globalt). Variabler for binære data af vilkårlig størrelse er foranstillet med " &".
I MUMPS- programmeringssproget går tegnet " $" forud for systemfunktionsnavne og "specielle variabelnavne" (systemvariabler til adgang til udførelsestilstand). Sigilet " $Z" går forud for navnene på ikke-standard systemfunktioner. Sigilet " $$" går forud for navnene på brugerdefinerede funktioner. Navnene på underrutiner ( i nogle tilfælde ) og globale variabler (lagret på disken) begynder med tegnet "^".
I Objective-C er strengliteraler efter " @" forekomster af klassen NSStringeller, siden clang v3.1 / LLVM v4.0, NSNumber, NSArrayeller NSDictionary. Præfikset " @" bruges også i nøgleordene @interfaceog bruges @implementationi @endklassedefinitionssyntaks. Klasser bruger også -præfikset " " til at angive metoder og felter for en instans (objekt), og +præfikset " " angiver medlemmer af en klasse (det vil sige en objekttype).
I PHP -sproget , som i vid udstrækning var inspireret af Perl, " $" går forud for alle variabelnavne. Navne uden dette præfiks betragtes som konstanter , funktions- eller klassenavne (eller grænseflade- eller egenskabsnavne , der deler det samme navneområde som klasser).
PILOT bruger " $" til buffere (strengvariabler), " #" for heltalsvariabler og " *" til etiketter .
Python bruger " @" ( tærtesyntaks ) for dekoratører [10] og " __", (dunder ) for "private" klassemedlemmer.
I Ruby har regulære variabler ikke sigils, men globale variabler er præfikset med " ", $instansvariabler er præfikseret med " @", og klassevariable er præfikseret med " @@". Ruby bruger også (strengt konventionelle) suffiks sigils: " ?" specificerer en prædikatmetode, der returnerer en boolsk værdi; " !" angiver, at metoden kan have en potentielt uventet effekt og bør håndteres med forsigtighed. [elleve]
I Scheme slutter navnene på procedurer, der altid returnerer en boolesk værdi, normalt på " ?". Navnene på procedurer, der gemmer værdier i dele af forudallokerede Scheme-objekter (såsom par, vektorer eller strenge) ender normalt på " !".
Standard ML bruger præfikset sigil " '" for variabler, der refererer til typer. Hvis sigilet fordobles, refererer det til den type, som lighed er defineret for. Symbolet " '" kan også optræde i eller i slutningen af variabelnavne, i hvilket tilfælde det ikke har nogen klar betydning.
I Transact-SQL står tegnet " @" foran navnet på en lokal variabel eller parameter. Systemvariabler (kendt som globale variabler) er markeret med " @@".
I Windows PowerShell , som delvist var inspireret af Unix-skallen og Perl, begynder variabelnavne med et " $"-tegn.
I XSLT er variabler og parametre præfikset med " " når de bruges , selvom der ikke tilføjes nogen sigil , $når de er defineret i <xsl:param>eller <xsl:variable>i en attribut . nameDet XSLT-relaterede sprog XQuery bruger " $" i både definition og brug.
I MEL er variabelnavne foranstillet med " $" for at skelne dem fra funktioner, kommandoer og andre identifikatorer.
I Unix-skallen og hjælpeprogrammer som Makefiles er " $" en unær operator , der oversætter en variabels navn til dens indhold. På trods af den ydre lighed er tegnet i dette tilfælde ikke en del af navnet, hvilket er mærkbart ved dets fravær i opgaven. Analogen i C er den derefererende operator for pointere.
Sigils bruges ikke i Fortran , men alle variabler, der begynder med bogstaverne I, J, K, L, M og N er som standard heltal . [12] I Fortran-dokumentationen kaldes dette "implicit skrivning", selvom eksplicit skrivning altid er tilgængelig, hvilket gør det muligt at deklarere enhver variabel med enhver type. Valget af IN-område følger traditionelle variable navngivningskonventioner i matematik .
Forskellige programmeringssprog, herunder Prolog , Haskell , Ruby og Go, behandler identifikatorer, der starter med et stort bogstav, anderledes end dem, der starter med et lille bogstav.
Microsoft .NET Common Language Infrastructure (CLI) har en måde at undslippe variabler i det kaldede sprog, der kan være nøgleord i det kaldende sprog, kaldet stropping [13] i engelske kilder . Nogle gange gøres dette med præfikser. For eksempel i C# kan variabelnavne begynde med et " " præfiks @. [14] VB.Net bruger firkantede parenteser til samme formål. [femten]
Associeret med sigils er ungarsk notation , en variabel navngivningskonvention , der bestemmer typen af en variabel ved at tilføje visse bogstavpræfikser til variabelnavnet. I modsætning til sigils giver ungarsk notation ingen information til compileren; typer skal angives eksplicit for variabler (medmindre der bruges et typeudledt sprog ). Da de fleste standardkompilere ikke påbyder brugen af præfikser, giver dette mulighed for at lave fejl og gør kode tilbøjelig til forvirring på grund af utilsigtet misbrug. [16]
Mens sigiler gælder for navne (identifikatorer), kan lignende præfikser og suffikser gælde for literaler , især heltal og strenge, og specificerer enten hvordan bogstavet fortolkes eller dets datatype. For eksempel 0x10ULLbehandles det som værdien 16 med en C++ datatype unsigned long long: angiver , at 0xdet er et hexadecimalt tal, og suffikset ULLangiver typen. Præfikser bruges ofte til at markere strenge uden tegn escapes . I r"C:\Windows"Python vil en undsluppet streng f.eks. blive skrevet som "C:\\Windows".
Fordi det påvirker semantikken (betydningen) af det bogstavelige, og ikke syntaksen eller semantikken af identifikatoren (navnet), er det hverken stropping (identifikatorsyntaks) eller sigil (identifikator-semantik), på trods af syntaktiske ligheder.
For eksempel indbyggede Java-annoteringer som @Overridef.eks @Deprecated.
I nogle tilfælde kan den samme syntaks bruges til forskellige formål, hvilket kan forårsage forvirring. For eksempel i C# kan præfikset " " @bruges både som en stropping og som et præfiks til en bogstavelig (for at betegne strenge uden escape); i dette tilfælde er ingen af brugen en sigil, fordi den påvirker syntaksen for identifikatorer eller bogstavernes semantik, ikke identifikatorernes semantik.