Sustraer valor de una lista y después sustituirlo

Ver el tema anterior Ver el tema siguiente Ir abajo

Sustraer valor de una lista y después sustituirlo

Mensaje por carlosmgilp el Vie Jul 21, 2017 5:40 am

Hola como están, aquí con una nueva duda.

Tengo esta lista guardada en una variable.

Código:
(setq lista '((-3 ("HOME" (1000 . "* = Plate Edge") (1000 . "Panel ID = 3") (1000 . "Poly ref = 19")))))

Como puedo sustraer el valor de Panel ID, en este caso seria 3 (Puede ser numero entero o real) para tenerlo en una variable que necesito.

En el siguiente caso tengo la misma lista anterior pero necesito sustituir el valor del Panel ID por cualquiera que yo necesite.

Código:
;; Nuevo valor id
(setq new-id 1.1) ; Puede estar en texto o numero eso no seria problema
;; Lista donde lo voy a sustituir
(setq sust-lista '((-3 ("HOME" (1000 . "* = Plate Edge") (1000 . "Panel ID = 3") (1000 . "Poly ref = 19")))))
;; Resultado final
(setq lista-final '((-3 ("HOME" (1000 . "* = Plate Edge") (1000 . "Panel ID = 1.1") (1000 . "Poly ref = 19")))))

En ambos casos la ubicación de Panel ID puede variar en la lista, puede estar de primero o de ultimo, es decir en cualquier lado de la lista.
La lista puede ser mas larga o mas corta, pero va a llevar la misma estructura.

Gracias y espero puedan ayudarme.
Saludos.

carlosmgilp

Mensajes : 96
Fecha de inscripción : 17/03/2016
Edad : 35
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Sustraer valor de una lista y después sustituirlo

Mensaje por nolo el Vie Jul 21, 2017 1:33 pm

Por ejemplo con este lisp
Código:
(defun newlP ( valor lista)
(list(cons -3(list
(mapcar '(lambda(a)
   (if (and (listp a) (= (substr(cdr a) 1 5)"Panel"))
      (cons 1000 (strcat "Panel ID = " (rtos valor)))
      a
   ))
(cadar lista)))))
)
que se usa así
Código:
(setq l (newlp 2.2 lista))
((-3 ("HOME" (1000 . "* = Plate Edge") (1000 . "Panel ID = 2.2") (1000 . "Poly ref = 19"))))

Un saludo

nolo

Mensajes : 131
Fecha de inscripción : 17/03/2016

Ver perfil de usuario

Volver arriba Ir abajo

Re: Sustraer valor de una lista y después sustituirlo

Mensaje por carlosmgilp el Sáb Jul 22, 2017 2:44 am

Desde siempre agradecido contigo hermano y con todos en el foro.

No se si soy yo, pero desde que aprendí lo poco que se de lisp y visual lisp, solo le huyo al lambda, esa si que no me la aprendo ni inyectado, es como que no se como armar esas funciones y siempre muchas cosas de las que pregunto me las resuelven con eso.

Una vez mas funciono muy bien, solo sustituí de la función el rtos por vl-princ-to-string (No se si haya otro mas fácil para pasar a texto) para que no me alterara con decimales pues necesito el texto muy exacto, de resto todo perfecto, yo creo que un 8 de 10. Jejejejejejejejeje.

Ese era el segundo caso, de la cual el primer caso no comentaste nada, que era sustraer el valor del id

Tomando la función original que me hiciste para la sustitución del valor, la modifique un poco para que me funcionara en el caso de extraer el valor.
Aquí la adjunto para que me des tu opinion, si si vale la pena, si hay algo mas fácil y sin tanto texto o si se deja así.

Código:
(setq lista '((-3 ("HOME" (1000 . "* = Plate Edge") (1000 . "Panel ID = 1.1") (1000 . "Poly ref = 19")))))

(setq valor-id (sub-valor-id lista))

(defun sub-valor-id  (lista / a)
  (read (car (vl-remove nil
                        (mapcar '(lambda (a)
                                   (if (and (listp a) (= (substr (cdr a) 1 5) "Panel"))
                                     (substr (cdr a) 12)))
                                (cadar lista))))))

Mil gracias por tu ayuda y tu buena voluntad.
Saludos.

carlosmgilp

Mensajes : 96
Fecha de inscripción : 17/03/2016
Edad : 35
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Sustraer valor de una lista y después sustituirlo

Mensaje por nolo el Sáb Jul 22, 2017 12:08 pm

Bueno, el control sobre los decimales del rtos lo tiene la variable dimzin

Otra forma mas genérica de hacer lo que buscas sería esta
Código:
(defun valP ( name lista / p )
(if (setq p (vl-remove-if-not '(lambda(a)
 (and (listp a) (wcmatch (cdr a) (strcat name"*"))))
 (cadar lista)
 ))
 (substr (cdar p) (+(vl-string-position 61 (cdar p)) 2))
)
)
Así buscarías el valor de cualquier otra cosa que tuviera un igual
Código:
(setq  r (valp "Panel" lista))
" 3"

Un saludo

nolo

Mensajes : 131
Fecha de inscripción : 17/03/2016

Ver perfil de usuario

Volver arriba Ir abajo

Re: Sustraer valor de una lista y después sustituirlo

Mensaje por carlosmgilp el Mar Jul 25, 2017 6:41 am

Hola hermano como estas.

Muchas gracias por la información, sigo aprendiendo.

Un saludo.

carlosmgilp

Mensajes : 96
Fecha de inscripción : 17/03/2016
Edad : 35
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Sustraer valor de una lista y después sustituirlo

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.