sábado, 14 de fevereiro de 2015

Aula 7–Manipulando Listas- Parte 1

 

Olá pessoal, hoje vamos aprender a manipular os dados de uma lista, existem diversas ferramentas em Autolisp para a manipulação de listas, vamos dar inicio aprendendo as duas funções mais básicas do Autolisp o CAR e o CDR.

Funções CAR e CDR

A função CAR retorna o primeiro item da lista.

A função CDR retorna a lista sem o primeiro item, preste atenção  no que eu vou escrever e mais a frente entenderemos melhor, “o resto de uma lista ainda é uma lista”, grave bem isso.

Vamos ver alguns exemplos e vamos discutir cada um deles, primeiro vou montar uma lista que usaremos em alguns exemplos.

(setq lista (list “A” “B” “C” (list 1 2 3 4 5)))

O resultado dessa lista será (“A” “B” “C” (1 2 3 4 5))

1) Exemplo

Nesse primeiro exemplo vamos pegar o primeiro elemento dessa lista, ou seja, “A”, para fazer isso devemos fazer uso da função CAR, para facilitar toda vez que fizermos algum exemplo daqui pra frente vamos sempre armazenar o valor dele em uma variável.

(setq primeiro (car lista))

A função car pega apenas o primeiro elemento da lista.

2) Exemplo

Nesse exemplo precisamos pegar o segundo elemento da lista, se você pensou que agora basta usar a função CDR errou, a função CDR retornará o restante da lista sem o primeiro item, e o restante de uma lista sempre será uma lista, então teremos que usar uma combinação de CAR e CDR para pegar o segundo elemento, primeiro faremos isso de forma separada e depois faremos isso de forma combinada.

(setq resto_lista (cdr lista))

A função CDR vai retornar a lista sem o primeiro item (“B” “C” (1 2 3 4 5)), agora temos uma lista chamada resto_lista contendo a lista sem o seu primeiro item, agora podemos usar a função CAR para pegar o primeiro item dessa lista que acabamos de criar e assim pegarmos o valor “B” que é o segundo elemento da lista original.

(setq segundo (car resto_lista))

Como o primeiro elemento da lista resto_lista é o “B” chegamos ao nosso objetivo.

Mas não precisamos na verdade criar uma nova variável para executar essa operação, podemos fazer tudo em uma única linha de programação.

(setq segundo (car (cdr lista)))

Pronto, o Autolisp vai interpretar isso da seguinte forma, primeiro pegaremos o CDR da lista, ou seja, o resto dela sem o primeiro item e depois pegaremos o CAR desse resultado que nos retornará como valor o “B”.

ATENÇÃO: Se você tiver uma lista com apenas dois elementos, não adianta usar a função CDR achando que já que ele vai remover o primeiro item da lista o que sobrar será o que você necessita, lembre-se o resto de uma lista ainda é uma lista, CDR sempre vai devolver o valor como uma lista, se tiver uma lista (1 2) e usar a função CDR terá como resultado (2) que ainda é uma lista e para ter o valor 2 como número inteiro terá que usar a função CAR para remover esse valor de dentro da lista.

3) Exemplo

Usando ainda a lista que criamos acima a nossa meta agora será pegar o valor 2 da lista, esse será bem mais complicado, pois o valor 2 esta dentro de outra lista, para isso faremos uso de diversas funções CAR e CDR, vamos fazer isso passo a passo, depois faremos isso em uma única linha de programação, não vou guarda-las em variáveis, pois vou formular a logica para que depois possamos desenvolver isso em uma única linha.

(cdr lista)

Retornará (“B” “C” (1 2 3 4 5))

(cdr (cdr lista))

Retornará (“C” (1 2 3 4 5))

(cdr (cdr (cdr lista)))

Retornará ((1 2 3 4 5))

(car (cdr (cdr (cdr lista))))

Retornará (1 2 3 4 5) ATENÇÃO, É DIFERENTE DO RESULTADO ACIMA.

(cdr (car (cdr (cdr (cdr lista)))))

Retornará (2 3 4 5))

(car (cdr (car (cdr (cdr (cdr lista))))))

Retornará 2

Resultado final

(setq valor (car (cdr (car (cdr (cdr (cdr lista)))))))

Bem trabalhoso né, existe uma forma de fazer isso que particularmente não gosto, mas que pode deixar a linha de programação um pouco mais legível.

Formando novas funções com CAR e CDR

Isso que vou ensinar agora não é utilizado pela minha pessoa, eu particularmente acredito que o programador perde mais tempo tentando criar novas funções com CAR e CDR do que utilizando da forma que fizemos acima.

Vamos criar uma lista simples

(setq lista (list 1 2 3 4 5))

Retornará (1 2 3 4 5), uma lista contendo 5 itens.

Agora vamos supor que queremos extrair o valor 4 da lista, uma forma de pegar esse valor seria fazer assim (car (cdr (cdr (cdr lista))), mas o que faremos é combina-los e formar uma nova função.

Para fazer isso precisamos pegar as duas primeiras letras da primeira função que no exemplo acima é o CAR, nesse caso as duas primeiras letras seriam CA e das demais funções pegaremos somente a letra do meio, no exemplo acima são CDR, CDR e CDR, pegando somente a letra do meio teremos D D D, agora basta adicionar um R no final.

Então escrever (car (cdr (cdr (cdr lista))) é a mesma coisa de escrever (cadddr lista), ambos retornarão o valor 4.

Vamos criar uma lista um pouco mais complexa

(setq lista (list (list 1 2 3) (list 4 5 6)))

Retornará ( (1 2 3) (4 5 6) ), ou seja, uma lista que tem dois elementos e esses dois elementos são duas outras listas.

Vamos agora pegar o valor 3 dessa lista, se fizemos passo a passo como foi feito no inicio seria assim:

(car lista)

Retornará (1 2 3)

(cdr(car lista))

Retornará (2 3)

(cdr(cdr(car lista))

Retornará (3), note que o 3 ainda é uma lista, então precisamos tira-lo da lista usando o CAR.

(car (cdr (cdr (Car lista))))

Retornará 2

Guardando em uma variável:

(setq valor (car(cdr(cdr(Car lista)))))

Agora criando uma nova função ficaria assim

(setq valor (caddar lista))

Pegamos as duas letras da primeira função CAR e assim fica CA e depois a letra do meio das demais funções D D A e por fim acrescentamos o R.

Não sei informar qual o limite para isso, mas sei que tem, então tente não utilizar esse método com muitas funções.

Eu não sou muito fã disso, mas esta ai para que quiser usar,

Na próxima aulas aprenderemos mais funções de manipulação de listas.

Abaixo seguem os exercícios.

Crie a seguinte lista

( ( 1 2 3) (“a” “b” “c”) ( ( 10 20 30) ”X” “Y” “Z”) ) )

1) Extraia os valores solicitados abaixo usando as funções CAR e CDR sem criar novas funções.

a) Pegue o valor ( 1 2 3)

c) Pegue o valor (“a” “b” “b”)

b) Pegue o valor (10 20 30)

d) Pegue o valor “X”

e) Pegue o valor “Z”

f) Pegue o valor “Y”

g) Pegue o valor “a”

h) Pegue o valor “c”

i) Pegue o valor “b”

j) Pegue o valor “2”

2) Extraia os valores do exercício acima criando novas funções usando o CAR e CDR.

Assista tambem a video aula em meu canal Manual de Cad no Youtube.

https://www.youtube.com/watch?v=PO1E9GptZXo

Espero que tenham gostado

Sergio Fernandes

Manual de Cad

Nenhum comentário:

Postar um comentário