AutoCad - AutoLISP, Paso por Referencia

 
Vista:

AutoLISP, Paso por Referencia

Publicado por Ian Herrera (2 intervenciones) el 14/08/2017 10:41:11
Estimados Sres :

Estoy terminando una aplicacion AutoLISP y ordenando mis funciones, deseo pasar por referencias las variables para actualizar desde las funciones (con variables locales) las variables del programa principal

En el LISP adjunto, la variable b del programa principal deberia ser igual a la variable resultado de la funcion, si fuese un Paso por Referencia

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
defun c:test()
 
(defun triple (operando resultado)
 
	(setq resultado (* 3 operando))
 
)
 
	(setq a 100 b 0)
 
	(triple a b)
 
	(princ "Triple = ")
	(princ b)
	(princ)
 
)

GRACIAS
Ian Herrera
Lima-PERU
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 1.285
Oro
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

AutoLISP, Paso por Referencia

Publicado por Gerardo (989 intervenciones) el 15/08/2017 21:59:59
utiliza un apostrofe antes de la variable en la llamada a la función para que lo que se pase sea la variable y no su contenido, de lo contrario en la misma llamada se evaluará y se sustituirá el nombre de variable por su valor. (en tu ejemplo lo que recibe triple es directamente un 100 y un 0)

Dentro de la función debes evaluar entonces la variable para que apunte a su contenido, que en este caso, dentro de triple, el nombre de variable es resultado y su valor es el nombre de variable b, en vez de el valor de b, por haber llamado de la forma 'b
Para obtener el valor debes recurrir a cosas como la función eval (por ejemplo si resultado tuviera un princ resultado y quieres que muestre el 0 habria que poner (princ (eval resultado)) ), o como sustituir el setq por set para que se evalúen ambos lados en la asignación (setq no evalúa el de la izquierda)

1
2
3
4
5
6
7
8
9
10
11
12
(defun c:test2 ( / triple a b )
  (defun triple (operando resultado)
      (set resultado (* 3 operando))
  )
 
  (setq a 100
        b (triple a 'b)
  )
  (princ "Triple = ")
  (princ b)
  (princ)
)

Si pusiste el setq b 0 como una declaración para que b exista, te sobra. porque cualquier nombre de variable no existente es considerado un apuntador a un valor nulo. Supongo que todo lo interno en lisp son apuntadores sin tipo, porque los cast son automaticos entre cualesquiera tipos de datos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

AutoLISP, Paso por Referencia

Publicado por Ian Herrera (2 intervenciones) el 18/08/2017 17:38:22
Gerardo :

Excelente aporte, GRACIAS. Me permite avanzar en lo que estoy resolviendo

Aplicando lo señalado, (corre sin errores) seria lo optimo esto (ver lineas abajo)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(defun c:test2 ( / adicion a b c)
 
(defun adicion (sumando1 sumando2 suma)
	  (setq temp1 (+ sumando1 sumando2))
    (set suma temp1)
)
 
(setq a 100 b 50 c (adicion a b 'c))
  
(princ "SUMA = ") (princ c)
  
(princ)

)

GRACIAS
Ian Herrera
Lima-PERU
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar