Aplicar lambda con getvar

Ir abajo

Aplicar lambda con getvar

Mensaje por carlosmgilp el Miér Feb 14, 2018 5:41 pm

Hola muchachos como están.

Sera que me dan una ayuda con esto.
Estoy tratando de sustraer los valores de unas variables.

Esta es la lista que tengo.

Código:
(setq lista '("cmdecho" "osmode" "meshtype" "3dosmode" "orthomode"))

Y estoy tratando de solucionarlo de la siguiente manera.

Código:
(mapcar '(lambda (x)
   (vl-catch-all-apply 'getvar (cons (car x) (cadr x))))
 lista)

Para guardarlos en una variable.
Porque de este modo? porque hay variables que no existen en todos los autocad, no recuerdo bien si meshtype es una de ellas, pero al no encontrar la variable arroja un error y no pasa de ahí con las siguientes variables.

El resultado debería ser una nueva lista como esta.

Código:
(("cmdecho" . 1) ("osmode" . 1) ("meshtype" . 0) ("3dosmode" . 31) ("orthomode" . 0))

De ante mano muchas gracias.

carlosmgilp

Mensajes : 149
Fecha de inscripción : 17/03/2016
Edad : 36
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Aplicar lambda con getvar

Mensaje por Marco Jacinto el Jue Feb 15, 2018 5:39 pm

Trata con esto, el cons lo pones dentro del aplly, y debe ir fuera
Código:
(mapcar '(lambda (x)
   (cons x (vl-catch-all-apply 'getvar (list x))))
 lista)

Marco Jacinto

Mensajes : 53
Fecha de inscripción : 12/08/2016

Ver perfil de usuario

Volver arriba Ir abajo

Re: Aplicar lambda con getvar

Mensaje por carlosmgilp el Jue Feb 15, 2018 7:50 pm

Hola Marco Jacinto, como has estado.
La acabo de revisar y funciona bien, no estaba muy lejos de como la llevaba. Jejejeje.

Pero ahora hay un problema, si la variable no existe la deja en la lista final y necesito que quede solo lo que si existe.

Por ejemplo, estoy aplicando el código que me presentas a esta nueva lista.

Código:
(setq lista '("casa" "cmdecho" "osmode" "meshtype" "3dosmode" "orthomode"))

En este caso da como resultado.

Código:
(("casa") ("cmdecho" . 1) ("osmode" . 1) ("meshtype" . 0) ("3dosmode" . 31) ("orthomode" . 0))

Si te fijas casa no es una variable.
Deberia quedar sin casa, para yo despues trabajar solo con lo que realmente debe ser.
Deberia quedar de la siguiente manera.

Código:
(("cmdecho" . 1) ("osmode" . 1) ("meshtype" . 0) ("3dosmode" . 31) ("orthomode" . 0))

Gracias por tu ayuda.

carlosmgilp

Mensajes : 149
Fecha de inscripción : 17/03/2016
Edad : 36
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Aplicar lambda con getvar

Mensaje por Marco Jacinto el Jue Feb 15, 2018 11:12 pm

mira
Código:
(foreach x lista
  (if (setq val(vl-catch-all-apply 'getvar (list x)))
    (setq lst(cons (cons x val)lst))
  )
)

Marco Jacinto

Mensajes : 53
Fecha de inscripción : 12/08/2016

Ver perfil de usuario

Volver arriba Ir abajo

Re: Aplicar lambda con getvar

Mensaje por nolo el Vie Feb 16, 2018 11:26 am

Por si te sirve, yo aplico esto en mis rutinas,

Salvo el estado de las variables de la lista
Código:
(setq lista '(cmdecho osmode meshtype 3dosmode orthomode))
(setq old(mapcar 'getvar lista))
Veras que no hacen falta las comillas y en el caso de un nombre de variable que no exista devuelve nil
Código:
(setq lista '(cmdecho osmode meshtype 3dosmode orthomode prpe))
(mapcar 'getvar lista)
(1 16896 1 0 0 nil)

No varío el contenido ni de lista ni de old y al final de la rutina devuelvo los valores con
Código:
(mapcar 'setvar lista old)

Un saludo

nolo

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

Ver perfil de usuario

Volver arriba Ir abajo

Re: Aplicar lambda con getvar

Mensaje por carlosmgilp el Vie Feb 16, 2018 6:46 pm

Hola Marco Jacinto, como estas.
Funciona muy bien, muchas gracias.

Hola nolo, gracias a ti también, ese dato de eliminar las comillas fue muy bueno, ahorras mas trabajo aun. Jejejeje.

Hasta que respondió Marco todo iba bien, ahora que veo lo de nolo me surgió otra duda.

Yo guardo la lista y la variable que no exista queda como nil.
Hasta ahí claro.
Pero el detalle viene cuando la variable no existe, al querer aplicarle el setvar da un error.
Por eso buscaba la manera de eliminar el nil y con lo de Marco estaba completo, peroahora me doy cuenta que si elimino los nil los valores que le quiero aplicar a las variables no coincidirían porque la lista de variables se reduciría solo a lo que existe.
No se si me he explicado bien.
Por ejemplo, si tengo 10 variables, tengo 10 valores a aplicar a esas variables, si alguna variable no existe la elimino, entonces me quedarían 9 variables pero seguiría manteniendo los diez valores que quiero aplicar, pero al haber eliminado alguna variable los valores no coincidirían con la variable que le toca.

De todas maneras, según lo de nolo, aquí coloco una lista como ejemplo.

Código:
(setq lista '(cmdecho casa osmode meshtype 3dosmode orthomode prpe))
(setq old (mapcar 'getvar lista))
(mapcar 'setvar lista '(0 0 0 0 0 1 1))
(mapcar 'setvar lista old)

Y como siempre, muchísimas gracias por la ayuda.

carlosmgilp

Mensajes : 149
Fecha de inscripción : 17/03/2016
Edad : 36
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Aplicar lambda con getvar

Mensaje por nolo el Vie Feb 16, 2018 10:49 pm

Para eso están los condicionales

Código:
(setq lista '(cmdecho casa osmode meshtype 3dosmode orthomode prpe))
(setq old (mapcar 'getvar lista))
(mapcar '(lambda(a b) (if b (setvar a b))) lista old)

Un saludo

nolo

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

Ver perfil de usuario

Volver arriba Ir abajo

Re: Aplicar lambda con getvar

Mensaje por Marco Jacinto el Vie Feb 16, 2018 11:46 pm

Mi recomendacion es siempre correlacionar los valores a la variable, si te basas solo en el orden, si en algún momento lo cambias y no lo estableces para ambas listas, tendrás problemas.

Marco Jacinto

Mensajes : 53
Fecha de inscripción : 12/08/2016

Ver perfil de usuario

Volver arriba Ir abajo

Re: Aplicar lambda con getvar

Mensaje por carlosmgilp el Lun Feb 19, 2018 6:19 pm

Hola muchachos como estan.

La de nolo funciona con la nueva condicional. Gracias.
Pero le voy a hacer caso a Marco Jacinto, por si en algún momento se me descuadra alguna lista, prefiero asegurar que este todo en su lugar.

Mil gracias, ya lo solucione y estoy mas tranquilo.

Saludos.

carlosmgilp

Mensajes : 149
Fecha de inscripción : 17/03/2016
Edad : 36
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Aplicar lambda con getvar

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Volver arriba

- Temas similares

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