Articulo de referencia

Función directa

Una función directa ( dfn , pronunciado "di fun") es una forma alternativa de definir una función y un operador (una función de orden superior ) en el lenguaje de programación A...

Una función directa ( dfn , pronunciado "di fun") es una forma alternativa de definir una función y un operador (una función de orden superior ) en el lenguaje de programación APL . Un operador directo también puede llamarse dop (pronunciado "di op"). Fueron inventados por John Scholes en 1996. [ 1 ] Son una combinación única de programación de matrices , funciones de orden superior y programación funcional , y representan un avance distintivo importante de APL de principios del siglo XXI con respecto a versiones anteriores.

Una dfn es una secuencia de expresiones posiblemente protegidas (o simplemente una protección) entre {y }, separadas por o saltos de línea, donde denota el argumento izquierdo y el derecho, y denota recursión (autorreferencia de función). Por ejemplo, la función PTcomprueba si cada fila de es una terna pitagórica (comprobando si la suma de los cuadrados es igual al doble del cuadrado del máximo).

PT { ( + / * 2 ) = 2 × ( / ) * 2 } PT 3 4 5 1 x 4 5 3 3 11 6 5 13 12 17 16 8 11 12 4 17 15 8 PT x 1 0 1 0 0 1

La función factorial como una función de densidad de probabilidad:

hecho { 0 = ⍵: 1 × - 1 } hecho 5 120 hecho ¨ 10 ⍝ hecho aplicado a cada elemento de 0 a 9 1 1 2 6 24 120 720 5040 40320 362880

Descripción

Las reglas para las dfns se resumen en la siguiente "ficha de referencia": [ 2 ]

Una dfn es una secuencia de expresiones posiblemente protegidas (o simplemente una protección) entre {y }, separadas por o saltos de línea.

protección de expresión : protección de expresión :

Las expresiones y/o condiciones se evalúan secuencialmente. Una condición debe evaluarse como 0 o 1; su expresión asociada se evalúa si el valor es 1. Una función dinámica (dfn) finaliza tras la primera expresión sin condición que no termina en asignación , tras la primera expresión con condición cuya condición se evalúa como 1, o si no hay más expresiones. El resultado de una dfn es el de la última expresión evaluada. Si esa última expresión evaluada termina en asignación, el resultado es "discreto" y no se muestra automáticamente en la sesión.

Los nombres asignados en una dfn son locales por defecto, con ámbito léxico .

denota el argumento de la función izquierda y el derecho; ⍺⍺denota el operando izquierdo y ⍵⍵el derecho. Si ⍵⍵aparece en la definición, entonces la dfn es un operador diádico ; si solo ⍺⍺aparece pero no ⍵⍵, entonces es un operador monádico; si no aparece ni ⍺⍺ni ⍵⍵, entonces la dfn es una función.

La sintaxis especial se utiliza para asignar un valor predeterminado al argumento izquierdo si se llama a una función de densidad de probabilidad (dfn) de forma monádica, es decir, sin argumento izquierdo. En caso contrario, no se evalúa.expressionexpression

denota recursión o autorreferencia por la función, y ∇∇denota autorreferencia por el operador. Dicha denotación permite la recursión anónima .

La detección de errores se realiza mediante mecanismos de protección contra errores . Cuando se genera un error, el sistema busca dinámicamente en las funciones que lo invocan un mecanismo de protección contra errores que coincida con dicho error. Si se encuentra uno, el entorno de ejecución se revierte a su estado inmediatamente anterior a la ejecución del mecanismo de protección contra errores y la expresión asociada a este se evalúa como resultado de la función dinámica.errnums::expression

En los artículos citados se encuentran disponibles descripciones, explicaciones y tutoriales adicionales sobre dfns. [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ]

Ejemplos

Los ejemplos aquí presentados ilustran diferentes aspectos de las DFN. En los artículos citados se encuentran ejemplos adicionales. [ 8 ] [ 9 ] [ 10 ]

Argumento izquierdo predeterminado

La función se suma a ( i o{+0j1×}0j11{\displaystyle {\sqrt {-1}}}) veces .

3 { + 0j1 × } 4 3J4 ∘. { + 0j1 × } ¯2 +⍳ 5 ¯2J¯2 ¯2J¯1 ¯2 ¯2J1 ¯2J2 ¯1J¯2 ¯1J¯1 ¯1 ¯1J1 ¯1J2 0J¯2 0J¯1 0 0J1 0J2 1J¯2 1J¯1 1 1J1 1J2 2J¯2 2J¯1 2 2J1 2J2

La importancia de esta función puede verse de la siguiente manera:

Los números complejos se pueden construir como pares ordenados de números reales, de forma similar a como los números enteros se pueden construir como pares ordenados de números naturales y los números racionales como pares ordenados de números enteros. Para los números complejos, desempeña el mismo papel que para los números enteros y para los números racionales. [ 11 ] : §8{+0j1×}-÷

Además, de forma análoga a esa ⇔ monádica ( negar ) y ⇔ monádica ( recíproca ), una definición monádica de la función es útil, lograda especificando un valor predeterminado de 0 para : si , entonces ⇔ ⇔ .-0-÷1÷j{0+0j1×}j0j0+0j1×

j { 0 + 0j1 × }3 j 4 ¯5,6 7,89 3J4 3J¯5,6 3J7,89j 4 ¯5,6 7,89 0J4 0J¯5,6 0J7,89pecado 1 porque 2 Euler { ( * j ) ​​= ( porque ) j ( pecado ) }Euler ( ¯0,5 +? 10 0 ) j ( ¯0,5 +? 10 0 ) 1 1 1 1 1 1 1 1 1 1

La última expresión ilustra la fórmula de Euler sobre diez números aleatorios con partes reales e imaginarias en el intervalo(0,5,0,5){\displaystyle \left(-0.5,0.5\right)}.

Recursión simple

La construcción ternaria del conjunto de Cantor comienza con el intervalo [0,1] y en cada etapa se elimina el tercio central de cada subintervalo restante:

[0,1]{\displaystyle {\biggl [}0,1{\biggr ]}\to }

[0,13][23,1]{\displaystyle \left[0,{\frac {1}{3}}\right]\cup \left[{\frac {2}{3}},1\right]\to }

[0,19][29,13][23,79][89,1]{\displaystyle \left[0,{\frac {1}{9}}\right]\cup \left[{\frac {2}{9}},{\frac {1}{3}}\right]\cup \left[{\frac {2}{3}},{\frac {7}{9}}\right]\cup \left[{\frac {8}{9}},1\right]\to \cdots }

El conjunto de orden de Cantor definido como una dfn: [ 11 ] : §2.5

Cantor { 0 = ⍵: , 1 , 1 0 1 ∘. - 1 }Cantor 0 1 Cantor 1 1 0 1 Cantor 2 1 0 1 0 0 0 1 0 1 Cantor 3 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1

Cantor 0 a Cantor 6 representados como barras negras:

La función calcula un vector de bits de longitud tal que el bit (para y ) es 1 si y solo si es un número primo . [ 10 ] : §46sievei0ii<i

tamiz { 4 ⍵:⍵ 0 0 1 1 r 0.5 * n p 2 3 5 7 11 13 17 19 23 29 31 37 41 43 p ( 1 + ( n ≤× p ) 1 ) p b 0 @ 1 { ( m ) > m 1 m n ×≢ } 1 , p { r < q b 1 : b b [ ] 1 b [ q , q ×⍸ b n ÷ q ] 0 , q } p }10 10 tamiz 100 0 0 1 1 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0b tamiz 1e9 b 1000000000 ( 10 *⍳ 10 ) ( + ) 0 1 b 0 4 25 168 1229 9592 78498 664579 5761455 50847534

La última secuencia, el número de primos menores que potencias de 10, es un segmento inicial de OEIS : A006880  . El último número, 50847534, es el número de primos menores que109{\displaystyle 10^{9}}Se le llama número de Bertelsen, descrito memorablemente por MathWorld como "un nombre erróneo al que erróneamente se le ha dado el valor erróneo deπ(109)=50847478{\displaystyle \pi (10^{9})=50847478}". [ 12 ]

sieveutiliza dos métodos diferentes para marcar compuestos con 0, ambos realizados mediante dfns anónimas locales: El primero utiliza la criba de Eratóstenes en una máscara inicial de 1 y un prefijo de los primos 2  3...43, utilizando el operador de inserción ( pliegue a la derecha ). (La longitud del prefijo se obtiene por comparación con la función primorial ). El segundo encuentra el primo nuevo más pequeño que queda en ( ), y establece a 0 el bit en sí mismo y los bits en veces los números en los bits 1 restantes en un segmento inicial de ( ). Esta segunda dfn utiliza recursión de cola.×pqbqb1qqbbn÷q

Recursión de cola

Normalmente, la función factorial se define recursivamente (como arriba ), pero se puede codificar para explotar la recursión de cola usando un argumento izquierdo acumulador: [ 13 ]

fac { 1 = 0 :⍺ ( × ) - 1 }

De manera similar, el determinante de una matriz cuadrada compleja mediante eliminación gaussiana se puede calcular con recursión de cola: [ 14 ]

det { ⍝ determinante de una matriz cuadrada compleja 1 ⍝ producto de los coeficientes del cofactor hasta ahora 0 =≢ ⍵:⍺ ⍝ resultado para 0-x-0 ( i j ) ( ) ⊤⊃⍒|, ⍝ índice de fila y columna del elemento máximo k ⍳≢ ( × [ i ; j ] × ¯1 * i + j ) [ k ~ i ; k ~ j ] - [ k ~ i ; j ] ∘. × [ i ; k ~ j ] ÷ [ i ; j ] }

Recursión múltiple

Una partición de un número entero no negativonorte{\displaystyle n}es un vectorv{\displaystyle v}de enteros positivos tales que , donde el orden enn=+vv{\displaystyle v}no es significativo. Por ejemplo, y son particiones de 4, y y y se consideran la misma partición.22211211121112

La función de particiónPAG(norte){\displaystyle P(n)}cuenta el número de particiones. La función es de interés en la teoría de números , estudiada por Euler , Hardy , Ramanujan , Erdős y otros. La relación de recurrencia

PAG(norte)=k=1norte(1)k+1[PAG(norte12k(3k1))+PAG(norte12k(3k+1))]{\displaystyle P(n)=\sum _{k=1}^{n}(-1)^{k+1}[P(n-{\frac {1}{2}}k(3k-1))+P(n-{\frac {1}{2}}k(3k+1))]}

derivado del teorema del número pentagonal de Euler . [ 15 ] Escrito como una dfn: [ 10 ] : §16

pn { 1 ⍵: 0 - + ¨ rec } rec { - ( ÷ 2 ( × 1 ) ¯1 1 ∘. + 3 × ) 1 +⍳⌈ 0.5 * × 2 ÷ 3 }pn 10 42 pn ¨ 13 ⍝ OEIS A000041 1 1 2 3 5 7 11 15 22 30 42 56 77

El paso base establece que para , el resultado de la función es , 1 si ⍵ es 0 o 1 y 0 en caso contrario. El paso recursivo es altamente recursivo múltiple. Por ejemplo, daría como resultado que la función se aplicara a cada elemento de , que son:1⍵:010pn200rec200

rec 200 199 195 188 178 165 149 130 108 83 55 24 ¯10 198 193 185 174 160 143 123 100 74 45 13 ¯22

y requiere más tiempo que la edad del universo para calcularse (pn2007.57×1047{\displaystyle 7.57\times 10^{47}}llamadas de función a sí misma). [ 10 ] : §16 El tiempo de cálculo se puede reducir mediante la memorización , aquí implementada como el operador directo (función de orden superior) M:

M { f ⍺⍺ i 2 + '⋄' t 2 ↓, ⎕cr 'f' '{T←(1+⍵)⍴¯1 ⋄ ' , ( i t ) , '¯1≢T[⍵]:⊃T[⍵] ⋄ ⊃T[⍵]←⊂' , ( i t ) , '⍵}⍵' }pn M 200 3.973E12 0 pn M 200 ⍝ formato a 0 decimales 3972999029388

Este valor coincide con el calculado por Hardy y Ramanujan en 1918. [ 16 ]pnM200

El operador memo Mdefine una variante de su función de operando ⍺⍺para usar una cachéT y luego la evalúa. Con el operando, pnla variante es:

{ T ( 1 + ) ¯1 { 1 ⍵: 0 ¯1 T [ ] : T [ ] T [ ] ⊂- + ¨ rec } }

Operador directo (dop)

El algoritmo Quicksort en una matriz funciona eligiendo un "pivote" al azar entre sus celdas principales, y luego concatenando las celdas principales ordenadas que preceden estrictamente al pivote, las celdas principales iguales al pivote y las celdas principales ordenadas que siguen estrictamente al pivote, según lo determine una función de comparación ⍺⍺. Definido como un operador directo (dop) Q:

Q { 1 ≥≢ ⍵:⍵ ( ⌿⍨ 0 > s ) ( ⌿⍨ 0 = ​​s ) ⌿⍨ 0 < s ⍺⍺ ?≢ }⍝ precede ⍝ sigue ⍝ es igual a 2 ( ×- ) 8 8 ( ×- ) 2 8 ( ×- ) 8 ¯1 1 0x 2 19 3 8 3 6 9 4 19 7 0 10 15 14( ×- ) Q x 0 2 3 3 4 6 7 8 9 10 14 15 19 19

Q3Es una variante que concatena las tres partes encerradas por la función en lugar de las partes en sí . Las tres partes generadas en cada paso recursivo son evidentes en la estructura del resultado final. Aplicar la función derivada de Q3al mismo argumento varias veces produce resultados diferentes porque los pivotes se eligen al azar. El recorrido en orden de los resultados produce el mismo arreglo ordenado.

Q3 { 1 ≥≢ ⍵:⍵ ( ⌿⍨ 0 > s ) ( ⌿⍨ 0 = ​​s ) ⍪⊂ ⌿⍨ 0 < s ⍺⍺ ?≢ }( × - ) Q3x ┌───────────────────────── ───────────────────┬─────┬┐ │┌──────────────┬─┬─────────────────────────┐│ 19 19 ││ ││┌──────┬───┬─┐│ 6 │┌──────┬─┬──────────────┐││ ││ │││┌┬─┬─┐│ 3 3 4 ││ ││┌┬─┬─┐│ 9 │┌┬──┬────────┐│││ ││ │││││ 0 2 ││ ││ ││││ 7 8 ││ │││ 10 │┌──┬──┬┐││││ ││ │││└┴─┴─┘│ ││ ││└┴─┴─┘│ │││ ││ 14 15 ││││││ ││ ││└──────┴───┴─┘│ ││ │││ │└──┴──┴┘││││ ││ ││ ││ │└┴──┴────────┘│││ ││ ││ │└──────┴─┴──────────────┘││ ││ │└──────────────┴─┴───────────────────────┘│ ││ └───────────────────────── ───────────────────┴─────┴┘ ( × - ) Q3x ┌────────────────────────────┬─┬────────────────────────────┐ │┌┬─┬───────────────────────┐│ 7 │┌─────────────────────┬─────┬┐│ │││ 0 │┌┬─┬─────────────────┐││ ││┌──────┬──┬────────┐│ 19 19 │││ │││ │││ 2 │┌────────────┬─┬┐│││ │││┌┬─┬─┐│ 10 │┌──┬──┬┐││ │││ │││ │││ ││┌───────┬─┬┐│ 6 │││││ │││││ 8 9 ││ ││ 14 15 ││││ │││ │││ │││ │││┌┬───┬┐│ 4 │││ │││││ │││└┴─┴─┘│ │└──┴──┴┘││ │││ │││ │││││3 3 │││ │││ │││││ ││└──────┴──┴────────┘│ │││ │││ │││ │││└┴───┴┘│ │││ │││││ │└────────────────────┴─────┴┘│ │││ │││ ││└───────┴─┴┘│ │││││ │││ │││ │└────────────┴─┴┘│││ │││ │└┴─┴─────────────────┘││ │└┴─┴──────────────────────┘│ └───────────────────────────┴─┴───────────────────────────┘

La formulación anterior no es nueva; véase, por ejemplo, la Figura 3.7 del clásico * The Design and Analysis of Computer Algorithms *. [ 17 ] Sin embargo, a diferencia del programa ALGOL en lenguaje pidgin de la Figura 3.7, es ejecutable, y el orden parcial utilizado en la ordenación es un operando, como en los ejemplos anteriores. [ 9 ]Q(×-)

Dfns con operadores y trenes

Las Dfn, especialmente las Dfn anónimas, funcionan bien con operadores y trenes. El siguiente fragmento resuelve un rompecabezas de "Perlas de Programación": [ 18 ] dado un diccionario de palabras en inglés, aquí representado como la matriz de caracteres a, encuentre todos los conjuntos de anagramas.

a { [ ] } 1 a ( { [ ] } 1 { } ) a palms apst ┌────┬────┬────┐ spat apst palms teas star teas aest spat sate sate aest taps etas taps apst past seat etas aest eats pasado apst sabor asiento aest este come aest seta sabor aest └────┴────┴────┘ estrella arst este aest seta aest

El algoritmo funciona ordenando las filas individualmente ( ), y estas filas ordenadas se utilizan como claves ("firma" en la descripción de Programming Pearls) para el operador de clave para agrupar las filas de la matriz. [ 9 ] : §3.3 La expresión de la derecha es un tren , una forma sintáctica empleada por APL para lograr la programación tácita . Aquí, es una secuencia aislada de tres funciones tales que ⇔ , por lo que la expresión de la derecha es equivalente a .{[]}1a(fgh)(f)g(h)({[]}1a){}a

Alcance léxico

Cuando una dfn interna (anidada) hace referencia a un nombre, se busca hacia afuera a través de las dfns que la contienen, en lugar de hacia abajo en la pila de llamadas . Se dice que este régimen emplea un ámbito léxico en lugar del ámbito dinámico habitual de APL . La distinción se hace evidente solo si se realiza una llamada a una función definida en un nivel externo. Para las llamadas internas más comunes, los dos regímenes son indistinguibles. [ 19 ] : p.137

Por ejemplo, en la siguiente función which, la variable tyse define tanto en whichsí misma como en la función interna f1. Cuando f1se realizan llamadas externas a f2y f2se hace referencia a ty, se encuentra la externa (con valor 'lexical') en lugar de la definida en f1(con valor 'dynamic'):

que { ty 'léxico' f1 { ty 'dinámico' f2 } f2 { ty , } f1 }qué 'alcance' alcance léxico

Protección contra errores

La siguiente función ilustra el uso de protecciones contra errores: [ 19 ] : p.139

más { tx 'catch all' 0 :: tx tx 'domain' 11 :: tx tx 'length' 5 :: tx + } 2 más 3 ⍝ sin errores 5 2 3 4 5 más 'three' ⍝ las longitudes de los argumentos no coinciden length 2 3 4 5 más 'four' ⍝ no se pueden agregar caracteres domain 2 3 más 3 4 5 ⍝ no se puede agregar vector a matriz catch all

En APL, el error número 5 es "error de longitud"; el error número 11 es "error de dominio"; y el error número 0 es un "cajón de sastre" para los errores números del 1 al 999.

El ejemplo muestra cómo se desenrolla el entorno local antes de que se evalúe la expresión de una protección contra errores. El nombre local txse establece para describir el alcance de la protección contra errores que le sigue. Cuando ocurre un error, el entorno se desenrolla para exponer txel valor estáticamente correcto de .

Dfns versus tradfns

Dado que las funciones directas son dfns, las funciones APL definidas de la manera tradicional se denominan tradfns, pronunciado "trad funs". Aquí, las dfns y las tradfns se comparan considerando la función sieve: a la izquierda hay una dfn (como se definió anteriormente ); en el medio hay una tradfn que utiliza estructuras de control ; a la derecha hay una tradfn que utiliza gotos ( ) y etiquetas de línea .

  • Una dfn puede ser anónima ; una tradfn debe tener nombre.
  • Una dfn se nombra por asignación ( ); una tradfn se nombra incrustando el nombre en la representación de la función y aplicando ⎕fx(una función del sistema) a esa representación.
  • Una función de definición (dfn) es más práctica que una función de definición tradicional (tradfn) como operando (véanse los puntos anteriores: una tradfn debe tener nombre; una tradfn se nombra mediante la incrustación de...).
  • Los nombres asignados en una dfn son locales por defecto; los nombres asignados en una tradfn son globales a menos que se especifiquen en una lista de variables locales.
  • Las variables locales en una dfn tienen ámbito léxico ; las variables locales en una tradfn tienen ámbito dinámico , visible en las funciones llamadas a menos que estén ocultas por su lista de variables locales.
  • Los argumentos de una dfn se denominan y , y los operandos de una dop se denominan ⍺⍺y ⍵⍵; los argumentos y operandos de una tradfn pueden tener cualquier nombre, especificado en su línea principal.
  • El resultado (si lo hay) de una dfn no tiene nombre; el resultado (si lo hay) de una tradfn se nombra en su encabezado.
  • El valor predeterminado para ⍺ se especifica de forma más clara que para el argumento izquierdo de una función tradicional.
  • La recursión en una dfn se efectúa invocando o ∇∇su nombre; la recursión en una tradfn se efectúa invocando su nombre.
  • El control de flujo en una DFN se efectúa mediante guardas y llamadas a funciones; en una DFN tradicional, mediante estructuras de control, (goto) y etiquetas de línea.
  • Evaluar una expresión en una dfn que no termine en una asignación provoca un retorno de la dfn; evaluar una línea en una tradfn que no termine en una asignación o goto muestra el resultado de la línea.
  • Una dfn devuelve un valor al evaluar una expresión que no termina en una asignación, al evaluar una expresión protegida o después de la última expresión; una tradfn devuelve un valor en (goto) la línea 0 o una línea inexistente, o al evaluar una estructura de control, o después de la última línea.:Return
  • El control de flujo más sencillo en una DFN hace que sea más fácil detectar e implementar la recursión de cola que en una DFN tradicional.
  • Una dfn puede llamar a una tradfn y viceversa ; una dfn puede definirse en una tradfn y viceversa .

Historia

Kenneth E. Iverson , el inventor de APL, no estaba satisfecho con la forma en que se definían las funciones de usuario (tradfns). En 1974, ideó la "definición formal de función" o "definición directa" para su uso en la exposición. [ 20 ] Una definición directa tiene dos o cuatro partes, separadas por dos puntos:

nombre : expresión nombre : expresión0 : proposición : expresión1

Dentro de una definición directa, denota el argumento izquierdo y el argumento derecho. En el primer caso, el resultado de expressiones el resultado de la función; en el segundo caso, el resultado de la función es el de expression0si propositionse evalúa a 0, o expression1si se evalúa a 1. Las asignaciones dentro de una definición directa son dinámicamente locales . Ejemplos del uso de la definición directa se encuentran en la Conferencia del Premio Turing de 1979 [ 21 ] y en libros y artículos de aplicación. [ 22 ] [ 23 ] [ 24 ] [ 25 ] [ 9 ]

La definición directa era demasiado limitada para su uso en sistemas más grandes. Las ideas fueron desarrolladas posteriormente por varios autores en múltiples trabajos [ 26 ] : §8 [ 27 ] [ 28 ] : §4.17 [ 29 ] [ 30 ] [ 31 ] [ 32 ] pero los resultados eran engorrosos. De estos, la "definición alternativa de función APL" de Bunda en 1987 [ 31 ] fue la que más se acercó a las funcionalidades actuales, pero presenta fallos en conflictos con símbolos existentes y en el manejo de errores que habrían causado dificultades prácticas, y nunca se implementó. Los principales destilados de las diferentes propuestas fueron que (a) la función que se define es anónima, y ​​la denominación posterior (si es necesaria) se realiza mediante asignación; (b) la función se denota mediante un símbolo y, por lo tanto, permite la recursión anónima . [ 9 ]

En 1996, John Scholes de Dyalog Limited inventó las funciones directas (dfns). [ 1 ] [ 6 ] [ 7 ] Las ideas se originaron en 1989 cuando leyó un número especial de The Computer Journal sobre programación funcional. [ 33 ] Luego procedió a estudiar programación funcional y se sintió fuertemente motivado ("enfermo de deseo", como Yeats ) para llevar estas ideas a APL. [ 6 ] [ 7 ] Inicialmente operó en secreto porque le preocupaba que los cambios pudieran ser juzgados como demasiado radicales y una complicación innecesaria del lenguaje; otros observadores dicen que operó en secreto porque los colegas de Dyalog no estaban tan entusiasmados y pensaban que estaba perdiendo su tiempo y causando problemas a la gente. Las Dfns se presentaron por primera vez en el Dyalog Vendor Forum en la Conferencia APL '96 y se lanzaron en Dyalog APL a principios de 1997. [ 1 ] La aceptación y el reconocimiento fueron lentos en llegar. Todavía en 2008, en Dyalog at 25 , [ 34 ] una publicación que celebraba el 25 aniversario de Dyalog Limited, las dfns apenas se mencionaban (se mencionaban dos veces como "funciones dinámicas" y sin mayor explicación). A partir de 2019Las dfns se implementan en Dyalog APL, [ 19 ] NARS2000, [ 35 ] y ngn/apl. [ 36 ] También desempeñan un papel clave en los esfuerzos por explotar las capacidades de computación de una unidad de procesamiento gráfico (GPU). [ 37 ] [ 9 ]

Referencias

  1. 1 2 3 Scholes, John (octubre de 1996). "Funciones directas en Dyalog APL" (PDF) . Vector . 13 (2) . Recuperado el 16 de septiembre de 2019 .
  2. Scholes, John (1998–2019), Direct Functions Reference Card , consultado el 26 de septiembre de 2019.
  3. Scholes, John (abril de 2001). "D: Un subconjunto funcional de Dyalog APL" . Vector . 17 (4) . Recuperado el 21 de septiembre de 2019 .
  4. Scholes, John (13 de septiembre de 2009). Introducción a las funciones D: 1 de 2 (vídeo). Conferencia de usuarios de Dyalog '09 . Consultado el 21 de septiembre de 2019 .
  5. Scholes, John (13 de septiembre de 2009). Introducción a las funciones D: 2 de 2 (vídeo). Conferencia de usuarios de Dyalog '09 . Consultado el 21 de septiembre de 2019 .
  6. 1 2 3 Scholes, John (31 de octubre de 2018). Dfns: pasado, presente y futuro (video). Reunión de usuarios de Dyalog '18 . Recuperado el 21 de septiembre de 2019 .
  7. 1 2 3 Scholes, John (31 de octubre de 2018), Dfns: pasado, presente y futuro (texto) (PDF) , Reunión de usuarios de Dyalog '18 , consultado el 21 de septiembre de 2019
  8. Scholes, John (1998–2019), Direct Functions Workspace , consultado el 15 de septiembre de 2019.
  9. 1 2 3 4 5 6 Hui, Roger; Kromberg, Morten (junio de 2020). "APL desde 1978" . Actas de la ACM sobre lenguajes de programación . 4 (HOPL): 1–108 . doi : 10.1145/3386319 . S2CID 218517570 . 
  10. 1 2 3 4 Hui, Roger (27 de noviembre de 2016), Una historia de APL en 50 funciones , consultado el 17 de septiembre de 2019
  11. 1 2 Hui, Roger (18 de julio de 2016), Ejercicios APL , consultado el 24 de septiembre de 2019
  12. Weisstein, Eric W., El número de Bertelsen , MathWorld, un recurso web de Wolfram , consultado el 26 de septiembre de 2019.
  13. Scholes, John (1998–2019), "Factorial" , DFNS Workspace , consultado el 20 de septiembre de 2019.
  14. Scholes, John (1998–2019), "Determinante" , DFNS Workspace , consultado el 20 de septiembre de 2019.
  15. Weisstein, Eric W., Función de partición P, ecuación 11 , MathWorld, un recurso web de Wolfram , consultado el 3 de octubre de 2019.
  16. Hardy, GH; Ramanujan, S. (1918), "Asymptotic Formulæ in Combinatory Analysis" (PDF) , Proceedings of the London Mathematical Society , 17 (2) , consultado el 24 de diciembre de 2019.
  17. Aho, AV ; Hopcroft, JE ; Ullman, JD (1974), El diseño y análisis de algoritmos informáticos , Addison-Wesley, Bibcode : 1974daca.book.....A
  18. Bentley, Jon (agosto de 1983). "Perlas de programación". Communications of the ACM . 26 (8 y 9).
  19. 1 2 3 Dyalog (15 de agosto de 2019). Guía de referencia de programación de Dyalog, versión 17.1, Dfns & Dops, págs. 133-147 (PDF) . Dyalog Ltd. Recuperado el 30 de septiembre de 2019 .
  20. Iverson, Kenneth E. (1974), "Capítulo 10, Definición formal de funciones" , Funciones elementales , IBM Corporation , consultado el 18 de septiembre de 2019.
  21. Iverson, Kenneth E. (agosto de 1980). "La notación como herramienta del pensamiento" . Communications of the ACM . 23 (8): 444– 465. doi : 10.1145/358896.358899 . Recuperado el 8 de abril de 2016 .
  22. Iverson, Kenneth E. (1976). Análisis elemental . APL Press.
  23. Orth, DL (1976). Cálculo en una nueva clave . APL Press.
  24. Hui, Roger (mayo de 1987). "Algunos usos de { y }" . Actas de la conferencia APL 87. Consultado el 15 de abril de 2016 .
  25. McDonnell, EE (mayo de 1987), "La vida: desagradable, brutal y corta" , Actas de la conferencia APL 87 , consultado el 6 de octubre de 2019.
  26. Iverson, Kenneth E. (26 de abril de 1978), "Operadores y funciones" , Informe de investigación número #RC7091 , IBM Corporation , consultado el 19 de septiembre de 2019.
  27. Iverson, Kenneth E. ; Wooster, Peter (septiembre de 1981). "Un operador de definición de función". Actas de la conferencia APL81, APL Quote Quad . 12 (1).
  28. Cheney, Carl M. (marzo de 1981), Manual de referencia del sistema de matriz anidada APL*Plus (PDF) , STSC, Inc. , consultado el 18 de septiembre de 2019.
  29. Iverson, Kenneth E. (6 de enero de 1983), Rationalized APL , IP Sharp Associates , consultado el 19 de septiembre de 2019.
  30. Iverson, Kenneth E. (septiembre de 1987). "Un diccionario de APL" . APL Quote Quad . 18 (1): 5– 40. doi : 10.1145/36983.36984 . S2CID 18301178. Recuperado el 19 de septiembre de 2019 . 
  31. 1 2 Bunda, John (mayo de 1987). "Notación de definición de funciones APL". Actas de la conferencia APL87, APL Quote Quad . 17 (4).
  32. Hui, Roger ; et al. (julio de 1990). "¿APL\?" . Actas de la conferencia sobre APL 90: Para el futuro . Vol. 20. págs. 192–200 . doi : 10.1145/97808.97845 . ISBN    089791371X. S2CID 235453656 . Consultado el 10-09-2019 . 
  33. Wadler, Philip L.; et al. (1 de enero de 1989). "Número especial sobre programación funcional". The Computer Journal . 32 (2). 
  34. Dyalog (septiembre de 2008). "Dyalog a los 25" (PDF) . Vector . Consultado el 20 de septiembre de 2019 .
  35. Smith, Bob (2006–2019), NARS2000 , consultado el 18 de septiembre de 2019
  36. Nickolov, Nick (septiembre de 2013). "Compilación de APL a JavaScript" . Vector . 26 (1) . Recuperado el 19 de septiembre de 2019 .
  37. Hsu, Aaron (2019). Un compilador paralelo de datos alojado en una GPU (PDF) (tesis doctoral). Universidad de Indiana . Recuperado el 25 de diciembre de 2019 .
  • Sitio web oficial , Dyalog