Pure , sucesor del lenguaje de ecuaciones Q , es un lenguaje de programación funcional de tipado dinámico basado en la reescritura de términos . Tiene funciones para la sintaxis de operador definida por el usuario , macros , aritmética de precisión arbitraria (números de precisión múltiple) y compilación en código nativo a través de LLVM . Pure es un software gratuito y de código abierto distribuido (principalmente) bajo la GNU Lesser General Public License versión 3 o posterior.
Paradigma | Funcional , declarativa , reescritura plazo |
---|---|
Diseñada por | Albert Gräf |
Desarrollador | Albert Gräf |
Apareció por primera vez | 2008 |
Lanzamiento estable | 0,68 / 11 de abril de 2018 |
Disciplina de mecanografía | Fuerte , dinámico |
SO | Multiplataforma : FreeBSD , GNU / Linux , macOS , Windows |
Licencia | Licencia pública general reducida GNU |
Sitio web | agraef |
Influenciado por | |
Q, Haskell , Lisp , Alice , MATLAB |
Pure viene con un intérprete y depurador, proporciona administración automática de memoria, tiene poderosas habilidades de programación funcional y simbólica e interfaces para bibliotecas en C (por ejemplo, para números, protocolos de bajo nivel y otras tareas similares). Al mismo tiempo, Pure es un pequeño lenguaje diseñado desde cero; su intérprete no es grande y los módulos de la biblioteca están escritos en Pure. La sintaxis de Pure se parece a la de Miranda y Haskell , pero es un lenguaje de formato libre y, por lo tanto, utiliza delimitadores explícitos (en lugar de sangrías de reglas externas) para denotar la estructura del programa.
El lenguaje puro es un sucesor del lenguaje de programación ecuacional Q, creado previamente por el mismo autor, Albert Gräf en la Universidad de Mainz , Alemania. En relación con Q, ofrece algunas características nuevas importantes (como funciones locales con alcance léxico , soporte eficiente de vectores y matrices, y la interfaz C incorporada) y los programas se ejecutan mucho más rápido, ya que se compilan justo a tiempo en código nativo. sobre la marcha. Pure está dirigido principalmente a aplicaciones matemáticas y computación científica en la actualidad, pero su entorno de intérprete interactivo, la interfaz C y el creciente conjunto de módulos adicionales lo hacen adecuado para una variedad de otras aplicaciones, como inteligencia artificial , computación simbólica y tiempo real. procesamiento multimedia.
Los complementos Pure están disponibles para la hoja de cálculo Gnumeric y el software multimedia gráfico Pure Data de Miller Puckette , que hacen posible extender estos programas con funciones escritas en el lenguaje Pure. Las interfaces también se proporcionan como módulos de biblioteca para GNU Octave , OpenCV , OpenGL , la biblioteca científica GNU , FAUST , SuperCollider y liblo (para Open Sound Control (OSC)).
Ejemplos de
Los números de Fibonacci (versión ingenua):
fib 0 = 0;fib 1 = 1;fib n = fib (n-2) + fib (n-1) si n> 1;
Mejor versión ( tail-recursive y linear-time ):
fib n = fibs (0,1) n con fibs (a, b) n = si n <= 0 entonces a else fibs (b, a + b) (n-1);final;
Calcule los primeros 20 números de Fibonacci:
map fib (1..20);
Un algoritmo para el problema de n reinas que emplea una lista de comprensión para organizar la búsqueda de retroceso:
reinas n = buscar n 1 [] con nip de búsqueda = [revertir p] si i> n; = gato [buscar n (i + 1) ((i, j): p) | j = 1..n; seguro (i, j) p]; seguro (i, j) p = ~ cualquiera (verifique (i, j)) p; comprobar (i1, j1) (i2, j2) = i1 == i2 || j1 == j2 || i1 + j1 == i2 + j2 || i1-j1 == i2-j2;final;
Si bien Pure usa la evaluación ansiosa de forma predeterminada, también admite estructuras de datos perezosas como transmisiones ( listas perezosas ). Por ejemplo, el algoritmo de David Turner [1] para calcular el flujo de números primos por división de prueba se puede expresar en puro:
primes = tamiz (2..inf) con tamiz (p: qs) = p: tamiz [q | q = qs; q mod p] &;final;
El uso del &
operador convierte la cola del tamiz en un thunk para retrasar su cálculo. El procesador se evalúa implícitamente y luego se memoriza (utilizando la evaluación de llamada por necesidad ) cuando se accede a la parte correspondiente de la lista, por ejemplo:
primos !! (0..99); // produce los primeros 100 primos
Pure tiene un soporte eficiente para vectores y matrices (similar al de MATLAB y GNU Octave ), incluidas las comprensiones de vectores y matrices. Por ejemplo, un algoritmo de eliminación gaussiano con pivoteo parcial se puede implementar en Pure así:
eliminación_gauss x :: matriz = p, xcuando n, m = dim x; p, _, x = paso de pliegue (0..n-1,0, x) (0..m-1) fin;paso (p, i, x) j= si max_x == 0 entonces p, i, x si no // Permutación e índice de fila actualizados: transp i max_i p, i + 1, {// las filas superiores de la matriz permanecen sin cambios: x !! (0..i-1,0..m-1); // la fila pivote, dividida por el elemento pivote: {x! (i, l) / x! (i, j) | l = 0..m-1}; // restar los múltiplos adecuados de la fila pivote: {{x! (k, l) -x! (k, j) * x! (i, l) / x! (i, j) | k = i + 1..n-1; l = 0..m-1}}Cuándo n, m = dim x; max_i, max_x = pivote i (col xj); x = si max_x> 0 entonces intercambia xi max_i else x;terminar con pivote ix = foldl max (0,0) [j, abs (x! j) | j = i .. # x-1]; max (i, x) (j, y) = si xfinal;/ * Intercambia las filas i y j de la matriz x. * /intercambiar xij = x !! (transp ij (0..n-1), 0..m-1) cuando n, m = dim x end;/ * Aplicar una transposición a una permutación. * /transp ijp = [p! tr k | k = 0 .. # p-1]con tr k = si k == i entonces j si no k == j entonces i si no k final;/* Ejemplo: */sea x = dmatriz {2,1, -1,8; -3, -1,2, -11; -2,1,2, -3};X; gauss_elimination x;
Como lenguaje basado en la reescritura de términos , Pure es totalmente compatible con el cálculo simbólico con expresiones. A continuación, se muestra un ejemplo que muestra el uso de reglas de reescritura locales para expandir y factorizar expresiones aritméticas simples:
expandir = reducir con (a + b) * c = a * c + b * c; a * (b + c) = a * b + a * c;final;factor = reducir con a * c + b * c = (a + b) * c; a * b + a * c = a * (b + c);final;expandir ((a + b) * 2); // da como resultado a * 2 + b * 2factor (a * 2 + b * 2); // produce (a + b) * 2
Llamar a funciones C desde Pure es muy fácil. Por ejemplo, lo siguiente importa la puts
función de la biblioteca C y la usa para imprimir la cadena "Hello, world!"
en el terminal:
int extern pone ( char * ); hola = pone "¡Hola, mundo!" ; hola ;
Ver también
- Programación funcional
- Lenguajes funcionales
- Clean (lenguaje de programación)
Referencias
- Albert Gräf. "Procesamiento de señales en el lenguaje de programación puro". Conferencia de audio de Linux 2009 .
- Michael Riepe. "Pure - eine einfache funktionale Sprache" . Heise .
- "Entrevista con Albert Gräf" . blueparen.
Notas
- ^ Turner, manual de idioma de David A. SASL. Tech. rept. CS / 75/1. Departamento de Ciencias Computacionales, Universidad de St. Andrews 1975.
enlaces externos
- Página web oficial
- Documentación de biblioteca y lenguaje puro
- Referencia rápida pura
- Imprimación pura