Pure (programmeringsspråk)

Ren
Pure lang logo.png
Paradigm Funktionell , deklarativ , termomskrivning
Designad av Albert Gräf
Utvecklare Albert Gräf
Dök först upp 2008 ; 15 år sedan ( 2008 )
Stabil frisättning
0,68 / 11 april 2018 ; för 4 år sedan ( 2018-04-11 )
Maskinskrivningsdisciplin Stark , dynamisk
OS Cross-platform : FreeBSD , Linux , macOS , Windows
Licens GNU Lesser General Public License
Hemsida agraaf .github .io /pure-lang /
Influerad av
Q , Haskell , Lisp , Alice , MATLAB

Pure , efterföljaren till ekvationsspråket Q , är ett dynamiskt typat, funktionellt programmeringsspråk baserat på termomskrivning . Den har faciliteter för användardefinierad operatörssyntax , makron , aritmetik med godtycklig precision (tal med flera precision) och kompilering till inbyggd kod via LLVM . Pure är gratis och öppen källkod som distribueras (oftast) under GNU Lesser General Public License version 3 eller senare.

Pure kommer med en tolk och debugger, tillhandahåller automatisk minneshantering, har kraftfulla funktionella och symboliska programmeringsförmågor och gränssnitt till bibliotek i C (t.ex. för numeriska koder, lågnivåprotokoll och andra sådana uppgifter). Samtidigt är Pure ett litet språk designat från grunden; dess tolk är inte stor, och biblioteksmodulerna är skrivna i Pure. Syntaxen för Pure liknar den för Miranda och Haskell , men det är ett språk i fritt format och använder därför explicita avgränsare (snarare än regelindrag utanför sidan) för att beteckna programstruktur.

Det rena språket är en efterföljare till det ekvationella programmeringsspråket Q, som tidigare skapats av samma författare, Albert Gräf vid University of Mainz, Tyskland. I förhållande till Q erbjuder den några viktiga nya funktioner (som lokala funktioner med lexikal omfattning , effektivt vektor- och matrisstöd och det inbyggda C-gränssnittet) och program körs mycket snabbare eftersom de kompileras just-in-time till ursprunglig kod i farten. Pure är för närvarande mest inriktat på matematiska applikationer och vetenskaplig beräkning , men dess interaktiva tolkmiljö, C-gränssnittet och den växande uppsättningen tilläggsmoduler gör den lämplig för en mängd andra applikationer, såsom artificiell intelligens , symbolisk beräkning och realtid multimediabehandling.

Pure plug-ins finns tillgängliga för kalkylbladet Gnumeric och Miller Puckettes Pure Data grafiska multimediaprogramvara, som gör det möjligt att utöka dessa program med funktioner skrivna på Pure-språket. Gränssnitt tillhandahålls också som biblioteksmoduler till GNU Octave , OpenCV , OpenGL , GNU Scientific Library , FAUST , SuperCollider och liblo (för Open Sound Control (OSC)).

Exempel

Fibonacci-numren ( naiv version):

fib 0 = 0; fib 1 = 1; fib n = fib (n-2) + fib (n-1) om n>1;

Bättre ( svansrekursiv och linjär tid ) version:

fib n = fibs (0,1) n med fibs (a,b) n = om n<=0 så a else fibs (b,a+b) (n-1); slutet;

Beräkna de första 20 Fibonacci-talen:

kartfib (1..20);

En algoritm för n queens-problemet som använder en listförståelse för att organisera bakåtspårningssökningen:

queens n = sök n 1 [] med söknip = [omvänd p] om i>n; = katt [sök n (i+1) ((i,j):p) | j = 1..n; säker (i,j) p]; säker (i,j) p = ~alla (kontrollera (i,j)) p; check (i1,j1) (i2,j2) = i1==i2 || j1==j2 || i1+j1==i2+j2 || i1-j1==i2-j2; slutet;

Medan Pure använder ivrig utvärdering som standard, stöder den också lata datastrukturer som strömmar (lata listor ). Till exempel David Turners algoritm för att beräkna strömmen av primtal genom försöksdivision uttryckas i Pure:

primtal = sikt (2..inf) med sikt (p:qs) = p : sikt [q | q = qs; q mod p] &; slutet;

Användning av & -operatorn förvandlar siktens svans till en tunk för att fördröja dess beräkning. Tunken utvärderas implicit och lagras sedan (med anrop för behovsutvärdering ) när motsvarande del av listan nås, t.ex.

primtal!!(0..99); // ger de första 100 primtal

Pure har effektivt stöd för vektorer och matriser (liknande det för MATLAB och GNU Octave ), inklusive vektor- och matrisuppfattningar. Till exempel kan en Gaussisk elimineringsalgoritm med partiell svängning implementeras i Pure så här:

gauss_eliminering x::matris = p,x när n,m = dim x; p,_,x = vikl steg (0..n-1,0,x) (0..m-1) slut; steg (p,i,x) j = om max_x==0 så p,i,x annars // uppdaterad radpermutation och index: transp i max_i p, i+1, {// de översta raderna i matrisen förblir oförändrade : x!!(0..i-1,0..m-1); // pivotraden, dividerad med pivotelementet: {x!(i,l)/x!(i,j) | l=0..m-1}; // subtrahera lämpliga multipler av pivotraden: {{x!(k,l)-x!(k,j)*x!(i,l)/x!(i,j) | k=i+1..n-1; l=0..m-1}} när n,m = dim x; max_i, max_x = pivot i (kol xj); x = om max_x>0 så byt xi max_i annat x; sluta med pivot ix = foldl max (0,0) [j,abs (x!j)|j=i..#x-1]; max (i,x) (j,y) = om x

Som ett språk baserat på termomskrivning stöder Pure fullt ut symbolisk beräkning med uttryck. Här är ett exempel som visar användningen av lokala omskrivningsregler för att expandera och faktorisera enkla aritmetiska uttryck:

expandera = reducera med (a+b)*c = a*c+b*c; a*(b+c) = a*b+a*c; slutet; faktor = reducera med a*c+b*c = (a+b)*c; a*b+a*c = a*(b+c); slutet; expandera ((a+b)*2); // ger a*2+b*2 faktor (a*2+b*2); // ger (a+b)*2

Att anropa C -funktioner från Pure är väldigt enkelt. Följande importerar t.ex. puts -funktionen från C-biblioteket och använder den för att skriva ut strängen "Hello, world!" på terminalen:

  
   
 extern  int  sätter  (  char  *  );  hej  =  sätter  "Hej, värld!"  ;  hej  ; 

Se även

Anteckningar

externa länkar