stringtranslate.com

Sintaxis y símbolos de APL

El lenguaje de programación APL se distingue por ser simbólico en lugar de léxico : sus primitivos se denotan mediante símbolos , no palabras. Estos símbolos se idearon originalmente como una notación matemática para describir algoritmos. [1] Los programadores de APL a menudo asignan nombres informales cuando hablan de funciones y operadores (por ejemplo, "producto" para ×/), pero las funciones y operadores básicos que proporciona el lenguaje se denotan mediante símbolos no textuales.

Funciones monádicas y diádicas

La mayoría de los símbolos denotan funciones u operadores . Una función monádica toma como argumento el resultado de evaluar todo lo que se encuentra a su derecha (moderado de la forma habitual mediante paréntesis). Una función diádica tiene otro argumento, el primer elemento de datos a su izquierda. Muchos símbolos denotan funciones tanto monádicas como diádicas, interpretadas según el uso. Por ejemplo, ⌊3.2 da 3, el entero más grande que no está por encima del argumento, y 3⌊2 da 2, el menor de los dos argumentos.

Funciones y operadores

APL utiliza el término operador en el sentido de Heaviside como moderador de una función en oposición al uso del mismo término en otros lenguajes de programación como algo que opera sobre datos, ref. operador relacional y operadores en general . Otros lenguajes de programación también usan a veces este término indistintamente con función , sin embargo, ambos términos se usan en APL de manera más precisa. [2] [3] [4] [5] [6] Las primeras definiciones de los símbolos de APL eran muy específicas sobre cómo se categorizaban los símbolos. [7] Por ejemplo, el operador reduce se denota por una barra diagonal y reduce una matriz a lo largo de un eje interponiendo su función operando . Un ejemplo de reduce :

En el caso anterior, el operador de reducción o barra modera la función de multiplicación . La expresión ×/2 3 4 se evalúa como un resultado escalar (solo 1 elemento) obtenido al reducir una matriz mediante la multiplicación. El caso anterior se simplifica: imagine multiplicar (sumar, restar o dividir) más de unos pocos números. (A partir de un vector, ×/ devuelve el producto de todos sus elementos).


Los ejemplos de funciones diádicas anteriores [ejemplos izquierdo y derecho] (usando el mismo símbolo / , ejemplo derecho) demuestran cómo los valores booleanos (0 y 1) se pueden usar como argumentos izquierdos para las funciones \ expand y / replicate para producir resultados exactamente opuestos. En el lado izquierdo, el vector de 2 elementos {45 67} se expande donde aparecen 0 booleanos para dar como resultado un vector de 3 elementos {45 0 67} — note cómo APL insertó un 0 en el vector. Por el contrario, ocurre exactamente lo opuesto en el lado derecho — donde un vector de 3 elementos se convierte en solo 2 elementos; los 0 booleanos eliminan elementos usando la función de barra diagonal / diádica . Los símbolos APL también operan en listas (vector) de elementos usando tipos de datos distintos a los numéricos, por ejemplo, un vector de 2 elementos de cadenas de caracteres {"Manzanas" "Naranjas"} podría sustituirse por el vector numérico {45 67} anterior.

Reglas de sintaxis

En APL, la jerarquía de precedencia de funciones u operadores es estrictamente posicional: las expresiones se evalúan de derecha a izquierda. APL no sigue la precedencia de operadores habitual de otros lenguajes de programación; por ejemplo, ×no vincula sus operandos de forma más "estrecha" que +. En lugar de la precedencia de operadores, APL define una noción de ámbito .

El alcance de una función determina sus argumentos . Las funciones tienen un alcance derecho largo : es decir, toman como argumentos derechos todo lo que se encuentra a su derecha. Una función diádica tiene un alcance izquierdo corto : toma como argumentos izquierdos el primer dato a su izquierda. Por ejemplo, (la columna más a la izquierda a continuación es el código de programa real de una sesión de usuario de APL , con sangría = entrada real del usuario , sin sangría = resultado devuelto por el intérprete de APL ):


Un operador puede tener operandos de función o de datos y evaluar una función diádica o monádica. Los operadores tienen un alcance izquierdo largo. Un operador toma como operando izquierdo la función más larga a su izquierda. Por ejemplo:

El operando izquierdo del operador sobre-cada¨ es la función de índice ⍳ . La función derivada ⍳¨ se utiliza monádicamente y toma como su operando derecho el vector 3 3. El alcance izquierdo de each termina con el operador reduce , denotado por la barra diagonal . Su operando izquierdo es la expresión de función a su izquierda: el producto externo de la función equals . El resultado de ∘.=/ es una función monádica. Con el alcance derecho largo habitual de una función, toma como argumento derecho el resultado de ⍳¨3 3. Por lo tanto



Funciones monádicas

Funciones diádicas

Operadores e indicador de eje

Notas: Los operadores de reducción y escaneo esperan una función diádica a su izquierda, formando una función compuesta monádica aplicada al vector a su derecha.

El operador de producto "." espera una función diádica tanto a su izquierda como a su derecha, formando una función compuesta diádica aplicada a los vectores a su izquierda y a su derecha. Si la función a la izquierda del punto es "∘" (que significa nulo), entonces la función compuesta es un producto externo; de lo contrario, es un producto interno. Un producto interno destinado a la multiplicación de matrices convencional utiliza las funciones + y ×; reemplazarlas con otras funciones diádicas puede dar como resultado operaciones alternativas útiles.

Algunas funciones pueden ir seguidas de un indicador de eje entre corchetes (cuadrados), es decir, este aparece entre una función y una matriz y no debe confundirse con los subíndices de matriz escritos después de una matriz. Por ejemplo, dada la función ⌽ (inversión) y una matriz bidimensional, la función opera de forma predeterminada a lo largo del último eje, pero esto se puede cambiar utilizando un indicador de eje:


Como caso particular, si la función catenada diádica "," es seguida por un indicador de eje (o modificador de eje para un símbolo/función), se puede utilizar para laminar (interponer) dos matrices dependiendo de si el indicador de eje es menor o mayor que el origen del índice [8] (origen del índice = 1 en la siguiente ilustración):

Matrices anidadas

Los arreglos son estructuras que tienen elementos agrupados linealmente como vectores o en forma de tabla como matrices —y dimensiones superiores (3D o al cubo, 4D o al cubo en el tiempo , etc.). Los arreglos que contienen caracteres y números se denominan arreglos mixtos . [9] Las estructuras de arreglos que contienen elementos que también son arreglos se denominan arreglos anidados . [10]

Control de flujo

Un usuario puede definir funciones personalizadas que, al igual que las variables, se identifican por su nombre en lugar de por un símbolo no textual. El encabezado de la función define si una función personalizada es niládica (sin argumentos), monádica (un argumento a la derecha) o diádica (argumentos a la izquierda y a la derecha), el nombre local del resultado (a la izquierda de la flecha de asignación ← ) y si tiene alguna variable local (cada una separada por punto y coma ';').

La implementación define si las funciones con el mismo identificador pero diferente adicidad son distintas. Si se permite, se podría definir una función CURVEAREA dos veces para reemplazar tanto a CIRCLEAREA monádica como a SEGMENTAREA diádica anteriores, y la función monádica o diádica se seleccionaría según el contexto en el que se hizo referencia a ella.

Las funciones diádicas personalizadas se pueden aplicar normalmente a parámetros con las mismas convenciones que las funciones integradas, es decir, las matrices deben tener la misma cantidad de elementos o una de ellas debe tener un único elemento que se extienda. Existen excepciones a esto; por ejemplo, una función para convertir la moneda del Reino Unido predecimal a dólares esperaría tomar un parámetro con exactamente tres elementos que representen libras, chelines y peniques. [11]

Dentro de un programa o una función personalizada, el control puede transferirse condicionalmente a una declaración identificada por un número de línea o una etiqueta explícita; si el objetivo es 0 (cero), esto finaliza el programa o regresa al llamador de una función. La forma más común utiliza la función de compresión APL, como en la plantilla (condición)/objetivo, que tiene el efecto de evaluar la condición a 0 (falso) o 1 (verdadero) y luego usar eso para enmascarar el objetivo (si la condición es falsa, se ignora, si es verdadera, se deja así, por lo que se transfiere el control).

Por lo tanto, la función SEGMENTAREA puede modificarse para abortar (justo debajo), devolviendo cero si los parámetros (GRADOS y RADIO a continuación) son de signo diferente :

ÁREA GRADOS SEGMENTAREA RADIO ; FRACCIÓN ; CA ; SIGNO ⍝ variables locales denotadas por punto y coma(;) FRACCIÓN GRADOS ÷ 360 CA CIRCLEAREA RADIO ⍝ esta declaración de código APL llama a la función de usuario CIRCLEAREA, definida anteriormente. SIGNO ( × GRADOS ) ≠× RADIO ⍝ << Lógica APL PRUEBA/determina si GRADOS y RADIO NO tienen (≠ usado) el mismo SIGNO 1-sí diferente(≠), 0-no(mismo signo) ÁREA 0 ⍝ valor predeterminado de ÁREA establecido = cero SIGNO / 0 ⍝ ramificación(aquí, saliendo) ocurre cuando SIGNO=1 mientras que SIGNO=0 NO se ramifica a 0. La ramificación a 0 sale de la función. ÁREA FRACCIÓN × CA                      

La función SEGMENTAREA anterior funciona como se espera si los parámetros son escalares o matrices de un solo elemento , pero no si son matrices de múltiples elementos , ya que la condición termina basándose en un solo elemento de la matriz SIGN; por otro lado, la función de usuario podría modificarse para manejar correctamente los argumentos vectorizados. El funcionamiento a veces puede ser impredecible, ya que APL define que las computadoras con capacidades de procesamiento de vectores deben paralelizar y pueden reordenar las operaciones de matriz en la medida de lo posible; por lo tanto, pruebe y depure las funciones de usuario , particularmente si se usarán con argumentos vectoriales o incluso matriciales. Esto afecta no solo la aplicación explícita de una función personalizada a matrices, sino también su uso en cualquier lugar donde una función diádica pueda usarse razonablemente, como en la generación de una tabla de resultados:

 90 180 270 ¯90 ∘. ÁREA SEGMENTADA 1 ¯2 4 0 0 0 0 0 0 0 0 0 0 0 0               

Una forma más concisa y, a veces, mejor, de formular una función es evitar las transferencias explícitas de control y, en su lugar, utilizar expresiones que se evalúen correctamente en todas las condiciones o en las condiciones esperadas. A veces es correcto dejar que una función falle cuando uno o ambos argumentos de entrada son incorrectos , precisamente para que el usuario sepa que uno o ambos argumentos utilizados eran incorrectos. La siguiente función es más concisa que la anterior, SEGMENTAREA. Lo que sigue es importante porque maneja correctamente los argumentos vectorizados:

 ÁREA GRADOS ÁREA SEGMENTAL RADIO ; FRACCIÓN ; CA ; SIGNO FRACCIÓN GRADOS ÷ 360 CA ← ÁREA CIRCULAR RADIO SIGNO ( × GRADOS ) ≠× RADIO ÁREA FRACCIÓN × CA ×~ SIGNO ⍝ esta declaración APL es más compleja, como una línea, pero resuelve argumentos vectorizados: una compensación: complejidad versus ramificación                  90 180 270 ¯90 ∘. ÁREA SEGMENTARIA 1 ¯2 4 0,785398163 0 12,5663706 1,57079633 0 25,1327412 2,35619449 0 37,6991118 0 ¯3,14159265 0               

Evitar transferencias explícitas de control, también llamadas ramificaciones, si no se revisan o controlan cuidadosamente, puede promover el uso de frases hechas excesivamente complejas , verdaderos "modismos complejos e incomprendidos" y un estilo de "solo escritura", que ha hecho poco para que APL se gane el aprecio de comentaristas influyentes como Edsger Dijkstra . [12] Sin embargo, por el contrario, los modismos de APL pueden ser divertidos, educativos y útiles, si se usan con comentarios útiles ⍝ , por ejemplo, incluyendo la fuente y el significado y la función previstos del modismo o modismos. Aquí hay una lista de modismos de APL, una lista de modismos de IBM APL2 aquí [13] y una biblioteca de modismos de APL finlandés aquí.

Misceláneas

La mayoría de las implementaciones de APL admiten una serie de variables y funciones del sistema, generalmente precedidas por el carácter ⎕ (cuadrado) y/o ")" ( gancho = cerrar paréntesis). Tenga en cuenta que el carácter cuadrado no es lo mismo que el símbolo de carácter faltante de Unicode . Particularmente importante y ampliamente implementada es la variable ⎕IO ( Origen del índice ), ya que mientras que el IBM APL original basaba sus matrices en 1, algunas variantes más nuevas las basan en cero:

También hay funciones del sistema disponibles para los usuarios para guardar el espacio de trabajo actual, por ejemplo, )SAVE y finalizar el entorno APL, por ejemplo, )OFF - a veces llamados comandos o funciones de gancho debido al uso de un paréntesis derecho inicial o gancho. [16] Existe cierta estandarización de estas funciones cuádruples y de gancho.

Fuentes

El plano multilingüe básico de Unicode incluye los símbolos APL en el bloque técnico misceláneo [17], que por lo tanto suelen reproducirse con precisión a partir de las fuentes Unicode más grandes instaladas en la mayoría de los sistemas operativos modernos. Estas fuentes rara vez son diseñadas por tipógrafos familiarizados con los glifos APL. Por lo tanto, si bien son precisos, los glifos pueden parecer desconocidos para los programadores APL o ser difíciles de distinguir entre sí.

Algunas fuentes Unicode han sido diseñadas para mostrar bien APL: APLX Upright, APL385 Unicode y SimPL.

Antes de Unicode, los intérpretes APL se suministraban con fuentes en las que los caracteres APL se asignaban a posiciones menos utilizadas en los conjuntos de caracteres ASCII, normalmente en los 128 puntos de código superiores. Estas asignaciones (y sus variaciones nacionales) a veces eran exclusivas de cada intérprete de proveedor de APL, lo que hacía que la visualización de programas APL en la Web, en archivos de texto y manuales fuera a menudo problemática.

Asignación de funciones de teclado a símbolos en APL2

Teclado APL2

Tenga en cuenta la tecla de encendido/apagado de APL, la tecla superior derecha, justo debajo. Observe también que el teclado tenía unas 55 teclas de símbolos APL únicas (68 enumeradas según las tablas anteriores, incluidos los símbolos comparativos, pero varios símbolos aparecen tanto en las tablas monádicas como diádicas) (55 funciones (operadores) de APL se enumeran en el Manual de referencia de APL 5110 de IBM), por lo que con el uso de las teclas alt, shift y ctrl, teóricamente habría permitido un máximo de unas 59 (teclas) *4 (con pulsación de 2 teclas) *3 (con pulsación de tres teclas, por ejemplo, ctrl-alt-del) o unas 472 combinaciones de teclas máximas diferentes, acercándose al máximo de 512 caracteres EBCDIC (256 caracteres por 2 códigos para cada combinación de teclas). Nuevamente, en teoría, el teclado que se muestra aquí habría permitido la entrada de teclado de unos 472 símbolos/funciones APL diferentes, utilizados activamente. En la práctica, las primeras versiones solo utilizaban algo más o menos equivalente a 55 símbolos especiales de APL (excluyendo letras, números, puntuación, etc.). Por lo tanto, las primeras APL solo utilizaban alrededor del 11% (55/472) del potencial de utilización de un lenguaje simbólico en ese momento, según los límites de teclas del teclado, nuevamente excluyendo números, letras, puntuación, etc. En otro sentido, la utilización de símbolos del teclado estaba más cerca del 100%, altamente eficiente, ya que EBCDIC solo permitía 256 caracteres distintos y ASCII solo 128.

Resolviendo acertijos

APL ha demostrado ser extremadamente útil para resolver problemas matemáticos, varios de los cuales se describen a continuación.

Triángulo de Pascal

Tomemos el triángulo de Pascal , que es una matriz triangular de números en la que los que están en los extremos de las filas son 1 y cada uno de los otros números es la suma de los dos números más cercanos en la fila justo encima (el vértice, 1, está en la parte superior). La siguiente es una función de una línea de APL para representar visualmente el triángulo de Pascal:

 Pascal { 0 ~ ¨⍨ a ⌽⊃⌽∊ ¨ 0 , ¨¨ a ! ¨ a ⌽⍳ } ⍝ Crear una función de usuario de una línea llamada Pascal Pascal 7 ⍝ Ejecutar la función Pascal para siete filas y mostrar los resultados a continuación: 1 1 2 1 3 3 1 4 6 4 1 5 10 10 5 1 6 15 20 15 6 1 7 21 35 35 21 7                                      

Números primos, contra demostración mediante factores

Determinar la cantidad de números primos (el primo # es un número natural mayor que 1 que no tiene divisores positivos distintos de 1 y él mismo) hasta un número N. A Ken Iverson se le atribuye la siguiente solución APL de una línea al problema:

 ⎕CR 'PrimeNumbers' ⍝ Mostrar la función de usuario APL PrimeNumbers Primes PrimeNumbers N ⍝ La función toma un argumento N a la derecha (p. ej., mostrar números primos para 1 ... int N) Primes ( 2 =+ 0 = ( N ) ∘. |⍳ N ) / N ⍝ La oración de una línea de Ken Iverson PrimeNumbers 100 ⍝ Mostrar todos los números primos del 1 al 100 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 PrimeNumbers 100 25 ⍝ Hay veinticinco números primos en el rango hasta 100.                                   

Con frecuencia es necesario examinar el inverso u opuesto de una solución matemática ( factores enteros de un número ): demuestre que el subconjunto de números enteros del 1 al 15 no son primos enumerando sus factores de descomposición . ¿Cuáles son sus factores distintos de uno (números divisibles por, excepto 1)?

 ⎕CR 'ProveNonPrime' Z ProveNonPrime R ⍝Mostrar todos los factores de un entero R, excepto 1 y el número en sí, ⍝ es decir, demostrar que no es primo. Se devuelve la cadena 'prime' para un entero primo. Z ( 0 = ( R ) | R ) / R ⍝ Determinar todos los factores para el entero R, almacenar en Z Z ( ~ ( Z 1 , R )) / Z ⍝ Eliminar 1 y el número como factores para el número de Z. ( 0 =⍴ Z ) / ProveNonPrimeIsPrime ⍝ Si el resultado tiene forma cero, no tiene otros factores y, por lo tanto, es primo Z R , ( " factores (excepto 1) " ) , ( Z ) , ⎕TCNL ⍝ Mostrar el número R, sus factores (excepto 1, él mismo) y una nueva línea char 0 ⍝ Hecho con la función si no es primo ProveNonPrimeIsPrime : Z R , ( " primo" ) , La función ⎕TCNL ⍝ se ramifica aquí si el número es primo          ProveNonPrime ¨ 15 ⍝ Pruebe que no son primos para cada (¨) de los números enteros del 1 al 15 (iota 15) 1 primo 2 primo 3 primo 4 factores ( excepto 1 ) 2 5 primo 6 factores ( excepto 1 ) 2 3 7 primo 8 factores ( excepto 1 ) 2 4 9 factores ( excepto 1 ) 3 10 factores ( excepto 1 ) 2 5 11 primo 12 factores ( excepto 1 ) 2 3 4 6 13 primo 14 factores ( excepto 1 ) 2 7 15 factores ( excepto 1 ) 3 5                                                               

Secuencia de Fibonacci

Generar una secuencia de números de Fibonacci , donde cada número subsiguiente en la secuencia es la suma de los dos anteriores:

 ⎕CR 'Fibonacci' ⍝ Muestra la función Fibonacci FibonacciNum Fibonacci Nth ; IOwas ⍝ Encabezado de función, nombre de función=Fibonacci, función monádica con 1 argumento Nth en el lado derecho; variable local IOwas y un número devuelto. ⍝ Genera un número secuenciado de Fibonacci donde Nth es la posición # del número de Fibonacci en la secuencia. << descripción de la función IOwas ⎕IO ⎕IO 0 FibonacciNum 0 1 ↓↑+ . × / Nth / 2 2 1 1 1 0 ⎕IO IOwas ⍝ Para que esta función funcione correctamente, ⎕IO debe establecerse en cero.                 Fibonacci ¨ 14 ⍝ Esta declaración de APL dice: Generar la secuencia de Fibonacci sobre cada (¨) número entero (iota o ⍳) para los enteros 1..14. 0 1 1 2 3 5 8 13 21 34 55 89 144 233 ⍝ Secuencia generada, es decir, la secuencia de Fibonacci de números generada por el intérprete de APL.               

Lectura adicional

Véase también

Referencias

  1. ^ Iverson, Kenneth E. (1 de enero de 1962). "Un lenguaje de programación". Actas de la conferencia conjunta de informática de primavera del 1 al 3 de mayo de 1962 sobre - AIEE-IRE '62 (primavera) . Nueva York, NY, EE. UU.: ACM. págs. 345–351. doi : 10.1145/1460833.1460872 . S2CID  11777029.
  2. ^ Baronet, Dan. "Operadores de APL de Sharp". archive.vector.org.uk . Vector - Revista de la Asociación Británica de APL . Consultado el 13 de enero de 2015 .
  3. ^ MicroAPL. «Operadores primitivos». www.microapl.co.uk . MicroAPL . Consultado el 13 de enero de 2015 .
  4. ^ MicroAPL. «Operadores». www.microapl.co.uk . MicroAPL . Consultado el 13 de enero de 2015 .
  5. ^ Progopedia. "APL". progopedia.com . Progopedia . Consultado el 13 de enero de 2015 .
  6. ^ Dyalog. «Funciones D y operadores agrupados libremente en categorías». dfns.dyalog.com . Dyalog . Consultado el 13 de enero de 2015 .
  7. ^ IBM. "Manual de referencia de IBM 5100 APL" (PDF) . bitsavers.trailing-edge.com . IBM. Archivado desde el original (PDF) el 14 de enero de 2015 . Consultado el 14 de enero de 2015 .
  8. ^ Brown, Jim (1978). "En defensa del origen del índice 0". ACM SIGAPL APL Quote Quad . 9 (2): 7. doi : 10.1145/586050.586053 . S2CID  40187000.
  9. ^ MicroAPL. "Manual del lenguaje APLX" (PDF) . www.microapl.co.uk . MicroAPL - Versión 5.0, junio de 2009. pág. 22. Consultado el 31 de enero de 2015 .
  10. ^ Benkard, J. Philip (1992). "Matrices anidadas y operadores: algunas cuestiones en profundidad". Actas de la conferencia internacional sobre APL - APL '92 . Vol. 23. págs. 7–21. doi : 10.1145/144045.144065 . ISBN 978-0897914772.S2CID 7760410  . {{cite book}}: |journal=ignorado ( ayuda )
  11. ^ Berry, Paul "Texto introductorio para estudiantes sobre APL\360", IBM Research, Centro de investigación Thomas J. Watson, 1969.
  12. ^ "Tratado" (PDF) . www.cs.utexas.edu . Consultado el 10 de septiembre de 2019 .
  13. ^ Cason, Stan (13 de mayo de 2006). "APL2 Idioms Library". www-01.ibm.com . IBM . Consultado el 1 de febrero de 2015 .
  14. ^ El "menos alto" de APL se aplica al número único que sigue, mientras que la función menos monádica cambia el signo de toda la matriz a su derecha.
  15. ^ "El espacio de trabajo: funciones del sistema". Microapl.co.uk. pág. (hacia la parte inferior de la página web) . Consultado el 5 de noviembre de 2018 .
  16. ^ "Referencia del lenguaje APL" (PDF) . Consultado el 5 de noviembre de 2018 .
  17. ^ Cuadro Unicode "Información técnica miscelánea (incluida APL)" (PDF) .

Enlaces externos

Tutoriales genéricos en línea

Reglas de sintaxis