stringtranslate.com

Puro (lenguaje de programación)

Pure , sucesor del lenguaje ecuacional Q , es un lenguaje de programación funcional y de tipado dinámico basado en la reescritura de términos . Tiene funciones para sintaxis de operadores definidos por el usuario , macros , aritmética de precisión arbitraria (números de precisión múltiple) y compilación a código nativo a través de LLVM . Pure es un software libre y de código abierto distribuido (en su mayoría) bajo la Licencia Pública General Reducida de GNU versión 3 o posterior.

Descripción general

Pure viene con un intérprete y un depurador , proporciona administración automática de memoria , tiene potentes capacidades de programación funcional y simbólica e interfaces con bibliotecas en C (por ejemplo, para números, protocolos de bajo nivel y otras tareas similares). Al mismo tiempo, Pure es un lenguaje pequeño 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 fuera de lugar ) para denotar la estructura del programa.

El lenguaje Pure es un sucesor del lenguaje de programación ecuacional Q, creado previamente por el mismo autor, Albert Gräf en la Universidad de Maguncia , 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 a código nativo sobre la marcha. Pure está orientado 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 complementarios lo hacen adecuado para una variedad de otros usos, como inteligencia artificial , computación simbólica y procesamiento multimedia en tiempo real.

Existen complementos Pure para la hoja de cálculo Gnumeric y el software gráfico multimedia Pure Data de Miller Puckette , que permiten ampliar estos programas con funciones escritas en el lenguaje Pure. También se proporcionan interfaces 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

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 ;               

Versión mejorada ( recursiva de cola y de tiempo lineal ):

fib n = fibs ( 0 , 1 ) n con fibs ( a , b ) n = si n <= 0 entonces a de lo contrario fibs ( b , a + b ) ( n - 1 ); fin ;                  

Calcular los primeros 20 números de Fibonacci:

mapa fib ( 1..20 );  

Un algoritmo para el problema de las n reinas que emplea una comprensión de lista para organizar la búsqueda hacia atrás:

reinas n = buscar n 1 [] con buscar n i p = [ invertir p ] si i > n ; = gato [ buscar n ( i + 1 ) (( i , j ) : p ) | j = 1. . n ; seguro ( i , j ) p ]; seguro ( i , j ) p = ~ cualquiera ( comprobar ( i , j )) p ; comprobar ( i1 , j1 ) ( i2 , j2 ) = i1 == i2 || j1 == j2 || i1 + j1 == i2 + j2 || i1 - j1 == i2 - j2 ; fin ;                                                

Si bien Pure utiliza la evaluación diligente de manera predeterminada, también admite estructuras de datos perezosas como secuencias ( listas perezosas ). Por ejemplo, el algoritmo de David Turner [1] para calcular la secuencia de números primos por división de prueba se puede expresar en Pure:

primos = tamiz ( 2. . inf ) con tamiz ( p : qs ) = p : tamiz [ q | q = qs ; q mod p ] & ; fin ;                   

El uso del &operador convierte la cola del tamiz en un fragmento para retrasar su cálculo. El fragmento se evalúa de forma implícita y luego se memoriza (mediante 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 gaussiana con pivoteo parcial se puede implementar en Pure de la siguiente manera:

eliminación_de_gauss x :: matriz = p , x cuando n , m = dim x ; p ,_, x = foldl paso ( 0. . n - 1 , 0 , x ) ( 0. . m - 1 ) fin ;              paso ( p , i , x ) j = si máx_x == 0 entonces p , i , x de lo contrario // permutación de fila actualizada e índice: transp i máx_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 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 }} cuando n , m = dim x ; max_i , max_x = pivot i ( col x j ); x = si max_x > 0 entonces intercambia x i max_i de lo contrario x ; termina con pivot i x = foldl max ( 0 , 0 ) [ j , abs ( x ! j ) | j = i.. # x                                                                 - 1 ]; máx ( i , x ) ( j , y ) = si x < y entonces j , y de lo contrario i , x ; fin ;          /* Intercambia las filas i y j de la matriz x. */intercambiar x i j = x !! ( transp i j ( 0. . n - 1 ) , 0. . m - 1 ) cuando n , m = dim x fin ;              /*Aplicar una transposición a una permutación. */transp i j p = [ p ! tr k | k = 0. .# p - 1 ] con tr k = si k == i entonces j de lo contrario si k == j entonces i de lo contrario k fin ;                       /* Ejemplo: */sea ​​x = dmatrix { 2 , 1 ,- 1 , 8 ; - 3 ,- 1 , 2 ,- 11 ; - 2 , 1 , 2 ,- 3 }; x ; eliminación_de_gauss x ;        

Como lenguaje basado en la reescritura de términos , Pure admite totalmente el cálculo simbólico con expresiones. A continuación, se muestra un ejemplo que muestra el uso de reglas de reescritura local 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 ; fin ;         factor = reducir con a * c + b * c = ( a + b ) * c ; a * b + a * c = a * ( b + c ); fin ;         expandir (( a + b ) * 2 ); // produce a*2+b*2 factorizar ( a * 2 + b * 2 ); // produce (a+b)*2    

Llamar a funciones de C desde Pure es muy fácil. Por ejemplo, para un programa "¡Hola mundo!" , lo siguiente importa la putsfunción desde la biblioteca de C y la utiliza para imprimir la cadena "Hello, world!"en la terminal:

extern int puts ( char * ); hola = puts "¡Hola, mundo!" ; hola ;     

Véase también

Referencias

Notas

  1. ^ Turner, David A. Manual del lenguaje SASL. Informe técnico CS/75/1. Departamento de Ciencias Computacionales, Universidad de St. Andrews 1975.

Enlaces externos