Serie matemática, tome por ejemplo la secuencia consecutiva representada aquí como una matriz:
my @seq = my $a=0, {++$a} ... *;
for @seq[^10].kv {state $f=0; ($^k < 4 or $^k > 7) ?? say "a$^k = " ~ $^v !! (say "..." if $f ne 1; $f=1) };
Huellas dactilares:
a0 = 0
a1 = 1
a2 = 2
...
a8 = 8
a9 = 9
Mis preguntas: 1- ¿Hay una manera simple de eliminar solo el primer elemento, es decir, a0 = 0
de la salida impresa?
2- ¿Podría este código hacerse más idiomático?
Gracias.
Respuestas:
Una solución básica
Comencemos con una solución muy simple para imprimir la esencia de una secuencia. No trata los detalles que ha agregado a su pregunta, pero es un buen punto de partida:
A diferencia
.kv
, lo que convierte su invocante en la formakey1, value1, key2, value2, key3, value3, ...
, es decir, 6 elementos si su invocante contiene 3 elementos,.pairs
convierte su invocante en la formakey1 => value1, key2 => value2, key3 => value3, ...
.Lo usé en
.pairs
lugar de en.kv
parte porque significaba que podría usarlo».gist
más adelante en el código para obtener sin esfuerzo una buenakey1 => value1
visualización de cada elemento. Lo modificaremos a continuación, pero este es un buen comienzo idiomático.Las llamadas
.head
y.tail
son la forma idiomática de crear pequeñas listas de los primeros y últimos N elementos de una lista de invocadores (siempre que no sea vago; más sobre eso en un momento).Dada esta solución inicial,
say seq-range-gist (0,1 ... Inf)[^10]
muestra:A continuación, queremos poder "soltar solo el primer elemento ... de la salida impresa". Desafortunadamente
say seq-range-gist (0,1 ... Inf)[1..9]
muestra:Queremos que el número a la izquierda del
=>
retenga la numeración de la secuencia original. Para habilitar esto, dividimos la secuencia subyacente del rango que queremos extraer. Agregamos un segundo parámetro / argumento@range
, y agregamos[@range]
a la segunda línea del sub:Ahora podemos escribir
say seq-range-gist (0,1 ... Inf), 1..9
para mostrar:En su pregunta, utilizó el formato en
aINDEX = VALUE
lugar deINDEX => VALUE
. Para permitir la personalización de la esencia, agregamos un tercer&gist
parámetro / argumento de rutina e invocamos eso en lugar del.gist
método incorporado :Observe cómo las invocaciones de "método" en el cuerpo de
seq-range-gist
sub son ahora.&gist
, no.gist
. La sintaxis.&foo
invoca un sub&foo
(que generalmente se invoca escribiendo solofoo
), pasando el invocante a la izquierda del.
como un$_
argumento para el sub.Tenga en cuenta también que he hecho que el
&gist
parámetro tenga un nombre precediéndolo con un:
.Entonces ahora
say seq-range-gist (0,1 ... Inf), 1..9, gist => { "a{.key} = {.value}" }
muestra:Agregar esmalte
El resto de esta respuesta es material adicional para los lectores que se preocupan por el esmalte.
say seq-range-gist (0, 1, 2, 3), ^3
muestra:Ups E incluso si hubiera más pares que la cabeza y la cola combinados, por lo que al menos no obtuvimos líneas repetidas, aún sería inútil usar el
head, ..., tail
enfoque para eludir solo uno o dos elementos. Cambiemos la última declaración en el sub cuerpo para eliminar estos problemas:A continuación, sería bueno que el submarino hiciera algo útil si se llama sin un rango o esencia. Sobre todo que podemos arreglar que al dar a las
@range
y&gist
los parámetros por defecto adecuados:Si no
@seq
es perezoso , el valor predeterminado es el rango completo de . Si es infinito (en cuyo caso también es vago), entonces el valor predeterminado de hasta 100 está bien. Pero, ¿qué pasa si es perezoso pero produce menos de 100 valores definidos? Para cubrir este caso, adjuntamos a la declaración:@range
@seq
@seq
@seq
.grep: *.value.defined
@pairs
Otra mejora simple serían los parámetros opcionales de cabeza y cola, lo que llevaría a una solución final pulida:
fuente
...
parte que hace que se parezca más a un programa en C. Entonces esto responde a ambas partes de mi pregunta, de verdad. En cuanto a la solución 'integral', se ve un poco intimidante, realmente.Puede omitir los primeros valores de N en cualquiera
Iterable
oSequence
conskip
:Si no especifica un número, se saltará solo un elemento.
fuente
skip
parece eliminar solo la salida, es decir, el elemento con el índice 0 (a0) permanece. Lo intenté@seq:delete
y simplemente reemplacé el elemento 0 con(Any)
skip
solo actuará como si no existen los elementos omitidos. Esto puede o no ser lo que quieres :-)skip
en el medio para que se lea:for @seq[^10].skip(0).kv
que , literalmente, no omitir el elemento 0th y no importa si me dan como argumento paraskip
1 o 2, que sólo distorsiona la salida desde ese momento. Necesito una forma práctica de eliminar el elemento 0 desde cero.for @seq[^10].kv.skip(2)
es lo que estás buscando?skip
after.kv
pero usando argumentos distintos de 2, por lo que no funcionó. Gracias por la solución.Esto podría ser un poco más idiomático:
No necesita usar una variable léxica dentro de la secuencia; Las variables de marcador de posición
Whatever
o bien se pueden usar con seguridad dentro de las secuencias. Luego, simplemente puede seleccionar los elementos de la secuencia que desea imprimir. Que vuelve«(0 1 2 3)(7 8 9 10)»
fuente
whatever
operador se está actualizando pero la salida de serie / secuencia no aborda el problema principal. Me gustaría imprimir la serie tal como se ve en los libros de texto de matemáticas, es decir, con...
notación intermedia.