Listas
No Scheme, uma lista é uma estrutura de dados fundamental usada para agrupar valores. Listas são coleções ordenadas de elementos onde cada elemento pode ser de qualquer tipo, incluindo outra lista. As listas são amplamente utilizadas no Scheme tanto para armazenamento de dados quanto para estrutura de programa.
Exemplo 1: Lista Simples
(list 1 2 3)- Cria uma lista de três elementos:
1,2e3.
Resultado: (1 2 3)
Acessando Elementos da Lista
Os elementos de uma lista são acessados usando os procedimentos car e cdr:
carrecupera o primeiro elemento de uma lista.cdrrecupera o resto da lista (tudo exceto o primeiro elemento).
Exemplos
(define my-list (list 1 2 3))
(car my-list) ; Retrieves the first element
(cdr my-list) ; Retrieves the rest of the listResultado:
(car my-list)retorna1(cdr my-list)retorna(2 3)
Recursão simples: iterando por meio de uma lista
Chamando recursivamente car no cdr de uma lista, você pode processar cada elemento um por um até que a lista seja percorrida. This forms the basis of many list-processing algorithms.
Exemplo: Imprimindo cada elemento de uma lista
Aqui está uma função recursiva simples para imprimir todos os elementos de uma lista:
(define (print-elements lst)
(if (null? lst)
(lumi-message "done")
(begin
(lumi-message (number->string (car lst))) ;; Print the first element
(print-elements (cdr lst))))) ;; Process the rest of the list- Caso base: Se a lista estiver vazia (
null? lst), pare a recursão. - Caso recursivo: Imprima o primeiro elemento (
car lst) e depois chame a função no restante da lista (cdr lst).
Exemplo de uso
(print-elements (list 1 2 3))Saída:
-"1"
"2""3"
Resultado: “concluído”
Como funciona
- A função recupera o primeiro elemento da lista usando
care o processa. - Em seguida, ele chama a si mesmo com o restante da lista (
cdr). - Este processo se repete até que a lista fique vazia (
null? lst).
Exemplo 2: Tipos mistos
As listas podem incluir elementos de diferentes tipos, incluindo strings, booleanos, números, outras listas ou até mesmo o resultado de expressões:
(list 42 "hello" #t (list 1 2) (+ 3 4))- Isso cria uma lista com:
- Um número (
42) - Uma string (
"hello") - Um booleano (@LUMI_TOKEN_40@@)
- Outra lista (
(1 2)) - O resultado de uma expressão (
(+ 3 4), que é avaliada como7)
- Um número (
Resultado: (42 "hello" #t (1 2) 7)
Esses exemplos demonstram a versatilidade das listas no Scheme, tornando-as uma ferramenta poderosa para organizar e manipular dados.
Construindo Listas
O procedimento cons é usado para construir uma nova lista combinando um elemento com uma lista existente.
(cons new-element existing-list)Exemplo
(cons 0 (list 1 2 3))- Adiciona
0ao início da lista(1 2 3).
Resultado: (0 1 2 3)
Verificando listas
O procedimento list? verifica se um determinado valor é uma lista.
(list? value)Exemplo: lista?
(list? (list 1 2 3)) ; Checks if (list 1 2 3) is a list
(list? 42) ; Checks if 42 is a listResultado:
(list? (list 1 2 3))retorna#t(verdadeiro)(list? 42)retorna#f(falso)
Operações em listas
O Scheme fornece vários procedimentos integrados para trabalhar com listas, incluindo:
length: Retorna o número de elementos de uma lista.append: Combina duas ou mais listas em uma.reverse: Retorna uma nova lista com elementos em ordem inversa.
(length (list 1 2 3)) ; Returns 3
(append (list 1 2) (list 3 4)) ; Returns (1 2 3 4)
(reverse (list 1 2 3)) ; Returns (3 2 1)Resultado:
(length (list 1 2 3))retorna3(append (list 1 2) (list 3 4))retorna(1 2 3 4)(reverse (list 1 2 3))retorna(3 2 1)#### Usandolist-ref
O procedimento list-ref recupera o elemento em um índice especificado de uma lista (índice baseado em zero).
(list-ref lst index)lst: A lista da qual recuperar o elemento.index: Um índice baseado em zero indicando qual elemento retornar.
Exemplo: ref-lista
(list-ref (list 10 20 30 40) 2) ; Retrieves the element at index 2Resultado: 30
Listas aninhadas
As listas no esquema podem conter outras listas como elementos, criando uma estrutura aninhada.
Exemplo: Criando uma lista aninhada
(define nested-list (list (list 1 2) (list 3 4) (list 5)))- Cria uma lista de três elementos, cada um dos quais é uma lista.
Resultado: ((1 2) (3 4) (5))
Acessando dados aninhados
Para acessar elementos em uma lista aninhada, você pode usar combinações de car e cdr para navegar pela estrutura.
Exemplo: Acessando Elementos
(car nested-list) ; Retrieves the first element: (1 2)
(car (car nested-list)) ; Retrieves the first element of the first sublist: 1
(cdr (car nested-list)) ; Retrieves the rest of the first sublist: (2)
(car (cdr (car nested-list))) ; Retrieves the second element of the first sublist: 2Explicação
car nested-list:- Recupera o primeiro elemento de
nested-list, que é(1 2).
- Recupera o primeiro elemento de
car (car nested-list):- Recupera o primeiro elemento de
(1 2), que é1.
- Recupera o primeiro elemento de
cdr (car nested-list):- Recupera o resto de
(1 2), que é(2).
- Recupera o resto de
car (cdr (car nested-list)):- Recupera o primeiro elemento de
(2), que é2.
- Recupera o primeiro elemento de
Exemplo: acessando elementos de outras sublistas
(car (cdr nested-list)) ; Retrieves the second sublist: (3 4)
(car (car (cdr nested-list))) ; Retrieves the first element of the second sublist: 3Essa abordagem permite navegar e acessar sistematicamente elementos específicos em uma lista aninhada, proporcionando flexibilidade poderosa para trabalhar com dados hierárquicos.
Resumo
- Listas em Scheme são estruturas de dados versáteis e essenciais.
- Use
listpara criar uma lista,carecdrpara acessar elementos econspara construir listas. - Procedimentos integrados como
length,append,reverseelist-reftornam as operações de lista fáceis e eficientes. - As listas podem ser aninhadas, permitindo estruturas de dados complexas para casos de uso avançados.