Sintaxis y símbolos de APL
El lenguaje de programación APL es distintivo al ser simbólico en lugar de léxico : sus primitivas se denotan por símbolos , no palabras. Estos símbolos se idearon originalmente como una notación matemática para describir algoritmos. Los programadores de APL a menudo asignan nombres informales al discutir funciones y operadores (por ejemplo, " Product " para ×/) pero las funciones y operadores centrales proporcionados por el idioma se denotan por símbolos no textuales.
Funciones monádicas y diádicas
La mayoría de los símbolos denotan las funciones o operadores . Una función monádica toma como argumento el resultado de evaluar todo a su derecho. (Moderado de la manera habitual por paréntesis.) Una función diádica tiene otro argumento, el primer elemento de datos a su izquierda. Muchos símbolos denotan funciones monádicas y diádicas, interpretadas según el uso. Por ejemplo, ⌊3.2 da 3, el entero más grande no por encima del argumento, y 3⌊2 da 2, el más bajo de los dos argumentos.
Funciones y operadores
APL usa el término operador en el sentido de Heaviside como moderador de una función en lugar de algún otro lenguaje de programación, el uso del mismo término que funciona en datos, ref. operador relacional y operadores en general. Otros lenguajes de programación también a veces usan este término indistintamente con función , sin embargo, ambos términos se usan en APL con mayor precisión. Las definiciones tempranas de los símbolos de APL fueron muy específicas sobre cómo se clasificaron los símbolos. Por ejemplo, el operador Reduce se denota mediante una barra de barra hacia adelante y reduce una matriz a lo largo de un eje al interponer su función operando . Un ejemplo de reducción:
×/2 3 4 24 | c) c) Equivalente resultados en APL " c) Reducir operador / utilizado a la izquierda | 2×3×4 24 |
En el caso anterior, el operador reduce o slash moderate moderados la función multiplicar . La expresión ×/2 3 4 se evalúa a un resultado escalar (1 elemento 1) a través de reduciendo una matriz por multiplicación. El caso anterior se simplifica, imagine multiplicar (agregar, restar o dividir) más que solo unos pocos números juntos. (De un vector, ×/ devuelve el producto de todos sus elementos).
1 0 1 045 67 45 0 67 | c) c) Opositor resultados en APL " c) Ampliación función dyadic \ utilizado a la izquierda Replicar función dyadic / usada a la derecha | 1 0 1/45 0 67 45 67 |
Los ejemplos de funciones diádicas anteriores [ejemplos izquierdo y derecho] (usando el mismo símbolo /, ejemplo de la derecha) demuestran cómo se pueden usar los valores booleanos (0 y 1). como argumentos izquierdos para que las funciones \ expand y / replicate produzcan resultados exactamente opuestos. En el lado izquierdo, el vector de 2 elementos {45 67} está expandido donde se producen ceros booleanos para dar como resultado un vector de 3 elementos { 45 0 67} — observe cómo APL insertó un 0 en el vector. Por el contrario, ocurre exactamente lo contrario en el lado derecho — donde un vector de 3 elementos se convierte en solo 2 elementos; booleanos 0 eliminar elementos usando la función diádica /barra. Los símbolos APL también operan en listas (vectores) de elementos que utilizan tipos de datos distintos de los numéricos, por ejemplo, un vector de 2 elementos de cadenas de caracteres {"Apples" "Naranjas"} podría sustituirse por el vector numérico {45 67} anterior.
Reglas de sintaxis
En APL, la jerarquía de precedencia para 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, × ya no vincula sus operandos "estrechamente" que
El alcance de una función determina sus argumentos. Las funciones tienen un alcance derecho largo: es decir, toman como argumento correcto todo lo que está a su derecha. Una función diádica tiene un alcance izquierdo corto: toma como argumento izquierdo 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):
1 . 2 ⌊ 3 × 4 - 5̄0.33333333333333 1 . 2 ⌊ 3 × ̄1̄0.33333333333333 1 . 2 ⌊ ̄3̄0.33333333333333 1 . ̄3̄0.33333333333333 | No hay padres y padres Paso 2) 3 veces -1 = -3. |
Un operador puede tener operandos de función o datos y evaluarse como una función diádica o monádica. Los operadores hace tiempo que abandonaron el ámbito. Un operador toma como operando izquierdo la función más larga a su izquierda. Por ejemplo:
3 3 1 0 0 1 0 0 0 1 | Subanálisis atómica o fragmentaria APL (APL)explicación completa): El diaeresis ̈ o mini dot significa repetición o sobre cada uno o realizar cada uno por separado Así que... Repeticiones de yota (en términos humanos, es decir, invertidos, el intérprete de APL lee 3 3 sobre cada uso de iota), concisamente: iota para cada 3. |
El operando izquierdo para el operador sobre cada ¨ es la función índice ⍳. La función derivada ⍳¨ se usa monádicamente y toma como operando derecho el vector 3 3. El alcance izquierdo de cada termina con el operador reducir, indicado por la barra diagonal. Su operando izquierdo es la expresión de función a su izquierda: el producto externo de la función igual. El resultado de ∘.=/ es una función monádica. Con el alcance largo derecho habitual de una función, toma como argumento derecho el resultado de ⍳¨3 3. Por lo tanto
(⍳3)(⍳3)1 2 3 1 2 3
(⍳3)∘=⍳31 0
0 1 0
0 0 1
31 2 3 1 2 3
3 31 0
0 1 0
0 0 1
|
La matriz de 1s y 0s producidos de forma similar por Las matrices de identidad son útiles para resolver determinantes de matriz, grupos de ecuaciones lineales y regresión múltiple. |
im ← ∘.=⍨∘⍳ im 3 1 0 0 0 1 0 0 0 1 | Algunos intérpretes de la APL apoyan a compose operator ∘ y el operador de comunicaciones ⍨. El primero ∘ pegamentos funciones juntas para que foobarbar, por ejemplo, podría ser una función hipotética que aplica función definida Foo al resultado de la función definida bar; foo y barra pueden representar cualquiera función existente. En los casos en que una función dyadica es moderada por coma y luego utilizado monádicamente, su argumento derecho también se toma como su argumento izquierdo. Así, a derivada o compuesto función (nombre im a la izquierda) se utiliza en la sesión de usuario de la APL para devolver una matriz de identidad de 9 elementos utilizando su argumento derecho, parámetro o operand = 3. |
Cartas←"ABCDE" CartasABCDE ⍴Cartas5 FindIt←"CABS" FindItCABS ⍴FindIt4 Cartas ⍳ FindIt3 1 2 6 | Ejemplo utilizando APL índice ⍳ o encontrar (o no encontrar) elementos en un vector de carácter: Primero, variable Cartas se asigna un vector de 5 elementos, en este caso - letras del alfabeto. El forma ⍴ o carácter vector-longitud de Cartas 5. Variable FindIt se asigna lo que búsqueda dentro Cartas y su longitud es de 4 caracteres. 1 2 3 4 5 se realizaron posiciones vectoriales o índices en Cartas A la izquierda, función dyadica iota searches a través de su argumento izquierdo (Cartas) para la cadena de búsqueda (discusión derecha de yota, FindIt). Iota encuentra la letra "C" en la posición 3 en Cartas, encuentra "A" en la posición 1, y "B" en la posición 2. Iota ¿Sí? no encontrar letra "S" en cualquier lugar de variable Cartas así que devuelve el número 6 que es 1 mayor que la longitud de cartas. Iota encontrados "CAB" (3 1 2). Iota correctamente no encontrar "S" (6). |
Funciones monádicas
| Nombre(s) | Notación | Significado | Punto de código Unicode |
|---|---|---|---|
| Roll | ?B | Un entero seleccionado aleatoriamente desde el primer B enteros | U+003F ? CUESTIÓN MARCO |
| Ceiling | ⌈B | Menos entero mayor o igual a B | U+2308 ⌈ LEFT CEILING |
| Piso | ⌊B | Mayor entero menos que o igual a B | U+230A ⌊ LEFT FLOOR |
| Forma, Rho | ⍴B | Número de componentes en cada dimensión B | U+2374 ⍴ APL FUNCTIONAL SYMBOL RHO |
| No, Tilde. | ∼B | Lógica: | U+223C ♪ TILDE OPERATOR |
| Valor absoluto | ∣B | Magnitud de B | U+2223 ▪ DIVIDES |
| Generador de índice, Iota | ⍳B | Vector de la primera B enteros | U+2373 ⍳ APL FUNCTIONAL SYMBOL IOTA |
| Exponential | ⋆B | e a la B poder | U+22C6 ⋆ STAR OPERATOR |
| Negación | −B | Cambios signo de B | U+2212 − MINUS SIGN |
| Conjugado | +B | El complejo conjugado de B (Los números reales son devueltos sin cambios) | U+002B + PLUS SIGN |
| Signum | ×B | ̄1 si B0; 0 si B=0; 1 si B■0 | U+00D7 × MULTIPLICATION SIGN |
| Reciprocal | ÷B | 1 dividido por B | U+00F7 . DIVISION SIGN |
| Ravel, Catenate, Laminate | ,B | Reshapes B en un vector | U+002C , COMMA |
| Matriz inversa, Divideo de Cuádruplo Monádico | ⌹B | Inverso de matriz B | U+2339 ⌹ APL FUNCTIONAL SYMBOL QUAD DIVIDE |
| Pi veces | ○B | Multiply por π | U+25CB :: WHITE CIRCLE |
| Logarithm | ⍟B | Logaritmo natural de B | U+235F ⍟ APL FUNCTIONAL SYMBOL CIRCLE STAR |
| Reversal | ⌽B | Elementos inversos B en el último eje | U+233D ⌽ CTILES DE CIRCULA FUNCIONALES |
| Reversal | ⊖B | Elementos inversos B en el primer eje | U+2296 ⊖ MINUS CIRCLED |
| Grado arriba | ⍋B | Índices de B que organizará B en orden ascendente | U+234B ⍋ CTILE DELTA DE SYMBOL FUNCIONAL |
| Grado abajo | ⍒B | Índices de B que organizará B en orden descendente | U+2352 ⍒ APL FUNCTIONAL SYMBOL DEL STILE |
| Ejecutar | ⍎B | Ejecutar un APL expresión | U+234E ⍎ APL FUNCTIONAL SYMBOL DOWN TACK JOT |
| Formato monadic | ⍕B | Una representación de carácter B | U+2355 ⍕ APL FUNCTIONAL SYMBOL UP TACK JOT |
| Transposesión monádica | ⍉B | Invierte los ejes de B | U+2349 ▪ APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH |
| Factorial | !B | Producto de enteros 1 a B | U+0021 ! MARCO DE EXCLAMACIÓN |
| Profundidad | ≡B | Profundidad de anidación: 1 para una matriz sin contorno | U+2261 ↑ IDENTICAL TO |
| Cuadro | ⍪B | Marcas B en una tabla, un array de 2 dimensiones. | U+236A ⍪ APL FUNCTIONAL SYMBOL COMMA BAR |
Funciones diádicas
| Nombre(s) | Notación | Significado | Unicode punto |
|---|---|---|---|
| Añadir | A+B | Sum of A y B | U+002B + PLUS SIGN |
| Subtract | A−B | A menos B | U+2212 − MINUS SIGN |
| Multiply | A×B | A multiplicado por B | U+00D7 × MULTIPLICATION SIGN |
| Divide | A÷B | A dividido por B | U+00F7 . DIVISION SIGN |
| Exponentiation | A⋆B | A c B poder | U+22C6 ⋆ STAR OPERATOR |
| Circle | A○B | Funciones trigonométricas B seleccionado por AA=1: pecado(B) A=5: sinh(B) A=2: cos(B) A=6: cosh(B) A=3: tan(B) A=7: tanh(B) Los negativos producen el inverso de las funciones respectivas | U+25CB :: WHITE CIRCLE |
| Trato hecho | A?B | A distintos enteros seleccionados aleatoriamente de los primeros B enteros | U+003F ? CUESTIÓN MARCO |
| Miembros, Epsilon | A∈B | 1 para elementos de A presentes en B; 0 donde no. | U+2208 ▪ ELEMENTO DE |
| Encontrar, Epsilon Underbar | A⍷B | 1 para el punto de partida de la matriz de varios puntos A presentes en B; 0 donde no. | U+2377 ⍷ APL FUNCTIONAL SYMBOL EPSILON UNDERBAR |
| Maximum, Ceiling | A⌈B | El mayor valor de A o B | U+2308 ⌈ LEFT CEILING |
| Mínimo, Piso | A⌊B | El menor valor A o B | U+230A ⌊ LEFT FLOOR |
| Reshape, Dyadic Rho | A⍴B | Array of shape A con datos B | U+2374 ⍴ APL FUNCTIONAL SYMBOL RHO |
| Toma. | A↑B | Seleccione el primero (o último) A elementos de B según ×A | U+2191 ↑ UPWARDS ARROW |
| Suelta | A↓B | Quitar el primero (o último) A elementos de B según ×A | U+2193 ↓ DOWNWARDS ARROW |
| Decodificación | A⊥B | Valor de un polinomio cuyos coeficientes son B a A | U+22A5 ⊥ Arriba |
| Código | A⊤B | Base-A representación del valor B | U+22A4 ⊤ DOWN TACK |
| Residue | A∣B | B modulo A | U+2223 ▪ DIVIDES |
| Catenation | A,B | Elementos de B a los elementos A | U+002C , COMMA |
| Expansion, Dyadic Backslash | A\B | Insertar ceros (o blancos) en B correspondiente a ceros en A | U+005C \ REVERSE SOLIDUS |
| Compresión, Dyadic Slash | A/B | Seleccione elementos B correspondientes a los A | U+002F / SOLIDUS |
| Index of, Dyadic Iota | A⍳B | La ubicación (índice) de B dentro A; 1+⍴A si no se encuentra
| U+2373 ⍳ APL FUNCTIONAL SYMBOL IOTA |
| Divide la matriz, Dyadic Quad Divide | A⌹B | Solución al sistema de ecuaciones lineales, regresión múltiple Ax = B | U+2339 ⌹ APL FUNCTIONAL SYMBOL QUAD DIVIDE |
| Rotación | A⌽B | Los elementos de B se rotan A posiciones | U+233D ⌽ CTILES DE CIRCULA FUNCIONALES |
| Rotación | A⊖B | Los elementos de B se rotan A posiciones a lo largo del primer eje | U+2296 ⊖ MINUS CIRCLED |
| Logarithm | A⍟B | Logaritmo de B a base A | U+235F ⍟ APL FUNCTIONAL SYMBOL CIRCLE STAR |
| Formato Dyadic | A⍕B | Formato B en una matriz de caracteres A | U+2355 ⍕ APL FUNCTIONAL SYMBOL UP TACK JOT |
| Transposesión general | A⍉B | Los ejes de B son ordenados por A | U+2349 ▪ APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH |
| Combinaciones | A!B | Número de combinaciones de B adoptadas A a la vez | U+0021 ! MARCO DE EXCLAMACIÓN |
| Diaeresis, Dieresis, Doble-Dot | A¨B | Sobre cada uno, o realizar cada uno por separado; B = sobre éstos; A = operación para realizar o utilizar (por ejemplo, iota) | U+00A8 . DIAERESIS |
| Menos que | A | Comparación: 1 si es verdad, 0 si falso | U+003C c) LESS-THAN SIGN |
| Menos o igual | A≤B | Comparación: 1 si es verdad, 0 si falso | U+2264 ≤ MENOS QUE O CUALQUIER |
| Igualdad | A=B | Comparación: 1 si es verdad, 0 si falso | U+003D = EQUALS SIGN |
| Mayor o igual | A≥B | Comparación: 1 si es verdad, 0 si falso | U+2265 ≥ GREATER-THAN O EQUAL TO |
| Más grande que | A>B | Comparación: 1 si es verdad, 0 si falso | U+003E ■ GREATER-THAN SIGN |
| No es igual | A≠B | Comparación: 1 si es verdad, 0 si falso | U+2260 ل NO EQUAL |
| O | A∨B | Boolean Logic: 0 (False) si ambos A y B = 0, 1 de lo contrario. Alt: 1 Si A o B = 1 (True) | U+2228 Alternativa LOGICA O |
| Y | A∧B | Boolean Logic: 1 Si ambos A y B = 1, 0 (False) de otro modo | U+2227 ∧ LOGICA Y |
| Nor | A⍱B | Boolean Logic: 1 si ambos A y B son 0, de lo contrario 0. Alt: ~ | U+2371 ⍱ APL FUNCTIONAL SYMBOL DOWN CARET TILDE |
| Nand | A⍲B | Boolean Logic: 0 si ambos A y B 1. De otro modo 1. Alt: ~∧ = not And | U+2372 ⍲ APL FUNCTIONAL SYMBOL UP CARET TILDE |
| Izquierda | A⊣B | A | U+22A3 ⊣ LEFT TACK |
| Bien. | A⊢B | B | U+22A2 ⊢ Atrás |
| Partido | A≡B | 0 si A no coincide B exactamente con respecto al valor, la forma y el anidaje; de lo contrario 1. | U+2261 ↑ IDENTICAL TO |
| Laminate | A⍪B | Concatenar a lo largo del primer eje | U+236A ⍪ APL FUNCTIONAL SYMBOL COMMA BAR |
Operadores e indicador de eje
| Nombre(s) | Signatura | Ejemplo | Significado (por ejemplo) | Secuencia de punto de código Unicode |
|---|---|---|---|---|
| Reducir (último eje), Slash | / | +/B | Sum across B | U+002F / SOLIDUS |
| Reducir (primer eje) | ⌿ | +⌿B | Sum down B | U+233F ⌿ SLASH BAR FUNCTIONAL |
| Escáner (último eje), Backslash | \ | +\B | Ejecutando suma B | U+005C \ REVERSE SOLIDUS |
| Escáner (primer eje) | ⍀ | +⍀B | Ejecutando la suma B | U+2340 ⍀ APL FUNCTIONAL SYMBOL BACKSLASH BAR |
| Producto interior | . | A+.×B | Matriz producto de A y B | U+002E . FULL STOP |
| Producto exterior | ∘. | A∘.×B | Producto exterior A y B | U+2218 ∘ RING OPERATOR, U+002E . FULL STOP |
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 en la izquierda como en la derecha, formando una función compuesta diádica aplicada a los vectores a la izquierda y a la derecha. Si la función a la izquierda del punto es " ∘ " (que significa nulo) entonces la función compuesta es un producto exterior, de lo contrario es un producto interno. Un producto interno destinado a la multiplicación de matriz convencional utiliza las funciones + y ×, reemplazarlas con otras funciones diádicas puede dar como resultado operaciones alternativas útiles.
Algunas funciones pueden ser seguidas por un indicador del eje en los soportes (cuadrados), es decir, esto 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 ⌽ (reversión) y una matriz bidimensional, la función de forma predeterminada funciona a lo largo del último eje, pero esto se puede cambiar usando un indicador del eje:
A←4 3⍴⍳12 A 1 2 3 4 5 6 7 8 910 11 12 ⌽A 3 2 1 6 5 4 9 8 712 11 10 ⌽[1]A10 11 12 7 8 9 4 5 6 1 2 3 ⊖⌽A12 11 10 9 8 7 6 5 4 3 2 1 ▪A1 4 7 102 5 8 113 6 9 12 |
A ahora se refleja o gira a lo largo de su eje vertical como símbolo ⌽ lo indica visualmente. A se refleja ahora utilizando [1] indicador del eje o modificador de primera dimensión. El resultado es que la variable A se ha reflejado en el eje horizontal, en lugar de verticalmente. A ahora se refleja ambos verticalmente ⊖ y horizontalmente ⌽. A es transposed a una matriz de 3 filas por 4 col tal que filas-cols se intercambian, como símbolo visualmente retrata. Compare el resultado aquí a la matriz original almacenada en A, matriz superior. Estos tipos de transformaciones de datos son útiles en análisis de series temporales y coordenadas espaciales, sólo existen dos ejemplos. |
Como caso particular, si el dyadic catenate " función es seguida por un indicador del eje (o modificador de eje a un símbolo/función), se puede utilizar para laminar (interpose) dos arrays dependiendo de si el indicador del eje es menor o mayor que el origen del índice (origen del índice = 1 en la ilustración a continuación):
B←1 2 3 4 C←5 6 7 8 B,C1 2 3 4 5 6 7 8 B,[0.5]C1 2 3 45 6 7 8 B,[1,5]C1 52 63 74 8 | A la izquierda, la variable 'B' se asigna por primera vez un vector de 4 enteros consecutivos (por ejemplo, ⍳4). |
Matrices anidadas
Arrays 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.). Las matrices que contienen caracteres y números se denominan matrices mixtas. Las estructuras de matrices que contienen elementos que también son matrices se denominan matrices anidadas.
Control de flujo
Un usuario puede definir funciones personalizadas que, al igual que las variables, se identifican por un nombre en lugar de por un símbolo no textual. El encabezado de función define si una función personalizada es niládica (sin argumentos), monádica (un argumento derecho) o diádica (argumentos izquierdo y derecho), el nombre local del resultado (a la izquierda de la flecha ← asignar) y si tiene variables locales (cada una separada por punto y coma ';').
| Niladic función PI o π(pi) | Monadic función CIRCLEAREA | Dyadic función SEGMENTAREA, con variables locales |
|---|---|---|
Silencio RESULTADOS←PI RESULTADOS←::1 Silencio | Silencio AREA←CIRCLEAREA RADIUS AREA←PI×RADIUS⋆2 Silencio | Silencio AREA←DEGREES SEGMENTAREA RADIUS ; FRACTION ; CA FRACTION←DEGREES.360 CA←CIRCLEAREA RADIUS AREA←FRACTION×CA Silencio |
Si las funciones con el mismo identificador pero diferente adicidad son distintas está definido por la implementación. Si se permite, entonces una función CURVEAREA podría definirse dos veces para reemplazar tanto la CIRCLEAREA monádica como la SEGMENTAREA diádica anterior, seleccionando la función monádica o diádica según el contexto en el que se hace referencia.
Las funciones diádicas personalizadas generalmente se pueden aplicar a parámetros con las mismas convenciones que las funciones integradas, es decir, las matrices deben tener el mismo número de elementos o uno de ellos debe tener un solo elemento extendido. Hay excepciones a esto; por ejemplo, una función para convertir moneda británica predecimal a dólares esperaría tomar un parámetro con exactamente tres elementos que representen libras, chelines y peniques.
Dentro de un programa o una función personalizada, el control puede ser transferido condicionalmente a una declaración identificada por un número de línea o etiqueta explícita; si el objetivo es 0 (cero) esto termina el programa o regresa a la llamada de una función. La forma más común utiliza la función de compresión APL, como en la plantilla (condición)/target que tiene el efecto de evaluar la condición a 0 (falso) o 1 (verdad) y luego utilizarla para enmascarar el objetivo (si la condición es falsa se ignora, si es cierto que queda solo por lo que se transfiere el control).
Por lo tanto, la función SEGMENTAREA se puede modificar para cancelar (justo debajo), devolviendo cero si los parámetros (GRADOS y RADIO a continuación) son de signo diferente:
Silencio AREA←DEGREES SEGMENTAREA RADIUS ; FRACTION ; CA ; SIGN ⍝ variables locales denotadas por semicolon() FRACTION←DEGREES.360 CA←CIRCLEAREA RADIUS ⍝ this APL code statement calls user function CIRCLEAREA, defined up above. SIGN←()×DEGREES)■RADIUS TEST/determine si DEGREES y RADIUS NO tienen el mismo SIGN 1-yes diferente( ل), 0-no(same signo) AREA←0 ⍝ valor predeterminado de AREA set = cero →SIGN/0 ⍝ ramificación (aquí, salida) ocurre cuando SIGN=1 mientras que SIGN=0 NO se ramifica a 0. Función de ramificación a 0 salidas. AREA←FRACTION×CASilencioLa función anterior SEGMENTAREA funciona como se esperaba si los parámetros son escalares o matrices de un solo elemento, pero no si son de múltiples elementos. arrays 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. A veces, la operación puede ser impredecible ya que APL define que las computadoras con capacidades de procesamiento de vectores deberían paralelizar y pueden reordenar las operaciones de matriz en la medida de lo posible; por lo tanto, probar y depurar 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 se pueda usar razonablemente una función diádica, como en la generación de una tabla de resultados:
90 180 270 ̄90 ∘.SEGMENTAREA 1 ̄2 40 0 00 0 00 0 00 0 0Una forma más concisa y, a veces, mejor: formular una función es evitar transferencias explícitas de control y, en su lugar, utilizar expresiones que se evalúen correctamente en todas 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. Lo siguiente es más conciso que la función SEGMENTAREA anterior. Es importante destacar que lo siguiente maneja correctamente los argumentos vectorizados:
Silencio AREA←DEGREES SEGMENTAREA RADIUS ; FRACTION ; CA ; SIGN FRACTION←DEGREES.360 CA←CIRCLEAREA RADIUS SIGN←()×DEGREES)■RADIUS AREA←FRACTION×CA#SIGN ⍝ esta declaración de la APL es más compleja, como una sola línea - pero resuelve argumentos vectorizados: una compensación - complejidad vs. ramificación Silencio 90 180 270 ̄90 ∘.SEGMENTAREA 1 ̄2 40,85398163 0 12.56637061.57079633 0 25.13274122.35619449 0 37.69911180 ̄3.14159265 0Evitar transferencias explícitas de control, también llamadas ramificaciones, si no se revisan o controlan cuidadosamente, puede promover el uso de frases ingeniosas excesivamente complejas, verdaderamente "modismos incomprendidos y complejos" y una opción de "sólo escritura" estilo, que ha hecho poco para ganarse el cariño de APL ante comentaristas influyentes como Edsger Dijkstra. Sin embargo, los modismos de APL pueden ser divertidos, educativos y útiles, si se usan con comentarios ⍝ útiles, por ejemplo, incluyendo la fuente, el significado previsto y la función del modismo. Aquí hay una lista de modismos APL, una lista de modismos APL2 de IBM aquí y una biblioteca de modismos APL finlandés aquí.
Varios
| Nombre(s) | Signatura | Ejemplo | Significado (por ejemplo) | Punto de código Unicode |
|---|---|---|---|---|
| Alto menos | ̄ | ¯3 | Denota un número negativo | U+00AF ̄ MACRON |
| Lamp, Comentario | ⍝ | ⍝This is a comment | Todo a la derecha de ⍝ denota un comentario | U+235D ⍝ APL FUNCTIONAL SYMBOL UP SHOE JOT |
| RightArrow, Branch, GoTo | → | →This_Label | →This_Label envía ejecución APL a This_Label: | U+2192 → DERECHO ARROW |
| Assign, LeftArrow, Set to | ← | B←A | B←A establece valores y forma de B para coincidir con A | U+2190 ← LEFTWARDS ARROW |
La mayoría de las implementaciones de APL admiten una serie de variables y funciones del sistema, generalmente precedidas por ⎕ (quad) y/o ")" ( gancho=cerrar paréntesis). Tenga en cuenta que el carácter cuádruple no es lo mismo que el símbolo de carácter faltante Unicode. Particularmente importante y ampliamente implementada es la variable ⎕IO (Index Origin), ya que mientras el IBM APL original basaba sus matrices en 1, algunas variantes más nuevas las basan en cero:
| Sesión de usuario con intérprete APL | Descripción |
|---|---|
X←⍳12 X1 2 3 4 5 6 7 8 9 10 11 12 ⎕IO1 X[1]1 | X set = a vector de 12 enteros consecutivos. Inicial origen índice ⎕IO valor = 1. Así, la primera posición en vector X o X[1] = 1 por vector de valores de iota {1 2 3 4 5...}. |
⎕IO←0 X[1]2 X[0]1 | Origen ⎕IO ahora cambió a 0. Así, la 'primera posición índice' en el vector X cambia de 1 a 0. En consecuencia, X[1] entonces referencias o puntos a 2 de {1 2 3 4 5...} y X[0] ahora referencias 1. |
WAWA41226371072 | Quad WA o WAWA, otra dinámica sistema variable, muestra cuánto queda Área de Trabajo no utilizados o 41,226 megabytes o alrededor de 41 gigabytes no utilizados zona de trabajo gratuita adicional disponible para el espacio de trabajo y programa APL para procesar el uso. Si este número se pone bajo o se acerca a cero - el ordenador puede necesitar más memoria de acceso aleatorio (RAM), espacio de disco duro o alguna combinación de los dos para aumentar la memoria virtual. |
)VARSX | )VARS a system function in APL, )VARS muestra nombres de variables de usuario existentes en el espacio de trabajo actual. |
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 denominado . gancho comandos o funciones debido al uso de un paréntesis derecho inicial o un gancho. Existe cierta estandarización de estas funciones cuádruples y de gancho.
Fuentes
El plano multilingüe básico Unicode incluye los símbolos APL en el bloque técnico misceláneo, que por lo tanto generalmente se representan con precisión a partir de las fuentes Unicode más grandes instaladas con la mayoría de los sistemas operativos modernos. Estas fuentes rara vez las diseñan tipógrafos familiarizados con los glifos APL. Entonces, aunque son precisos, los glifos pueden parecer desconocidos para los programadores de APL o ser difíciles de distinguir entre sí.
Algunas fuentes Unicode se han diseñado para mostrar bien APL: APLX Upright, APL385 Unicode y SimPL.
Antes de Unicode, los intérpretes APL contaban con fuentes en las que los caracteres APL se asignaban a posiciones menos utilizadas en los conjuntos de caracteres ASCII, generalmente en los 128 puntos superiores del código. Estas asignaciones (y sus variaciones nacionales) a veces eran únicas para el intérprete de cada proveedor de APL, lo que hacía que la visualización de programas APL en la Web, en archivos de texto y manuales fuera frecuentemente problemática.
Función del teclado APL2 para mapeo de símbolos

Tenga en cuenta la tecla de encendido/apagado de APL: tecla situada en el extremo superior derecho, justo debajo. También tenga en cuenta que el teclado tenía unas 55 teclas de símbolos APL únicas (68 enumeradas según las tablas anteriores, incluidos símbolos comparativos, pero varios símbolos aparecen en tablas monádicas y diádicas) (se enumeran 55 funciones (operadores) de APL en IBM& #39;s 5110 APL Reference Manual), por lo tanto, con el uso de las teclas alt, shift y ctrl, teóricamente habría permitido un máximo de algunas 59 (teclas) *4 (con pulsación de dos 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 multiplicados por 2 códigos para cada combinación de llaves). Nuevamente, en teoría, el teclado que se muestra aquí habría permitido la entrada del teclado y el uso activo de alrededor de 472 símbolos/funciones APL diferentes. En la práctica, las primeras versiones solo usaban algo aproximadamente equivalente a 55 símbolos especiales APL (excluyendo letras, números, puntuación, etc.). Por lo tanto, los primeros 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 las teclas # del teclado, excluyendo nuevamente números, letras, puntuación, etc. En otro sentido, la utilización de los símbolos del teclado fue más cercana al 100%, altamente eficiente, ya que EBCDIC solo permitía 256 caracteres distintos y ASCII solo 128.
Resolver acertijos
APL ha demostrado ser extremadamente útil para resolver acertijos matemáticos, varios de los cuales se describen a continuación.
El triángulo de Pascal
Tomemos el triángulo de Pascal, que es un conjunto triangular de números en el que los que están al final 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 de él ( el ápice, 1, estando en la cima). La siguiente es una función de una sola línea de APL para representar visualmente el triángulo de Pascal:
Pascal←{}0~.a⌽.0,.a∘!.a←⌽⍳⍵} ⍝ Crear una función de usuario llamada Pascal Pascal 7 ⍝ Correr 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 7Números primos, prueba contraria mediante factores
Determina el número de números primos (el número primo es un número natural mayor que 1 que no tiene divisores positivos aparte de 1 y él mismo) hasta algún número N. A Ken Iverson se le atribuye la siguiente solución APL de una sola línea al problema:
⎕CR 'PrimeNumbers ' ⍝ Show APL user-function PrimeNumbersPrimes←PrimeNumbers N ⍝ La función toma un arg N derecho (por ejemplo, mostrar números primos para 1... int N)Primes←()2=+⌿0=()⍳N)∘.SilencioN)/⍳N ⍝ El Ken Iverson una línea PrimeNumbers 100 ⍝ Mostrar todos los números primos de 1 a 1002 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 10025 ⍝ Hay veinticinco números primos en el rango de hasta 100.Con frecuencia es necesario examinar el inverso o opuesto de una solución matemática (factores enteros de un número): demostrar que el subconjunto de números enteros del 1 al 15 son no primos enumerando sus factores de descomposición. ¿Cuáles son sus factores distintos de uno (# es divisible por, excepto 1)?
⎕CR 'ProveNonPrime 'Z←ProveNonPrime R⍝ Mostrar todos los factores de un entero R - excepto 1 y el número mismo,⍝ i.e., probar No-Prime. String 'prime' es devuelto para un primer entero.Z←()0=()⍳R)SilencioR)/⍳R ⍝ Determinar todos los factores para el entero R, almacenar en ZZ←()~()Z∊1,R)/Z ⍝ Eliminar 1 y el número como factores para el número de Z.→()0=Z)/ProveNoPrimeIsPrime ⍝ Si el resultado tiene cero forma, no tiene otros factores y por lo tanto es primoZ←R,()⊂"factores(excepto 1)),()⊂Z),⎕TCNL ⍝ Mostrar el número R, sus factores (excepto 1,itself), y una nueva línea de char→0 ⍝ Hecho con función si no-primeProveNoPrimeIsPrime: Z←R,()⊂"Primero"),⎕TCNL ⍝ ramas de función aquí si el número era primo ProveNonPrime .⍳15 ⍝ Probar no primos para cada( ̈) de los enteros de 1 a 15 (iota 15) 1 primo 2 primo 3 primo 4 factores()Salvo 1) 2 5 primo 6 factores()Salvo 1) 2 3 7 primo 8 factores()Salvo 1) 2 4 9 factores()Salvo 1) 3 10 factores()Salvo 1) 2 5 11 primo 12 factores()Salvo 1) 2 3 4 6 13 primo 14 factores()Salvo 1) 2 7 15 factores()Salvo 1) 3 5Secuencia de Fibonacci
Genere una secuencia numérica de Fibonacci, donde cada número subsiguiente en la secuencia es la suma de los dos anteriores:
⎕CR "Fibonacci" ' Función de visualización FibonacciFibonacciNum←Fibonacci Nth;IOwas ⍝ Divertido encabezado, funct name=Fibonacci, funct monadic con 1 mano derecha arg Nth;local var IOwas, y un num devuelto.⍝Generar un número secuenciado de Fibonacci donde Nth es la posición # del número Fibonacci en la secuencia. Descripción de la funciónIOwas←⎕IO ⋄ ⎕IO←0 ⋄ FibonacciNum←↑0 1↓.×/Nth/⊂2 2⍴1 1 1 0 ⋄ ⎕IO←IOwas ⍝ Para que esta función funcione correctamente ⎕IO debe ajustarse a 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 Fibonacci de números generados por el intérprete de APL.