LISP - Sequências

Sequência é um tipo de dados abstrato em LISP. Vetores e listas são os dois subtipos concretos desse tipo de dados. Todas as funcionalidades definidas no tipo de dados de sequência são aplicadas em todos os vetores e tipos de lista.

Nesta seção, discutiremos as funções mais comumente usadas em sequências.

Antes de iniciar as várias maneiras de manipular sequências (ou seja, vetores e listas), vamos dar uma olhada na lista de todas as funções disponíveis.

Criando uma sequência

A função make-sequence permite criar uma sequência de qualquer tipo. A sintaxe para esta função é -

make-sequence sqtype sqsize &key :initial-element

Ele cria uma sequência do tipo sqtype e do comprimento sqsize.

Você pode opcionalmente especificar algum valor usando o argumento : initial-element , então cada um dos elementos será inicializado com este valor.

Por exemplo, crie um novo arquivo de código-fonte denominado main.lisp e digite o seguinte código nele.

(write (make-sequence '(vector float) 
   10 
   :initial-element 1.0))

Quando você executa o código, ele retorna o seguinte resultado -

#(1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0)

Funções genéricas em sequências

Sr. Não. Descrição da função
1

elt

Ele permite o acesso a elementos individuais por meio de um índice inteiro.

2

length

Ele retorna o comprimento de uma sequência.

3

subseq

Ele retorna uma subseqüência extraindo a subsequência começando em um índice específico e continuando até um índice final específico ou o final da seqüência.

4

copy-seq

Ele retorna uma sequência que contém os mesmos elementos de seu argumento.

5

fill

É usado para definir vários elementos de uma sequência com um único valor.

6

replace

Leva duas sequências e a primeira sequência de argumentos é modificada destrutivamente pela cópia de elementos sucessivos da segunda sequência de argumentos.

7

count

Ele pega um item e uma sequência e retorna o número de vezes que o item aparece na sequência.

8

reverse

Ele retorna uma sequência que contém os mesmos elementos do argumento, mas na ordem inversa.

9

nreverse

Ele retorna a mesma sequência contendo os mesmos elementos da sequência, mas na ordem inversa.

10

concatenate

Ele cria uma nova sequência contendo a concatenação de qualquer número de sequências.

11

position

Ele pega um item e uma sequência e retorna o índice do item na sequência ou nulo.

12

find

Leva um item e uma sequência. Ele encontra o item na sequência e o retorna; se não for encontrado, ele retorna nulo.

13

sort

Ele pega uma sequência e um predicado de dois argumentos e retorna uma versão classificada da sequência.

14

merge

Ele pega duas sequências e um predicado e retorna uma sequência produzida pela fusão das duas sequências, de acordo com o predicado.

15

map

Ele recebe uma função de n argumentos en sequências e retorna uma nova sequência contendo o resultado da aplicação da função aos elementos subsequentes das sequências.

16

some

Ele pega um predicado como um argumento e itera sobre a sequência do argumento e retorna o primeiro valor não NIL retornado pelo predicado ou retorna falso se o predicado nunca for satisfeito.

17

every

Ele pega um predicado como um argumento e itera sobre a sequência do argumento, ele termina, retornando falso, assim que o predicado falha. Se o predicado for sempre satisfeito, ele retorna verdadeiro.

18

notany

Ele pega um predicado como um argumento e itera sobre a sequência de argumentos, e retorna falso assim que o predicado for satisfeito ou verdadeiro se nunca for.

19

notevery

Ele pega um predicado como um argumento e itera sobre a sequência de argumentos, e retorna verdadeiro assim que o predicado falha ou falso se o predicado é sempre satisfeito.

20

reduce

Ele mapeia em uma única sequência, aplicando uma função de dois argumentos primeiro aos dois primeiros elementos da sequência e, em seguida, ao valor retornado pela função e aos elementos subsequentes da sequência.

21

search

Ele pesquisa uma sequência para localizar um ou mais elementos que satisfaçam algum teste.

22

remove

Ele pega um item e uma sequência e retorna a sequência com instâncias do item removido.

23

delete

Isso também pega um item e uma sequência e retorna uma sequência do mesmo tipo que a sequência de argumentos que possui os mesmos elementos, exceto o item.

24

substitute

Ele pega um novo item, um item existente e uma sequência e retorna uma sequência com instâncias do item existente substituídas pelo novo item.

25

nsubstitute

Ele pega um novo item, um item existente e uma sequência e retorna a mesma sequência com instâncias do item existente substituídas pelo novo item.

26

mismatch

Leva duas sequências e retorna o índice do primeiro par de elementos incompatíveis.

Argumentos de palavra-chave da função de sequência padrão

Argumento Significado Valor padrão
:teste É uma função de dois argumentos usada para comparar o item (ou valor extraído por: função da tecla) com o elemento. EQL
:chave Função de um argumento para extrair o valor da chave do elemento de sequência real. NIL significa usar o elemento como está. NADA
:começar Índice inicial (inclusive) de subsequência. 0
:fim Índice final (exclusivo) da subsequência. NIL indica o fim da sequência. NADA
: do fim Se verdadeiro, a sequência será percorrida na ordem inversa, do fim ao início. NADA
:contagem Número que indica o número de elementos a serem removidos ou substituídos ou NIL para indicar todos (REMOVER e SUBSTITUIR apenas). NADA

Acabamos de discutir várias funções e palavras-chave que são usadas como argumentos nessas funções que trabalham em sequências. Nas próximas seções, veremos como usar essas funções usando exemplos.

Encontrando Comprimento e Elemento

o length função retorna o comprimento de uma sequência, e o elt A função permite que você acesse elementos individuais usando um índice inteiro.

Exemplo

Crie um novo arquivo de código-fonte denominado main.lisp e digite o seguinte código nele.

(setq x (vector 'a 'b 'c 'd 'e))
(write (length x))
(terpri)
(write (elt x 3))

Quando você executa o código, ele retorna o seguinte resultado -

5
D

Modificando Sequências

Algumas funções de sequência permitem iterar através da sequência e realizar algumas operações, como pesquisar, remover, contar ou filtrar elementos específicos sem escrever loops explícitos.

O exemplo a seguir demonstra isso -

Exemplo 1

Crie um novo arquivo de código-fonte denominado main.lisp e digite o seguinte código nele.

(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)))

Quando você executa o código, ele retorna o seguinte 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

Exemplo 2

Crie um novo arquivo de código-fonte denominado main.lisp e digite o seguinte código nele.

(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)

Quando você executa o código, ele retorna o seguinte 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)

Classificando e mesclando sequências

As funções de classificação pegam uma sequência e um predicado de dois argumentos e retornam uma versão classificada da sequência.

Exemplo 1

Crie um novo arquivo de código-fonte denominado main.lisp e digite o seguinte código nele.

(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)

Quando você executa o código, ele retorna o seguinte resultado -

(1 2 3 3 4 4 5 6 7 8 9)
(9 8 7 6 5 4 4 3 3 2 1)

Exemplo 2

Crie um novo arquivo de código-fonte denominado main.lisp e digite o seguinte código nele.

(write (merge 'vector #(1 3 5) #(2 4 6) #'<))
(terpri)
(write (merge 'list #(1 3 5) #(2 4 6) #'<))
(terpri)

Quando você executa o código, ele retorna o seguinte resultado -

#(1 2 3 4 5 6)
(1 2 3 4 5 6)

Predicados de sequência

As funções every, some, notany e notevery são chamadas de predicados de sequência.

Essas funções iteram em sequências e testam o predicado booleano.

Todas essas funções recebem um predicado como o primeiro argumento e os argumentos restantes são sequências.

Exemplo

Crie um novo arquivo de código-fonte denominado main.lisp e digite o seguinte código nele.

(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)

Quando você executa o código, ele retorna o seguinte resultado -

T
T
NIL
NIL
T

Mapeando Sequências

Já discutimos as funções de mapeamento. Da mesma forma omap função permite que você aplique uma função em elementos subsequentes de uma ou mais sequências.

o map function recebe uma função de n argumentos en sequências e retorna uma nova sequência após aplicar a função aos elementos subsequentes das sequências.

Exemplo

Crie um novo arquivo de código-fonte denominado main.lisp e digite o seguinte código nele.

(write (map 'vector #'* #(2 3 4 5) #(3 5 4 8)))

Quando você executa o código, ele retorna o seguinte resultado -

#(6 15 16 40)