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)