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)