Nial (de "Nested Interactive Array Language") es un lenguaje de programación de arreglos de alto nivel desarrollado aproximadamente en 1981 por Mike Jenkins de Queen's University , Kingston, Ontario , Canadá. Jenkins co-creó el algoritmo Jenkins-Traub .
Paradigma | formación |
---|---|
Diseñada por | Mike Jenkins |
Desarrollador | Nial Systems Ltd |
Apareció por primera vez | 1981 |
Lanzamiento estable | 6.3 / agosto de 2006 |
Disciplina de mecanografía | dinámica |
Sitio web | github |
Implementaciones importantes | |
Q'Nial | |
Influenciado por | |
APL , Lisp |
Nial combina una notación de programación funcional para matrices basada en una teoría de matrices desarrollada por Trenchard More con conceptos de programación estructurada para datos numéricos, de caracteres y simbólicos.
Se utiliza con mayor frecuencia para la creación de prototipos e inteligencia artificial .
Q'Nial
En 1982, Jenkins formó una empresa (Nial Systems Ltd) para comercializar el lenguaje y la implementación Q'Nial de Nial. A partir de 2014, el sitio web de la empresa admite un proyecto de código abierto para el software Q'Nial con el binario y la fuente disponibles para descargar. Su licencia se deriva de Artistic License 1.0 , las únicas diferencias son el preámbulo, la definición de "Titular de los derechos de autor" (que se cambia de "quien sea nombrado en los derechos de autor o los derechos de autor del paquete" a "NIAL Systems Limited"), y una instancia de "quienquiera" (que se cambia a "quienquiera").
Conceptos niales
Nial usa una teoría de matrices generalizada y expresiva en su versión 4, pero sacrificó algo de la generalidad del modelo funcional y modificó la teoría de matrices en la versión 6. Sólo la versión 6 está disponible ahora.
Nial define todos sus tipos de datos como matrices rectangulares anidadas. ints, booleanos, chars, etc. se consideran una matriz solitaria o una matriz que contiene un solo miembro. Las propias matrices pueden contener otras matrices para formar estructuras arbitrariamente profundas. Nial también proporciona Records. Se definen como una estructura de matriz no homogénea.
Las funciones en Nial se denominan Operaciones. Del manual de Nial: "Una operación es un objeto funcional que recibe una matriz de argumentos y devuelve una matriz de resultados. El proceso de ejecutar una operación dándole un valor de argumento se llama una llamada de operación o una aplicación de operación".
Aplicación de operaciones
Nial, como otros lenguajes derivados de APL, permite la unificación de operaciones y operadores binarios. Por lo tanto, las notaciones siguientes tienen el mismo significado. Nota: sum
es igual que+
Operación binaria:
2 + 3 2 suma 3
Notación de matriz:
+ [2,3]suma [2,3]
Notación de hebra:
+ 2 3suma 2 3
Notación agrupada:
+ (2 3)suma (2 3)
Nial también usa transformadores que son funciones de orden superior. Usan la operación de argumento para construir una nueva operación modificada.
dos veces es transformador f (ff) dos veces descanso [4, 5, 6, 7, 8] | 6 7 8
Atlas
Un atlas en Nial es una operación compuesta por una serie de operaciones de componentes. Cuando se aplica un atlas a un valor, cada elemento del atlas se aplica a su vez al valor para proporcionar un resultado final. Esto se utiliza para proporcionar un estilo de definiciones sin puntos (sin variables). También lo utilizan los transformadores. En los siguientes ejemplos, 'inner [+, *]', la lista '[+, *]' es un atlas.
Ejemplos de
Creando arreglos
cuenta 6| 1 2 3 4 5 6
Las matrices también pueden ser literales
Arr: = [5, 6, 7, 8, 9]| 5 6 7 8 9
La forma proporciona las dimensiones de la matriz y la remodelación se puede utilizar para remodelar las dimensiones.
forma Arr| 5
a: = 2 3 remodelar Arr# reshape es una operación binaria con dos argumentos. También se puede escribir en prefijo como# a: = remodelar [[2,3], Arr]| 5 6 7| 8 9 5
b: = 3 2 remodelar Arr| 5 6| 7 8| 9 5
a interior [+, *] b| 130 113| 148 145
Calcular un promedio
Las definiciones tienen la forma '
el promedio es / [suma, recuento] Arr promedio| 7.
Calcular un factorial
hecho es recurrente [0 =, 1 primero, pase, producto, -1 +]hecho 4| 24
Invertir una matriz
rev es remodelado [forma, a través de [pasar, pasar, conversar anexar]]rev [1, 2, 3, 4]| 4 3 2 1
Generando primos
Contraste con APL
primos es sublista [cada (2 = suma cada derecho (0 = mod) [pasa, cuenta]), pasa] cuenta de descansoprimos 10| 2 3 5 7
Explicación
Comprobación de la divisibilidad de A por Bis_divisible es 0 = mod [A, B]
Definición del filtro is_prime
is_prime es 2 = suma cada derecho es_divisible [pasar, contar]
El recuento genera una matriz [1..N] y el paso es N (operación de identidad). eachright aplica is_divisible (pase, elemento) en cada elemento de la matriz generada por recuento. Por lo tanto, esto transforma la matriz generada por recuento en una matriz donde los números que pueden dividir N se reemplazan por '1' y otros por '0'. Por lo tanto, si el número N es primo, la suma [matriz transformada] debe ser 2 (él mismo y 1).
Ahora todo lo que queda es generar otra matriz usando el recuento N y filtrar todos los que no son primos.
primes es sublista [cada es_prime, pasa] cuenta de descanso
Ordenación rápida
link
une sus matrices de argumentossublist
[A, B] devuelve una lista de elementos de B elegidos de acuerdo con la lista de valores booleanos dada en A, seleccionando aquellos elementos de B donde el elemento correspondiente de A es verdadero.- En un
Fork
[A, B, C] X, la primera A es un predicado, y si A (X) es verdadero, entonces se devuelve B (X) en caso contrario, se devuelve C (X). Pass
es una operación de identidad para matrices.
ordenación rápida es la bifurcación [> = [1 primero, recuento], aprobar, Enlace [ sublista de clasificación rápida [<[pasa, primero], pasa], sublista [coincidir [aprobar, primero], aprobar], sublista de clasificación rápida [> [aprobar, primero], aprobar] ]]
Utilizándolo:
ordenación rápida [5, 8, 7, 4, 3]| 3 4 5 7 8