M-udtryk

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 15. marts 2013; checks kræver 10 redigeringer .

M-udtryk (eller meta -udtryk ) i programmering skulle oprindeligt bruges til at skrive funktioner i Lisp . Data behandlet med M-udtryk blev skrevet ved hjælp af S-udtryk . M-udtryk blev brugt i det originale teoretiske sprog beskrevet i de tidlige Lisp-artikler, men i den første arbejdsimplementering af Lisp blev M-udtryk kodet som S-udtryk, og M-udtryksoversætteren blev aldrig implementeret.

Projektet med at præcist definere M-udtryk og kompilere dem, eller i det mindste oversætte dem til S-udtryk, blev aldrig afsluttet eller eksplicit opgivet. Det blev simpelthen lagt på hylden på ubestemt tid, og en ny generation af programmører opdagede, at de foretrak intern notation frem for hvilken som helst FORTRAN- eller ALGOL-lignende programnotation, de kunne finde på.

Originaltekst  (engelsk)[ Visskjule]

Projektet med at definere M-udtryk præcist og kompilere dem eller i det mindste oversætte dem til S-udtryk blev hverken afsluttet eller eksplicit opgivet. Det er bare trukket sig tilbage i den ubestemte fremtid, og en ny generation af programmører dukkede op, som foretrak intern notation frem for enhver FORTRAN-lignende eller ALGOL-lignende notation, der kunne udtænkes.

John McCarthy [1] , History of Lisp

Historisk forbindelse til S-udtryk

S-udtryk er data, der kun består af atomer og par . I starten blev atomet beskrevet som et stort bogstav, og parrene var afgrænset af parentes. Den forkortede notation for lister blev også beskrevet , selvom elementerne i listerne oprindeligt var adskilt af kommaer, ikke mellemrum . Et eksempel på indtastning (vi bruger mellemrum, ikke kommaer):

((AB)(CD)(EF))

er en liste med tre elementer, som hver er en liste med to tegn.

Et M-udtryk kan også bruge operatornavne, metavariabler og argumentlister. Navnene på operatorer og metavariabler blev angivet med små bogstaver for at angive, at de ikke er symboler (data). Argumentlister blev afgrænset af firkantede parenteser, []og deres elementer blev adskilt af semikolon. For eksempel:

bil[cons[(A . B); x]]

er en todelt operation:

Den originale beskrivelse af Lisp udgivet af McCarthy, hvor den præsenteres som et teoretisk universalsprog, beskriver en funktion eval, der tager S-udtryk som input, konverterer dem til form af M-udtryk, og som også udfører programmer i form af M- udtryk, der er kodede S-udtryk. Her er nogle eksempler på M-udtryk og deres konvertering til S-udtryk (igen ved hjælp af moderne listenotation):


{M-udtryk} {S-udtryk} (ABC) (CITAT (ABC)) bil[x] (BIL X) bil[tilføj[(ABC); (DEF)]] (BIL (TILFØJ (CITAT (ABC)) (CITAT (DEF))))

Den oprindelige implementering af Lisp var planlagt til at være en meget lang proces, da compilere tog årevis at skrive på det tidspunkt. Implementeringen begyndte med den manuelle kompilering af visse funktioner, mens M-ekspressionens undersprog stadig var foreløbig. Steve Russell og Daniel J. Edwards indså dog , at implementeringen evalville fungere som en fuld implementering af Lisp-fortolkeren ved hjælp af S-udtryk. [2] At kompilere funktionen manuelt evalviste sig at være en meget enkel opgave sammenlignet med mange års forventet kompileringsopbygning. Fællesskabet af programmører, der bruger S-udtryk, er vokset hurtigt. M-udtryk blev opgivet og modtog ikke en fælles implementering for hele familien af ​​Lisp-sprog.

Moderne brug af M-udtryk

Selvom det er usædvanligt for Lisp-programmører at komme med alternative former for sproget ( MLISP er et af de få eksempler ), bruger nogle M-udtryk. Men sådanne dialekter mister ensartetheden af ​​S-udtryk, hvilket anses for et vigtigt punkt for sprogets udtryksevne. Som et resultat forbliver S-udtryk den primære (eller eneste) syntaks i stort set alle almindelige Lisp-dialekter. Undtagelser omfatter logosproget , som kan opfattes (med nogle friheder) som Lisp baseret på M-udtryk. Nogle andre programmeringssprog, såsom Dylan og Ruby , låner meget fra Lisp, men bruger en ALGOL -lignende syntaks, der adskiller sig fra både S-udtryk og M-udtryk.

Der er også en Common Lisp -implementering af M-LISP-fortolkeren , der også evaluerer M-udtryk.

Indstillinger

Syntaksen for det funktionelle sprog ML ( engelsk  Metalanguage , "metalanguage" ) ligner syntaksen for M-udtryk ( "metaudtryk" ), den er også baseret på matematisk notation. Tilstedeværelsen af ​​yderligere begreber i ML, såsom typeanmærkninger og regulære udtryk, maskerer imidlertid denne lighed.

Syntaksen, i lighed med de originale M-udtryk, bruger sproget i Mathematica -systemet , lister i det er skrevet ved hjælp af parenteser (du kan også bruge M-udtryk notation til dem), og M-udtryk bruges til at skrive funktioner.

En nyere variation af dette tema er I-udtryk , hvor indrykning spiller rollen som implicitte parenteser (som i Python ). De er således en krydsning mellem S-udtryk og M-udtryk. I SRFI-forespørgsel sådanne I-udtryk foreslået som en ekstra syntaks for skemasproget men det blev ikke bredt vedtaget.

Links

Noter

  1. Implementeringen af ​​LISP . Hentet 28. februar 2010. Arkiveret fra originalen 2. marts 2013.
  2. アーカイブされたコピー(utilgængeligt link) . Hentet 2. september 2013. Arkiveret fra originalen 16. maj 2008.