Una plantilla es una lista de instrucciones o una lista de expresiones que usa sus propias variables o "encajes". Se pueden utilizar tres formas diferentes de plantillas.
» Tipos de Plantillas » Signo de Interrogación
La forma más común de utilizar una plantilla es el "signo de interrogación".
En este ejemplo, el comando invoca usa la plantilla para procesar los números 3 y 5 respectivamente:
muestra invoca [? * ?] 3
9
muestra invoca [? * ?] 5
25
Ya que aplica recibe una lista como dato, la plantilla puede contener ?1, ?2, etc. para referirse a los diferentes elementos de la lista:
muestra aplica [?1 - ?2] [10 1]
9
muestra aplica [?1 - ?2] [100 1]
99
» Tipos de Plantillas » Nombre de Procedimiento
La segunda forma de plantilla es la forma conocida como "nombre de procedimiento".
Si la plantilla es una palabra en vez de una lista, se toma como nombre de un procedimiento. Este procedimiento debe aceptar un número de entradas igual que el número de datos dados; el procedimiento se aplica a los datos disponibles. Esto significa, que si los datos ?1, ?2 y ?3 están disponibles, la plantilla "PROC es equivalente a (PROC ?1 ?2 ?3).
muestra invoca "cos 0
1
muestra aplica "cociente [10 5]
2
muestra aplica "producto [2 3 5 7]
210
» Tipos de Plantillas » Variables con nombre
La tercera forma de la plantilla con "variables con nombre". El primer elemento de la plantilla debe ser una lista de nombres de variables a usarse; los datos disponibles se asignan en orden, a esos nombres. El número de nombres tiene que ser igual al número de datos disponibles. Esta forma se necesita principalmente cuando se quiere una plantilla dentro de otra, y la notación ? podría ser ambigua en la plantilla más interna.
muestra invoca [[x] cos :x] 0
1
muestra aplica [[x y] potencia :x :y] [10 3]
1000
muestra aplica [[x y] potencia :y :x] [10 3]
59049
muestra aplica [[y x] potencia :x :y] [10 3]
59049
muestra invoca [[x] invoca [[y] :x * :y] :x + 10] 100
11000
recorrido P L invoca una plantilla P sobre cada elemento de una lista L dada. Devuelve una lista cuyo primer elemento es la lista dada y cuyo segundo elemento es la lista generada de la aplicación de la plantilla P.
muestra dominio [-3 3 7]
[-3 -2 -1 0 1 2 3]
muestra recorrido [cambiasigno ?] dominio [-3 3 7]
[[-3 -2 -1 0 1 2 3] [3 2 1 0 -1 -2 -3]]
escribe html recorrido [cambiasigno ?] dominio [-3 3 7]
-3 | -2 | -1 | 0 | 1 | 2 | 3 |
3 | 2 | 1 | 0 | -1 | -2 | -3 |
escribe html recorrido [2 * ?] dominio [-3 3 7]
-3 | -2 | -1 | 0 | 1 | 2 | 3 |
-6 | -4 | -2 | 0 | 2 | 4 | 6 |
escribe html recorrido [? * ?] dominio [-3 3 7]
-3 | -2 | -1 | 0 | 1 | 2 | 3 |
9 | 4 | 1 | 0 | 1 | 4 | 9 |
muestra serie [0 90 5]
[0 90 180 270 360]
muestra recorrido [[x] cos :x] serie [0 90 5]
[[0 90 180 270 360] [1 6.1257422745431e-17 -1 -1.83772268236293e-16 1]]
escribe html recorrido [[x] cos :x] serie [0 90 5]
0 | 90 | 180 | 270 | 360 |
1 | 6.1257422745431e-17 | -1 | -1.83772268236293e-16 | 1 |
tabula [P P P ...] L invoca una serie de plantillas sobre cada elemento de una lista dada. Devuelve una lista de listas de los resultados de la aplicación de las plantillas.
muestra dominio [-3 3 7]
[-3 -2 -1 0 1 2 3]
muestra tabula [? [cambiasigno ?] [3 * ?] [? * ?]] dominio [-3 3 7]
[[-3 -2 -1 0 1 2 3] [3 2 1 0 -1 -2 -3] [-9 -6 -3 0 3 6 9] [9 4 1 0 1 4 9]]
escribe html tabula [? [cambiasigno ?] [3 * ?] [? * ?]] dominio [-3 3 7]
-3 | -2 | -1 | 0 | 1 | 2 | 3 |
3 | 2 | 1 | 0 | -1 | -2 | -3 |
-9 | -6 | -3 | 0 | 3 | 6 | 9 |
9 | 4 | 1 | 0 | 1 | 4 | 9 |
reitera [FA1 FA2 ...] [E1 E2 ...], procesa la lista de elementos E1, E2, etc. utilizando la lista de funciones abstractas FA1, FA2, etc.
FA1, puede utilizar cualquier elemento de la lista de elementos, para calcular el siguiente valor de E1,
FA2, puede utilizar cualquier elemento de la lista de elementos, para calcular el siguiente valor de E2, etc.
Los resultados de aplicar FA1, FA2, etc. sobre la lista de elementos produce una nueva lista de elementos: E1 producto de la aplicación de FA1, E2 producto de la aplicación de FA2, etcetera, la cual es nuevamente procesada por la lista de funciones abstractas.
Este proceso se repite hasta que E1 sea 0.
Ejemplos:
muestra ultimo reitera [[dec $0] [ponprimero $0 $1]] [5 []]
=> [4 [5]]
=> [3 [4 5]]
=> [2 [3 4 5]]
=> [1 [2 3 4 5]]
=> [0 [1 2 3 4 5]]
[1 2 3 4 5]
muestra ultimo reitera [[dec $0] [producto $0 $1]] [5 1]
=> [4 5]
=> [3 20]
=> [2 60]
=> [1 120]
=> [0 120]
120
Por defecto, reitera no muestra los pasos parciales para alcanzar la lista de elementos final. Para que esto ocurra la variable global "reitera.pasos:" debe ser diferente de 0.
» Reitera » números de Fibonacci
muestra ultimo reitera [[dec $0] [ultimo $2] [ponultimo ($1 + ultimo $2) $2]] [15 0 [1]]
=> [14 1 [1 1]]
=> [13 1 [1 1 2]]
=> [12 2 [1 1 2 3]]
=> [11 3 [1 1 2 3 5]]
=> [10 5 [1 1 2 3 5 8]]
=> [9 8 [1 1 2 3 5 8 13]]
=> [8 13 [1 1 2 3 5 8 13 21]]
=> [7 21 [1 1 2 3 5 8 13 21 34]]
=> [6 34 [1 1 2 3 5 8 13 21 34 55]]
=> [5 55 [1 1 2 3 5 8 13 21 34 55 89]]
=> [4 89 [1 1 2 3 5 8 13 21 34 55 89 144]]
=> [3 144 [1 1 2 3 5 8 13 21 34 55 89 144 233]]
=> [2 233 [1 1 2 3 5 8 13 21 34 55 89 144 233 377]]
=> [1 377 [1 1 2 3 5 8 13 21 34 55 89 144 233 377 610]]
=> [0 610 [1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987]]
[1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987]
» Reitera » máximo común divisor
muestra ultimo reitera [[modulo $1 $0] $0] [450 370]
=> [370 450]
=> [80 370]
=> [50 80]
=> [30 50]
=> [20 30]
=> [10 20]
=> [0 10]
10
muestra ultimo reitera [[modulo $1 $0] $0] [503346470 313764033]
=> [313764033 503346470]
=> [189582437 313764033]
=> [124181596 189582437]
=> [65400841 124181596]
=> [58780755 65400841]
=> [6620086 58780755]
=> [5820067 6620086]
=> [800019 5820067]
=> [219934 800019]
=> [140217 219934]
=> [79717 140217]
=> [60500 79717]
=> [19217 60500]
=> [2849 19217]
=> [2123 2849]
=> [726 2123]
=> [671 726]
=> [55 671]
=> [11 55]
=> [0 11]
11
» Reitera » Triángulo de Pascal 1
muestra ultimo reitera [[dec $0] [transpon "adicion desliza duplica $1] [ponultimo $1 $2]] [10 [1] []]
[[1]
[1 1]
[1 2 1]
[1 3 3 1]
[1 4 6 4 1]
[1 5 10 10 5 1]
[1 6 15 20 15 6 1]
[1 7 21 35 35 21 7 1]
[1 8 28 56 70 56 28 8 1]
[1 9 36 84 126 126 84 36 9 1]
[1 10 45 120 210 252 210 120 45 10 1]
[1 11 55 165 330 462 462 330 165 55 11 1]
[1 12 66 220 495 792 924 792 495 220 66 12 1]
[1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1]
[1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1]]
» Reitera » Triángulo de Pascal 2
muestra clona [10 1]
[1 1 1 1 1 1 1 1 1 1]
muestra progresa "mismo "adicion clona [10 1]
[1 2 3 4 5 6 7 8 9 10]
muestra progresa "mismo "adicion [1 2 3 4 5 6 7 8 9 10]
[1 3 6 10 15 21 28 36 45 55]
muestra progresa "mismo "adicion [1 3 6 10 15 21 28 36 45 55]
[1 4 10 20 35 56 84 120 165 220]
haz "m ultimo reitera [[dec $0] [progresa "mismo "adicion $1] [ponultimo $1 $2]] (lista 10 clona [10 1] [])
escribeMat :m
1 1 1 1 1 1 1 1 1 1
1 2 3 4 5 6 7 8 9 10
1 3 6 10 15 21 28 36 45 55
1 4 10 20 35 56 84 120 165 220
1 5 15 35 70 126 210 330 495 715
1 6 21 56 126 252 462 792 1287 2002
1 7 28 84 210 462 924 1716 3003 5005
1 8 36 120 330 792 1716 3432 6435 11440
1 9 45 165 495 1287 3003 6435 12870 24310
1 10 55 220 715 2002 5005 11440 24310 48620
escribeMat desliza :m
1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
0 1 2 3 4 5 6 7 8 9 10 0 0 0 0 0 0 0 0
0 0 1 3 6 10 15 21 28 36 45 55 0 0 0 0 0 0 0
0 0 0 1 4 10 20 35 56 84 120 165 220 0 0 0 0 0 0
0 0 0 0 1 5 15 35 70 126 210 330 495 715 0 0 0 0 0
0 0 0 0 0 1 6 21 56 126 252 462 792 1287 2002 0 0 0 0
0 0 0 0 0 0 1 7 28 84 210 462 924 1716 3003 5005 0 0 0
0 0 0 0 0 0 0 1 8 36 120 330 792 1716 3432 6435 11440 0 0
0 0 0 0 0 0 0 0 1 9 45 165 495 1287 3003 6435 12870 24310 0
0 0 0 0 0 0 0 0 0 1 10 55 220 715 2002 5005 11440 24310 48620
escribeMat impon [primero secciona lista 10] desliza :m
1 1 1 1 1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9
0 0 1 3 6 10 15 21 28 36
0 0 0 1 4 10 20 35 56 84
0 0 0 0 1 5 15 35 70 126
0 0 0 0 0 1 6 21 56 126
0 0 0 0 0 0 1 7 28 84
0 0 0 0 0 0 0 1 8 36
0 0 0 0 0 0 0 0 1 9
0 0 0 0 0 0 0 0 0 1
escribeMat trans impon [primero secciona lista 10] desliza :m
1 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0
1 2 1 0 0 0 0 0 0 0
1 3 3 1 0 0 0 0 0 0
1 4 6 4 1 0 0 0 0 0
1 5 10 10 5 1 0 0 0 0
1 6 15 20 15 6 1 0 0 0
1 7 21 35 35 21 7 1 0 0
1 8 28 56 70 56 28 8 1 0
1 9 36 84 126 126 84 36 9 1