LISP - Secuencias
La secuencia es un tipo de datos abstracto en LISP. Los vectores y las listas son los dos subtipos concretos de este tipo de datos. Todas las funcionalidades definidas en el tipo de datos de secuencia se aplican realmente a todos los tipos de vectores y listas.
En esta sección, discutiremos las funciones más comúnmente utilizadas en secuencias.
Antes de comenzar con varias formas de manipular secuencias (es decir, vectores y listas), echemos un vistazo a la lista de todas las funciones disponibles.
Crear una secuencia
La función make-sequence le permite crear una secuencia de cualquier tipo. La sintaxis de esta función es:
make-sequence sqtype sqsize &key :initial-element
Crea una secuencia de tipo sqtype y de longitud sqsize.
Opcionalmente, puede especificar algún valor usando el argumento : initial-element , luego cada uno de los elementos se inicializará con este valor.
Por ejemplo, cree un nuevo archivo de código fuente llamado main.lisp y escriba el siguiente código en él.
(write (make-sequence '(vector float)
10
:initial-element 1.0))
Cuando ejecuta el código, devuelve el siguiente resultado:
#(1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0)
Funciones genéricas en secuencias
No Señor. | Función descriptiva |
---|---|
1 | elt Permite el acceso a elementos individuales a través de un índice entero. |
2 | length Devuelve la longitud de una secuencia. |
3 | subseq Devuelve una subsecuencia extrayendo la subsecuencia comenzando en un índice particular y continuando hasta un índice final particular o el final de la secuencia. |
4 | copy-seq Devuelve una secuencia que contiene los mismos elementos que su argumento. |
5 | fill Se utiliza para establecer varios elementos de una secuencia en un solo valor. |
6 | replace Se necesitan dos secuencias y la primera secuencia de argumentos se modifica de forma destructiva copiando en ella elementos sucesivos de la segunda secuencia de argumentos. |
7 | count Toma un elemento y una secuencia y devuelve el número de veces que el elemento aparece en la secuencia. |
8 | reverse Devuelve una secuencia que contiene los mismos elementos del argumento pero en orden inverso. |
9 | nreverse Devuelve la misma secuencia que contiene los mismos elementos que la secuencia pero en orden inverso. |
10 | concatenate Crea una nueva secuencia que contiene la concatenación de cualquier número de secuencias. |
11 | position Toma un elemento y una secuencia y devuelve el índice del elemento en la secuencia o nulo. |
12 | find Se necesita un elemento y una secuencia. Encuentra el elemento en la secuencia y lo devuelve, si no lo encuentra, devuelve nil. |
13 | sort Toma una secuencia y un predicado de dos argumentos y devuelve una versión ordenada de la secuencia. |
14 | merge Toma dos secuencias y un predicado y devuelve una secuencia producida al fusionar las dos secuencias, de acuerdo con el predicado. |
15 | map Toma una función de n argumentos yn secuencias y devuelve una nueva secuencia que contiene el resultado de aplicar la función a los elementos subsiguientes de las secuencias. |
dieciséis | some Toma un predicado como argumento e itera sobre la secuencia del argumento, y devuelve el primer valor no NIL devuelto por el predicado o devuelve falso si el predicado nunca se satisface. |
17 | every Toma un predicado como argumento e itera sobre la secuencia del argumento, termina y devuelve falso tan pronto como falla el predicado. Si el predicado siempre se satisface, devuelve verdadero. |
18 | notany Toma un predicado como argumento e itera sobre la secuencia del argumento, y devuelve falso tan pronto como se satisfaga el predicado o verdadero si nunca lo es. |
19 | notevery Toma un predicado como argumento e itera sobre la secuencia del argumento, y devuelve verdadero tan pronto como el predicado falla o falso si el predicado siempre se satisface. |
20 | reduce Se mapea sobre una sola secuencia, aplicando una función de dos argumentos primero a los dos primeros elementos de la secuencia y luego al valor devuelto por la función y los elementos subsiguientes de la secuencia. |
21 | search Busca una secuencia para localizar uno o más elementos que satisfacen alguna prueba. |
22 | remove Toma un elemento y una secuencia y devuelve la secuencia con instancias de elemento eliminado. |
23 | delete Esto también toma un elemento y una secuencia y devuelve una secuencia del mismo tipo que la secuencia de argumentos que tiene los mismos elementos excepto el elemento. |
24 | substitute Toma un artículo nuevo, un artículo existente y una secuencia y devuelve una secuencia con instancias del artículo existente reemplazado por el nuevo artículo. |
25 | nsubstitute Toma un artículo nuevo, un artículo existente y una secuencia y devuelve la misma secuencia con instancias del artículo existente reemplazado por el nuevo artículo. |
26 | mismatch Toma dos secuencias y devuelve el índice del primer par de elementos no coincidentes. |
Argumentos de palabras clave de función de secuencia estándar
Argumento | Sentido | Valor por defecto |
---|---|---|
:prueba | Es una función de dos argumentos que se utiliza para comparar el elemento (o el valor extraído por: función clave) con el elemento. | EQL |
:llave | Función de un argumento para extraer el valor clave del elemento de secuencia real. NIL significa usar el elemento tal cual. | NULO |
:comienzo | Índice de inicio (incluido) de la subsecuencia. | 0 |
:fin | Índice final (exclusivo) de la subsecuencia. NIL indica el final de la secuencia. | NULO |
: desde el final | Si es verdadero, la secuencia se recorrerá en orden inverso, de principio a fin. | NULO |
:contar | Número que indica el número de elementos a eliminar o sustituir o NULO para indicar todos (sólo QUITAR y SUSTITUIR). | NULO |
Acabamos de discutir varias funciones y palabras clave que se utilizan como argumentos en estas funciones que trabajan en secuencias. En las siguientes secciones, veremos cómo usar estas funciones usando ejemplos.
Encontrar longitud y elemento
los length La función devuelve la longitud de una secuencia y la elt La función le permite acceder a elementos individuales usando un índice entero.
Ejemplo
Cree un nuevo archivo de código fuente llamado main.lisp y escriba el siguiente código en él.
(setq x (vector 'a 'b 'c 'd 'e))
(write (length x))
(terpri)
(write (elt x 3))
Cuando ejecuta el código, devuelve el siguiente resultado:
5
D
Modificar secuencias
Algunas funciones de secuencia permiten iterar a través de la secuencia y realizar algunas operaciones como buscar, eliminar, contar o filtrar elementos específicos sin escribir bucles explícitos.
El siguiente ejemplo demuestra esto:
Ejemplo 1
Cree un nuevo archivo de código fuente llamado main.lisp y escriba el siguiente código en él.
(write (count 7 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (remove 5 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (delete 5 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (substitute 10 7 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (find 7 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (position 5 '(1 5 6 7 8 9 2 7 3 4 5)))
Cuando ejecuta el código, devuelve el siguiente resultado:
2
(1 6 7 8 9 2 7 3 4)
(1 6 7 8 9 2 7 3 4)
(1 5 6 10 8 9 2 10 3 4 5)
7
1
Ejemplo 2
Cree un nuevo archivo de código fuente llamado main.lisp y escriba el siguiente código en él.
(write (delete-if #'oddp '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (delete-if #'evenp '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (remove-if #'evenp '(1 5 6 7 8 9 2 7 3 4 5) :count 1 :from-end t))
(terpri)
(setq x (vector 'a 'b 'c 'd 'e 'f 'g))
(fill x 'p :start 1 :end 4)
(write x)
Cuando ejecuta el código, devuelve el siguiente resultado:
(6 8 2 4)
(1 5 7 9 7 3 5)
(1 5 6 7 8 9 2 7 3 5)
#(A P P P E F G)
Ordenar y fusionar secuencias
Las funciones de clasificación toman una secuencia y un predicado de dos argumentos y devuelven una versión ordenada de la secuencia.
Ejemplo 1
Cree un nuevo archivo de código fuente llamado main.lisp y escriba el siguiente código en él.
(write (sort '(2 4 7 3 9 1 5 4 6 3 8) #'<))
(terpri)
(write (sort '(2 4 7 3 9 1 5 4 6 3 8) #'>))
(terpri)
Cuando ejecuta el código, devuelve el siguiente resultado:
(1 2 3 3 4 4 5 6 7 8 9)
(9 8 7 6 5 4 4 3 3 2 1)
Ejemplo 2
Cree un nuevo archivo de código fuente llamado main.lisp y escriba el siguiente código en él.
(write (merge 'vector #(1 3 5) #(2 4 6) #'<))
(terpri)
(write (merge 'list #(1 3 5) #(2 4 6) #'<))
(terpri)
Cuando ejecuta el código, devuelve el siguiente resultado:
#(1 2 3 4 5 6)
(1 2 3 4 5 6)
Predicados de secuencia
Las funciones every, some, notany y notevery se denominan predicados de secuencia.
Estas funciones iteran sobre secuencias y prueban el predicado booleano.
Todas estas funciones toman un predicado como primer argumento y los argumentos restantes son secuencias.
Ejemplo
Cree un nuevo archivo de código fuente llamado main.lisp y escriba el siguiente código en él.
(write (every #'evenp #(2 4 6 8 10)))
(terpri)
(write (some #'evenp #(2 4 6 8 10 13 14)))
(terpri)
(write (every #'evenp #(2 4 6 8 10 13 14)))
(terpri)
(write (notany #'evenp #(2 4 6 8 10)))
(terpri)
(write (notevery #'evenp #(2 4 6 8 10 13 14)))
(terpri)
Cuando ejecuta el código, devuelve el siguiente resultado:
T
T
NIL
NIL
T
Mapeo de secuencias
Ya hemos discutido las funciones de mapeo. Similarmente elmap función le permite aplicar una función a elementos subsiguientes de una o más secuencias.
los map función toma una función de n argumentos yn secuencias y devuelve una nueva secuencia después de aplicar la función a los elementos subsiguientes de las secuencias.
Ejemplo
Cree un nuevo archivo de código fuente llamado main.lisp y escriba el siguiente código en él.
(write (map 'vector #'* #(2 3 4 5) #(3 5 4 8)))
Cuando ejecuta el código, devuelve el siguiente resultado:
#(6 15 16 40)