I programmering är en sigil [1] [2] ett tecken kopplat till ett variabelnamn som anger en datatyp eller omfattning , vanligtvis ett prefix, som i $foovar $är sigilen.
Sigil , från latinets sigillum , som betyder "litet tecken", betyder ett tecken eller en bild som antas ha magisk kraft . [3] Sigils kan användas för att avgränsa namnområden , som har olika egenskaper och beteenden.
Användningen av sigils populariserades av programmeringsspråket BASIC . Det mest kända exemplet på en sigil i BASIC är dollartecknet (“ $”) som läggs till namnen på alla strängar . Många dialekter av BASIC använder också andra sigiler (som " %") för att representera heltal , flyttalstal och ibland andra typer.
Larry Wall lade till sigils till sitt programmeringsspråk Perl och emulerade sigils i kommandoradsskript . I Perl definierar sigils inte datatyper som strängar och heltal, utan mer allmänna kategorier: skalärer ( prefix " $" från engelsk skalär ), arrayer ( prefix " @" från engelsk matris ), hash (prefix ) “ %”) och subrutiner (“ &”). Raku - språket använder också hjälpsigiler mellan sigils och variabelnamn, twigils , [4] för att indikera variabla omfattningar. Livliga exempel på kvistar i Raku: “ ^”, används med positionsargument för detta block eller subrutin självdeklarerade i kroppen av ett block eller subrutin; " ." används med objektattribut (egenskaper och metoder).
I CLIPS har skalära variabler prefixet " ?", och flera variabler (som listor på en nivå) har prefixet " $?".
I Common Lisp är dynamiskt omfångade variabler vanligtvis inneslutna i " *" ("hörselkåpskonvention"). Även om detta bara är en konvention, och det inte alls är nödvändigt att göra det, använder språket självt denna praxis (till exempel *standard-output*). Vissa programmerare omger konstanter med " +".
I CycL föregås variabler av ett " ?"-tecken. [5] Konstanta namn börjar med prefixet " #$" (uttalas "hash dollar"). [6]
I Elixir är sigils former av syntax som börjar med tecknet " ~", vilket gör att du kan deklarera reguljära uttryck, strängliteraler, listor, datum. [7] [8]
I MAPPER (aka BIS) omges namngivna variabler inom triangelparenteser, eftersom strängar och tecken inte kräver citattecken.
I MIRC-skript skrivs identifierare (som returnerar beräknade värden [9] ) med ett " $"-prefix, och variabler skrivs med ett " "-prefix %(både lokalt och globalt). Variabler för binära data av godtycklig storlek har prefixet " &".
I programmeringsspråket MUMPS föregår tecknet " $" systemfunktionsnamn och "speciella variabelnamn" (systemvariabler för åtkomst till exekveringstillstånd). Sigilen " $Z" föregår namnen på icke-standardiserade systemfunktioner. Sigilen " $$" föregår namnen på användardefinierade funktioner. Namnen på subrutiner ( i vissa fall ) och globala variabler (lagrade på disk) börjar med tecknet "^".
I Objective-C är strängliteraler som föregås av " @" instanser av klassen NSStringeller, sedan clang v3.1 / LLVM v4.0, NSNumber, NSArrayeller NSDictionary. Prefixet " @" används också i nyckelorden och @interfaceanvänds i klassdefinitionssyntax. Klasser använder också prefixet " " för att indikera metoder och fält för en instans (objekt), och prefixet " " indikerar medlemmar av en klass (det vill säga en objekttyp). @implementation@end-+
I PHP- språket , som till stor del var inspirerat av Perl, " $" föregår alla variabelnamn. Namn utan detta prefix betraktas som konstanter , funktions- eller klassnamn (eller gränssnitts- eller egenskapsnamn som delar samma namnutrymme som klasser).
PILOT använder " $" för buffertar (strängvariabler), " #" för heltalsvariabler och " *" för etiketter .
Python använder " @" ( pajsyntax) för dekoratörer [10] och " __", ( dunder ) för "privata" klassmedlemmar.
I Ruby har vanliga variabler inte sigils, men globala variabler har prefixet " ", $instansvariabler har prefixet " @" och klassvariabler har prefixet " @@". Ruby använder också (strängt konventionella) suffix sigils: " ?" specificerar en predikatmetod som returnerar ett booleskt värde; " !" indikerar att metoden kan ha en potentiellt oväntad effekt och bör hanteras med försiktighet. [elva]
I Schema , enligt konvention, slutar namnen på procedurer som alltid returnerar ett booleskt värde vanligtvis på " ?". Namnen på procedurer som lagrar värden i delar av förallokerade Scheme-objekt (som par, vektorer eller strängar) slutar vanligtvis på " !".
Standard ML använder prefixet sigil " '" för variabler som refererar till typer. Om sigilen fördubblas, hänvisar den till den typ för vilken jämlikhet definieras. Symbolen " '" kan också förekomma i eller i slutet av variabelnamn, i vilket fall den inte har någon tydlig betydelse.
I Transact-SQL står tecknet " @" före namnet på en lokal variabel eller parameter. Systemvariabler (kända som globala variabler) är markerade med " @@".
I Windows PowerShell , som delvis var inspirerat av Unix-skalet och Perl, börjar variabelnamn med ett " $"-tecken.
I XSLT har variabler och parametrar prefixet " " när de används , även om ingen sigil läggs till $när de definieras i <xsl:param>eller <xsl:variable>i ett attribut . nameDet XSLT-relaterade språket XQuery använder " $" i både definition och användning.
I MEL har variabelnamn prefixet " $" för att skilja dem från funktioner, kommandon och andra identifierare.
I Unix-skalet och verktyg som Makefiles är " $" en unär operator som översätter en variabels namn till dess innehåll. Trots den yttre likheten är tecknet i detta fall inte en del av namnet, vilket märks genom sin frånvaro i uppdraget. Analogen i C är referensoperatorn för pekare.
Sigils används inte i Fortran , men alla variabler som börjar med bokstäverna I, J, K, L, M och N är heltal som standard . [12] I Fortran-dokumentationen kallas detta "implicit typning", även om explicit typning alltid är tillgänglig, vilket gör att alla variabler kan deklareras med vilken typ som helst. Valet av IN-intervall följer traditionella variabelnamnkonventioner inom matematik .
Olika programmeringsspråk, inklusive Prolog , Haskell , Ruby och Go, behandlar identifierare som börjar med en stor bokstav annorlunda än de som börjar med en liten bokstav.
Microsoft .NET Common Language Infrastructure (CLI) har ett sätt att undvika variabler i det anropade språket som kan vara nyckelord i det anropande språket, kallat stropping [13] i engelska källor . Ibland görs detta med prefix. Till exempel i C# kan variabelnamn börja med ett " " prefix @. [14] VB.Net använder hakparenteser för samma ändamål. [femton]
Förknippat med sigils är ungersk notation , en variabelnamnkonvention som bestämmer typen av en variabel genom att lägga till vissa bokstavsprefix till variabelnamnet. Till skillnad från sigils ger ungersk notation ingen information till kompilatorn; typer måste uttryckligen anges för variabler (såvida inte ett typavslutande språk används ). Eftersom de flesta standardkompilatorer inte kräver användning av prefix, tillåter detta att fel görs och gör koden utsatt för förvirring på grund av oavsiktlig missbruk. [16]
Medan sigils gäller för namn (identifierare), kan liknande prefix och suffix gälla för literaler , särskilt heltal och strängar, och specificerar antingen hur bokstaven tolkas eller dess datatyp. Till exempel 0x10ULLbehandlas det som värdet 16 med en C++ datatyp unsigned long long: indikerar att 0xdet är ett hexadecimalt tal, och suffixet ULLindikerar typen. Prefix används ofta för att markera strängar utan tecken escapes . Till exempel r"C:\Windows"i Python skulle en escaped sträng skrivas som "C:\\Windows".
Eftersom det påverkar semantiken (betydelsen) av det bokstavliga, och inte syntaxen eller semantiken för identifieraren (namnet), är det varken stropping (identifierarsyntax) eller sigil (identifieraresemantik), trots syntaktiska likheter.
Till exempel inbyggda Java-anteckningar som . @Override@Deprecated
I vissa fall kan samma syntax användas för olika ändamål, vilket kan orsaka förvirring. Till exempel, i C# , kan prefixet " " @användas både som en stropping och som ett prefix till en bokstavlig (för att beteckna strängar som inte har undanröjts); i det här fallet är ingendera användningen en sigil eftersom den påverkar syntaxen för identifierare eller semantiken för bokstaver, inte semantiken för identifierare.