Manejo de listas en autolist (cdr-car) en AutoCAD

Manejo de listas en autolist (cdr-car) en AutoCAD

brehayan
Advocate Advocate
628 Vistas
7 Respuestas
Mensaje 1 de 8

Manejo de listas en autolist (cdr-car) en AutoCAD

brehayan
Advocate
Advocate

hola colegas el dia de hoy tengo la siguiente duda, estoy empezando con el tema de programacion autolist en mi estudio estoy en el apartado de extraccion de datos de lista con (CDR-CAR) y sus respectivas derivaciones.

la duda que tengo seria en el siguiente ejercicio:

 

(setq i' (5 4 3 (9 6 7 (23 1 50) 34 66) 😎

a la variable anteriormente presentada tengo que extraer los siguientes datos

1 elemento 5

2 elemento 4

3 elemento 3

4 elemento (23 1 50)

5 elemento 50

Los 3 primeros puntos los tengo resueltos de la siguiente manera 

1= car

2=cdar

3=caddr

el problema lo encuentro en el punto 4 y 5 que no logro entrar a esa apartado he intentado muchas combinaciones pero no logro entrar en esa lista he llegado a extraer el elemento {8 con (car (cdr (cdr (cdr i))))}

he logrado encontrar el elemento   {(9 6 7 (23 1 50) 34 66) con (car (cdr (cdr (cdr i))))}

con respecto a esto tengo la duda de como funciona el entrar en listas anidadas y extraer esos datos, les agradeceria mucho si me ayudan a aclarar el tema o encontrar algún informe documento o guía para ello.

en concreto la pregunta seria que me ayudaran a entender como resolver los puntos 4 y 5 de el ejercicio muchas gracias..

 

delineante de ingeniería y arquitectura
0 Me gusta
Soluciones aceptadas (2)
629 Vistas
7 Respuestas
Respuestas (7)
Mensaje 2 de 8

calderg1000
Mentor
Mentor

Saludos @brehayan 

Me da mucho gusto que ya te estés iniciando en el apasionante mundo de la programación en autolisp.

Para el caso de tu consulta, debo decirte 2 cosas:

1. La lista que mencionas, se encuentra incompleta, porque no tiene completo los paréntesis de cierre.

2. La lista que mencionas, aun así se completen los paréntesis, no se ajusta a lo que deseas obtener como resultado.

Por ello he propuesto una nueva lista que si se ajustaría a los resultados que deseas obtener.

 

;La lista propuesta, se debe corregir:
(setq i' (5 4 3 (9 6 7 (23 1 50) 34 66);parentesis incompleto
          
;Lista nueva, adecuada para obtener lo que se requiere          
(setq i' (5 4 3 (23 1 50) 50))
          
;Obtencion de loselementos de la Nueva lista:          
(car i);Primer elemnto de la lista
(cadr i);Segundo elemnto de la lista
(caddr i);Tercer elemnto de la lista
(cadddr i);Cuarto elemnto de la lista
(cadr(cdddr i));Quinto elemnto de la lista
          
;Aqui,otra forma para obtener los elementos de una lista:
(nth 0 i);Primer elemnto de la lista
(nth 1 i);Segundo elemnto de la lista
(nth 2 i);Tercer elemnto de la lista
(nth 3 i);Cuarto elemnto de la lista
(nth 4 i);Quinto elemnto de la lista

 

Espero que mis comentarios te sean de ayuda. En todo caso, con mucho gusto estaré atento por si tienes alguna aclaración.


Carlos Calderon G
EESignature
>Did you find this post helpful? Feel free to Like this post.
Did your question get successfully answered? Then click on the ACCEPT SOLUTION button.

Mensaje 3 de 8

brehayan
Advocate
Advocate

saludos, observando bien si tengo un error en la digitación del ejemplo, pero no me fije y el ultimo paréntesis era el #8), se escribió el emoji de gafas 8.)

(setq i' (5 4 3 (9 6 7 (23 1 50) 34 66) 8_), omitir el guion bajo por que o sino vuelve a salir el emoji si lo dejo conjunto.

que de acuerdo a esto es una lista anidada según lo que he leído del tema, @calderg1000 prueba con esta variable  he hecho muchas pruebas pero aun lo entiendo como llegar a la lista interna "(23 1 50)". 

lo mas cercano que llegue fue al (7), que viene siendo el 3 valor de la segunda lista

(caddr (caddr (cdr i))) = 7.

con respecto a la otra forma muchas gracias por el dato pero tengo entendido que es otra manera valida pero quiero darme la respuesta con car y cdr y ver su funcionamiento al máximo.

delineante de ingeniería y arquitectura
0 Me gusta
Mensaje 4 de 8

Edwin.Saez
Advisor
Advisor
Solución aceptada

@brehayan ,

 

ya @calderg1000 te dio una excelente explicación. Aqui te puedo añadir un ejemplo con tus datos:

 

 

(cadddr  i)          ---> (23 1 50)
(car(cadddr  i))     ---> 23
(cadr(cadddr  i))    ---> 1
(caddr(cadddr  i))   ---> 50

 

 

O según tu primer ejercicio: (teniendo en cuenta que faltan corregir los paréntesis):

 

(car(cadddr(cadr(cddr i))))    --> 23
(cadr(cadddr(cadr(cddr i))))   --> 1
(caddr(cadddr(cadr(cddr i))))  --> 50

 

 

 

Edwin Saez


LinkedIn / AutoCAD Certified Professional


EESignature


 


Si mi respuesta fue una solución para usted, por favor seleccione "Aceptar Solución", para que también sirva a otro usuarios.

Mensaje 5 de 8

calderg1000
Mentor
Mentor
Solución aceptada

Estimado @brehayan 

Todavia habia un paréntesis que faltaba, lo agregue al final para definir la lista, pero no se si es ahí exactamente donde va.

Aqui tienes una forma de hacerlo. Aunque talvez se pueda optimizar algo mas...Pero lo hice algo rápido.

Para usar esta forma de obtener los elementos de una lista, debe de partir del principio:

1. (car lst); primer elemento de una lista

2. (cdr lst); obtiene una sublista descartando el primer elemento de la lista

3.(car(cdr lst)); obtiene el segundo elemento de la lista

4.(cadr(cdr lst)); Obtiene el tercer elemento de la lista

5.(car(cdr (cdr (cdr i))));Obtiene el cuarto elemento de la lista=(9 6 7 (23 1 50)34 66)

Y continuar repitiendo el mismo principio para obtener los elementos de las sublistas interiores.

(setq i '(5 4 3 (9 6 7 (23 1 50) 34 66) 8));Lista con un parentesis adicionado

(car i);Primer elemento de la lista
(cadr i);Segundo elemento de la lista
(caddr i);Tercer elemento de la lista
(cadddr(cadddr i));Cuarto elemento solicitado
(caddr(cadddr(cadddr i)));Quinto elemento solicitado

 Espero haber Ayudado en algo acerca de tu consulta. Saludos.


Carlos Calderon G
EESignature
>Did you find this post helpful? Feel free to Like this post.
Did your question get successfully answered? Then click on the ACCEPT SOLUTION button.

Mensaje 6 de 8

brehayan
Advocate
Advocate

huf muchas gracias @calderg1000  y @Edwin.Saez , son unos duros; ya con esto analizo un poco mejor el funcionamiento de entrar en listas anidadas y aclarar mis dudas con esto.

de verdad muchas gracias por la ayuda sigo motivado en este tema de la programación. 😁

delineante de ingeniería y arquitectura
Mensaje 7 de 8

alvaro.leon
Enthusiast
Enthusiast

Hola @brehayan te recomiendo busques los libros de Reinaldo Togores, "Experto AutoCAD con Visual Lisp".  Libros en español.  Te recomiendo comprar el libro de la versión 2019 que es el libro más completo y el libro de actualización a la versión 2022 de AutoCAD, en éste último hace referencia al Visual Studio Code como el nuevo Idle de programación.  Esta es la info escrita más completa que puedas encontrar, con esto aprendí y he hecho muchas herramientas.  Lo ideal es que te enfoques a Visual Lisp y no tanto al Autolisp.  Aprender a utilizar las herramientas de ActiveX que junto a Visual Lips aumentan mucho el campo de acción que Autolisp no logra.  Con el libro no solo aprendes a programar sino que con la práctica llegas a entender el API de AutoCAD. Luego puede ahondar niveles más arriba y es usar .NET para superar la barrera de Visual Lisp.  También puedes usar Python que está de moda y es un lenguaje de programación muy noble.

Mensaje 8 de 8

brehayan
Advocate
Advocate

gracias por la recomendación @alvaro.leon  lo agregare a la biblioteca

delineante de ingeniería y arquitectura
0 Me gusta