Sigil (programmering)

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.

Historisk kontekst

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.

Lignende fænomener

Shell variabler

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.

Identifikatorkonventioner

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.

Strapping

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]

Ungarsk notation

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]

Bogstav anbringer

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.

Java-annoteringer

For eksempel indbyggede Java-annoteringer som @Overridef.eks @Deprecated.

Forvirring

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.

Se også

Noter

  1. Vladimir Lettiev. Pragmatic Perl 13: Funktionssignatur i Perl 5.20 . Pragmatisk Perl (13. marts 2014). — “... du kan bruge et regulært sigil [...] I dette eksempel er funktionen kun interesseret i det første og det fjerde argument. Positionspladsholdere er angivet for resten af ​​argumenterne: sigilerne $ og @, de vil ikke blive defineret inde i funktionen." Hentet 13. september 2021. Arkiveret fra originalen 13. september 2021.
  2. Andrey Shitov. Pragmatisk Perl 22: Perl 6 for det 21. århundrede . Pragmatic Perl (22. december 2014). "Perl 6 bruger sigils til variabler, der overlapper med Perl 5. Især skalarer, lister og hashes bruger henholdsvis $, @ og % sigils." Hentet 13. september 2021. Arkiveret fra originalen 13. september 2021.
  3. Definition af sigil . Collins engelsk ordbog . Hentet 22. maj 2012. Arkiveret fra originalen 1. maj 2021.
  4. "Perl 6 variables:Twigils" Arkiveret 17. juni 2016 på Wayback Machine , Perl 6 Dokumentation
  5. Variabler - Cycorp . www.cyc.com . Hentet 31. december 2017. Arkiveret fra originalen 25. januar 2018.
  6. Constants-Cycorp . www.cyc.com . Hentet 31. december 2017. Arkiveret fra originalen 25. januar 2018.
  7. Sigils . Elixir og Wunsh (2020). Hentet 13. september 2021. Arkiveret fra originalen 13. september 2021.
  8. Sigils  . _ elixir-lang.github.com . Hentet 27. juli 2021. Arkiveret fra originalen 2. august 2021.
  9. mIRC Hjælp . www.mirc.com . Hentet 27. juli 2021. Arkiveret fra originalen 9. august 2021.
  10. PEP 318 - Dekoratører til funktioner og metoder . Hentet 9. august 2021. Arkiveret fra originalen 3. juni 2020.
  11. Sort. Bang metoder; eller, Fare, vil Rubyist! (15. august 2007). Arkiveret fra originalen den 22. maj 2016.
  12. Regler for dataindtastning (FORTRAN 77 sprogreference) . docs.oracle.com . Hentet 4. august 2021. Arkiveret fra originalen 25. februar 2021.
  13. King, Peter R., red. (1974-06-18). "(ukendt)" . Proceedings of a International Conference on ALGOL 68 Implementation . Department of Computer Science, University of Manitoba, Winnipeg: University of Manitoba, Department of Computer Science: 148. ISBN  9780919628113 . Arkiveret fra originalen 2021-08-09 . Hentet 2021-08-09 . Mere alvorlige problemer er forbundet med "stropping", den teknik, der bruges til at skelne fed tekst fra romersk tekst. Nogle implementeringer kræver apostrof omkring fed skrift (hvoraf navnet stropper); andre kræver rygafstand og understregning; […] Forældet parameter brugt |deadlink=( hjælp )
  14. C# søgeord . MSDN . Hentet 23. marts 2011. Arkiveret fra originalen 28. januar 2017.
  15. streng (C#-reference) . MSDN . Hentet 23. marts 2011. Arkiveret fra originalen 14. marts 2011.
  16. Linux-kernekodningsstil Arkiveret 9. august 2021 på Wayback Machine , af Linus Torvalds