Você está na página 1de 52

CAPITULO XVIII

AUTOLISP
Manual Práctico de AutoCAD
Autolisp

El LISP es un lenguaje de programación relativamente antiguo, desarrollado en los años


cincuenta para la investigación en Inteligencia Artificial.

Su nombre proviene de LISt Processing (Procesado de Listas), puesto que la base de su


funcionamiento es el manejo de listas en vez de datos numéricos.

Una lista es un conjunto de símbolos que pueden ser nombres de variables, datos
concretos numéricos o textuales, funciones definidas por el propio usuario, etc. El símbolo
es, pues, la unidad básica con un contenido o un significado para el programa en LISP.

La lista es el mecanismo que junta una serie de símbolos y los evalúa, es decir, los
procesa, obteniendo un resultado. El lenguaje LISP procesa directamente las listas en
cuanto se encuentran formadas y obtiene o "devuelve" el resultado de ese proceso.

Esta característica del manejo de listas otorga al LISP una gran versatilidad y le distingue
de otros lenguajes de programación orientados a la manipulación de números.

Las ventajas que supone la utilización de un lenguaje basado en LISP para programar
desde AutoCAD se podrían resumir en los siguientes puntos:

Facilidad para manejar objetos heterogéneos: números, caracteres, funciones,


entidades de dibujo, etcétera Para LISP basta representar cualquiera de esos objetos con
un "símbolo”, y no hay necesidad de definir previamente qué tipo de datos va a contener
ese símbolo.

Facilidad para la interacción en un proceso de dibujo: Sencillez de aprendizaje y


comprensión. El hecho de que el LISP sea un lenguaje muy utilizado en investigación y
desarrollo de Inteligencia Artificial y Sistemas Expertos.

Sencillez de sintaxis, por lo que un intérprete de LISP es fácil de realizar y resulta


convenientemente pequeño.

El LISP es un lenguaje que es evaluado en vez de compilado o interpretado.

Los lenguajes interpretados por la computadora y cada palabra es convertida a lenguaje


máquina. Esto hace que sean muy lentos.

Los lenguajes compilados son mucho más rápidos, porque en el proceso de compilación
todo el programa se convierte en instrucciones de máquina.

Un lenguaje evaluado como el LISP es un paso intermedio entre los


interpretados y los compilados. No es tan rápido como estos últimos pero resulta
mucho más flexible e interactivo. Es posible, por ejemplo, escribir un programa en LISP
que sea capaz de modificarse a sí mismo bajo ciertos aspectos: esta es la base de los
llamados Sistemas Expertos.
Manual Práctico de AutoCAD

El mecanismo evaluador de LISP es la propia lista. Una lista es un conjunto de símbolos


separados entre sí por al menos un espacio en blanco y encerrados entre paréntesis.
Desde el momento en que existe una expresión encerrada entre paréntesis, el LISP la
considera como una lista y la evalúa intentando ofrecer un resultado.
El LISP no es un lenguaje de programación único, sino que existen muchas versiones de
LISP: MacLISP, InterLISP, ZetaLISP, Common LISP.

AUTOLISP, UNA VERSIÓN ESPECÍFICA DE LISP


AutoLISP es un subconjunto del lenguaje de programación Common LISP. Puesto que
AutoLISP está diseñado para funcionar desde un dibujo de AutoCAD, se han seleccionado
las características de LISP más adecuadas para este fin y además se han añadido otras
nuevas, sobre todo en lo relativo a !a manipulación de entidades de dibujo, acceso a la
Base de Datos de AutoCAD e interacción gráfica en general.

Los programas en AutoLISP son simples archivos de texto, con la extensión obligatoria
.LSP, donde el usuario escribe uno o varios programas contenidos en ese archivo. Una vez
hecho esto, basta cargar el archivo desde la Línea de Comandos – Command: - de
AutoCAD para poder acceder directamente a todos los programas contenidos en él.

Además se pueden escribir directamente instrucciones en AutoLISP desde la línea de


comandos del dibujo en AutoCAD, es decir, escribir conjuntos de símbolos encerrados
entre paréntesis. AutoLISP evalúa inmediatamente esa lista y ofrece un resultado. Y si la
expresión contiene definiciones de funciones o variables, quedan cargadas en la memoria
para su utilización posterior.

Una de las más importantes potencialidades de AutoLISP es el acceso directo a la Base de


Datos de un dibujo en AutoCAD. Toda la información del dibujo se encuentra en ella:
layers (capas), style (estilos de texto), type line (tipos de líneas), USC (sistemas de
coordenadas) o VIEW (vistas almacenadas), atributos con sus diferentes valores en cada
inserción, etc., así como todas las entidades contenidas en el dibujo.

Se puede utilizar AutoLISP para modificar esa Base de Datos o para extraer la información
que interese de ella con objeto de importarla, por ejemplo, en una base de datos externa.
La forma más habitual de extraer información es mediante los datos de atributos
asociados a bloques.

TIPOS DE OBJETOS EN AUTOLISP


Los objetos en AutoLISP representan todos los tipos de componentes de un programa. En
esencia son dos, como ya se ha dicho: listas y símbolos. Además es posible incluir como
elementos de listas valores concretos ("constantes"), ya sean numéricos o textuales.

Atendiendo a sus características se pueden definir varios tipos de objetos en AutoLISP:


Lista: es un objeto compuesto de:
Paréntesis de apertura. Uno o más elementos separados por al menos un espacio en
blanco Paréntesis de cierre.
Los elementos de la lista pueden ser símbolos, valores concretos (“constantes" numéricas
o textuales), o también otras listas incluidas.

Elemento: cualquiera de los componentes de una lista


Autolisp

Átomo: representa una información indivisible; un valor concreto, o un símbolo de


variable que contiene un valor, son átomos. Una lista o una función definida por el
usuario no son átomos.

Símbolo: cualquier elemento de lista que no sea un valor concreto. El símbolo puede ser
un nombre de variable, un nombre de función definida por el usuario o un nombre de
comando de AutoLISP.

Enteros: valores numéricos enteros, ya sean explícitos o contenidos en variables.

Reales: valores numéricos con precisión de coma flotante.


Cadenas: valores textuales que contienen cadenas de caracteres (código ASCII). Deben
ir entre comillas

Descriptores de fichero o archivo: valores que representan un archivo abierto para


lectura o escritura desde un programa en AutoLISP.
Por ejemplo:
<File: #5c9Ø>.

"Nombres" de entidades de AutoCAD: valores que representan el "nombre" de una


entidad en la Base de Dalos.
Por ejemplo:
<Entity name: 6ØØØØA56>.

"Conjuntos designados" de AutoCAD: valores que representan una designación de


entidades de dibujo.
Por ejemplo:
<Sclection set: 3>.

Función de usuario: es un símbolo que representa el nombre de una función definida


por el usuario.

Función inherente o Comando: es un símbolo con el nombre de un comando


predefinido de AutoLISP, A veces se les llama Subrutinas o Funciones predefinidas.

Funciones ADOS o Subrutinas externas: son símbolos con aplicaciones de ADS en


Lenguaje C, cargadas desde AutoLISP. (véase en el Capítulo 17).

En sistemas MS-DOS los enteros son números de 16 bits con signo, es decir,
comprendidos entre -32768 y +32767. Los números reales se representan con separación
de coma flotante de doble precisión, con un mínimo de 14 cifras significativas.

Las cadenas pueden tener cualquier longitud. No obstante, para valores explícitos
("constantes" de tipo cadena) existe una limitación de 100 caracteres.

PROCEDIMIENTOS DE EVALUACIÓN EN AUTOLISP


La base de todo intérprete de LISP es su algoritmo evaluador. Este analiza cada línea del
programa y devuelve un valor como resultado. La evaluación en AutoLlSP se realiza de
acuerdo con las siguientes reglas:
Manual Práctico de AutoCAD

Los valores enteros, reales, cadenas de texto, descriptores de archivos, así como los
nombres de subrutinas o comandos de AutoLISP, devuelven su propio valor como
resultado. Los símbolos de variables participan con el valor que contienen (que les está
asociado) en el momento de la evaluación Las listas se evalúan de acuerdo con el primer
elemento. Si éste es un nombre de función inherente o comando, los elementos restantes
de la lista son considerados como los argumentos de ese comando. En caso contrario, se
considera como un nombre de función definida por el usuario, también con el resto de
elementos como argumentos.
Cuando los elementos de una lista son a su vez otras listas, éstas se van evaluando desde
el nivel de anidación inferior (las listas más “interiores"). Puesto que cada lista contiene
un paréntesis de apertura y otro de cierre, cuando existen listas incluidas en otras todos
los paréntesis que se vayan abriendo deben tener sus correspondientes de cierre.
Si se introduce desde el teclado una expresión en AutoLISP a la que falta por cerrar algún
paréntesis, se visualiza un mensaje:
n>

donde "n" es un número que indica cuántos paréntesis fallan por cerrar. Se pueden
teclear esos paréntesis y subsanar el error.

También es posible evaluar directamente un símbolo (extraer, por ejemplo, el valor actual
contenido en una variable) tecleando el signo de cerrar admiración seguido del nombre
del símbolo.
Por ejemplo:
! P1
devolvería el valor actual contenido en la variable "P1".

CONVECIONES DE AUTOLISP
1º Punto y coma: ; Sirve para añadir comentarios o aclaraciones que nos ayuden a
entender mejor nuestra rutina. Todo lo que vaya detrás del punto y coma, en realidad
podríamos borrarlo y el programa no sufriría alteraciones. Así que este carácter sólo lo
usaremos para esto.
2º Paréntesis: ( ) Debe haber el mismo número de paréntesis de apertura que de
cierre. De lo contrario se producirá un error. Los utilizaremos para preceder cualquier
comando de Autolisp y para dar fin a dicho comando.
3º Comillas: " " Se utilizan para encerrar expresiones de texto que queremos que
aparezcan en la pantalla, ya sea en la línea de comando o en una ventana. Todo lo que
esté entre comillas será considerado como una cadena de texto, incluso los paréntesis,
comas, punto y comas.... Como los paréntesis, debe haber un número par de comillas.
4º Punto: . Se usa como punto decimal.
5º Apóstrofo: ‘ Equivale al comando (QUOTE). Devuelve el literal de la expresión.
6º Contrabarra: \ Dentro de una cadena de texto podemos incluir una contrabarra
seguida de uno de los siguientes caracteres:
\n: Retorno de carro, nueva línea
\r: Return
\t: tabulador
Es decir. Si escribimos: (GETPOINT pt "\nSeñala un punto") , cuando Autolisp evalúe
esta expresión, antes de escribir "Señala un punto" en la línea de comando, hará un salto
de carro para que no aparezcan dos o más expresiones distintas, unas a continuación de
otras.
7º Cierre admiración: ! Sirve para extraer desde la línea de comandos, el valor de una
variable.
Autolisp

Ej.: (SETQ radio 5.639)


Si tecleamos !radio en la línea de comandos nos aparecerá 5.639

ACLARACIONES
*Autolisp no distingue entre mayúsculas y minúsculas.
*Es conveniente usar el nombre de las órdenes de Autocad en inglés. Si trabajamos con
Autocad español y queremos saber el nombre en inglés tecleamos en la línea de
comando:
(GETCNAME "orden en catellano")
Ej.: (GETCNAME “texto”) y aparece "_text"
*Autolisp siempre trabaja en radianes
*PI es el número 3.1415926....., por lo que ninguna variable podrá llamarse PI.
*T es el símbolo de True, cierto, por lo que ninguna variable podrá llamarse T.
*nil es el símbolo de falso, por lo que ninguna variable podrá llamarse nil. Siempre
aparecerá en minúsculas, nunca NIL.

Códigos Bit Initget


El número 1 después de la initget función en el ejemplo de código 8, anterior se conoce
como un código de bit de initget. Códigos de bits Initget se pueden utilizar para controlar
qué tipo de entradas están permitidas. En este ejemplo, 1 se utiliza para no permitir una
entrada nula. Esto obliga al usuario que introduzca una de las opciones de palabras clave
específicas en lugar de golpear retorno de carro.

Ejemplo:
(Initget (+ 1 2 4))
(getint "\ Cuantos años tienes:?")

Sólo aceptará un resultado positivo, por ejemplo, Integer distinto de cero: 21


Manual Práctico de AutoCAD

OPERACIONES NUMÉRICAS Y LÓGICAS


Explicaremos aquí la manera en que se realizan en AutoLISP las operaciones
matemáticas, de comparación y lógicas. El buen aprendizaje de estás técnicas nos será
tremendamente útil a la hora de lanzarnos a la programación pura.

Aritmética básica
Para realizar las cuatro operaciones aritméticas básicas existen cuatro funciones AutoLISP
que
son +, -, * y /, estas se corresponden con la suma, resta, multiplicación y división.
La función de suma tiene la siguiente sintaxis:
(+ [valor1 valor2 valor3...])
Esto es, primero se indica el nombre de la función, como siempre en AutoLISP, que en
este caso es + y luego los argumentos de la misma, es decir, aquí los valores de los
distintos sumandos.

Esta función devuelve el resultado aditivo de todos los valores numéricos especificados
como argumentos de la función. Por ejemplo:

(+ 14 10 20)
Devolvería el valor 44.

Para hacer la prueba únicamente debemos escribir dicho renglón en la línea de comandos
de AutoCAD, pulsar INTRO y comprobar el resultado.

NOTA: Al introducir el primer carácter de apertura de paréntesis, AutoCAD reconoce que


se está escribiendo una expresión en AutoLISP, por lo que nos permitirá utilizar los
espacios necesarios de la sintaxis sin que se produzca un INTRO cada vez, como es
habitual.

Recordemos que todos los elementos de una lista de AutoLISP han de ir


separados por lo menos con un espacio blanco. Probemos diferentes sintaxis
utilizando más espacios, o tabuladores, y comprobemos que el resultado es el mismo; se
interpretan los espacios o tabuladores como un único carácter de espacio en blanco.

NOTA: Hagamos la prueba de no introducir el paréntesis final de la lista indicada.

Con la función + podemos indicar valores enteros o reales. Si todos los valores son
enteros el resultado será entero, pero si uno o varios de ellos son reales —o todos ellos—,
el resultado será real. Esto significa que únicamente es necesario introducir un valor real
para recibir una respuesta real. Por ejemplo, si introducimos la siguiente línea en la línea
de comandos en AutoCAD:

(+ 14 10 20.0)
el resultado será:
44.0
o sea, un número real.
Autolisp

Esto aquí parece irrelevante, pero comprenderemos su utilidad al hablar, por ejemplo, de
la división.
Si indicamos un solo sumando con esta función, el resultado es el valor del propio
sumando. Por ejemplo:
(+ 23)
devuelve:
23
Y si se escribe la función sin argumentos, el resultado es 0 (función sin argumentos: (+)).

Los valores indicados en la función de suma pueden ser directamente valores numéricos o
nombres de variables numéricas declaradas anteriormente, por ejemplo:

(+ 10.0 x total)

En esta función, 10.0 es un valor constante real y x y total son dos nombres de variables
que han debido ser anteriormente declaradas; ya aprenderemos a declarar variables.
Si la variable no existiera se produciría un error bad argument type de AutoLISP.

Otros ejemplos con números negativos:

(+ 10 –23)
devuelve –13

(+ -10 –10)
devuelve -20

NOTA: Si se produce algún error de sintaxis u otro, podemos acudir al final de este
MÓDULO para ver una relación de los mensajes de error de AutoLISP.

La función de resta, por su lado, tiene la siguiente sintaxis:

(- [valor1 valor2 valor3...])

Esta función devuelve la diferencia del primer valor con todos los demás indicados. Así
por ejemplo:
(- 10 5) da como resultado 5 y la siguiente expresión:
(- 10 5 2) da como resultado 3.

Esto es producto de restar 10 – 5 = 5 y, luego, 5 – 2 = 3; o lo que es lo mismo 10 – (5 +


2) = 3.

Al igual que en la suma, si se indican valores enteros el resultado será entero, si se indica
uno real (con uno es suficiente) el resultado es real, si se indica un solo valor se devuelve
el mismo valor y si se escribe la función sin argumentos se devuelve 0. Así pues, si
Manual Práctico de AutoCAD

queremos un resultado real efectuado con números enteros para posteriores operaciones,
deberemos indicar uno de los valores enteros; de la siguiente manera, por ejemplo:

(- 10 5.0 2) o cualquier otra combinación posible de uno o más números enteros.

Como se ha explicado para la suma, los valores de los argumentos para la resta pueden
ser constantes, eso sí, siempre numéricas, o variables:

(- tot num1 num2)

Llegados a este punto, podemos suponer ya las diferentes combinaciones que podremos
realizar con las distintas funciones aritméticas. Por ejemplo, es factible la evaluación de la
siguiente expresión:

(+ 12 (- 2 -3)) cuyo resultado es 17.

Las operaciones primero se hacen de adentro hacia afuera. En este ejemplo, se suma la
cantidad de 12 a la diferencia 2 – -3, esto es, 12 + (2 + 3) = 17.
Como vemos, existen dos listas, una interior anidada a la otra que es, a la vez, argumento
de la lista exterior. Ocurre lo mismo con nombres de variables:

(- fer1 (+ -sum1 sum2) 23.44)

Con respecto al producto su sintaxis es la siguiente:

(* [valor1 valor2 valor3...])

Se evalúa el producto de todos los valores numéricos indicados como argumentos.


Como anteriormente, si un valor es real el resultado es real. Un solo valor como
argumento devuelve el mismo valor. Ningún valor devuelve 0. Veamos un ejemplo:

(* 12 3 4 -1)
El resultado es -144.

Veamos otros ejemplos:


(* 2 3)
(* val (- vax vad))
(- (* 12 2) 24)
(+ (- -10 -5) (* 3 total 23))
Autolisp

NOTA: Si escribimos más paréntesis de los necesarios por la derecha se nos mostrará un
mensaje de error. Recordar que si no los escribimos nos da la opción de escribirlos
después, así como el número de ellos que faltan. De todas forma, consúltese el final del
MÓDULO para la explicación de los mensajes de error.

La sintaxis de la división es la que sigue:


(/ [valor1 valor2 valor3...])

La función / realiza el cociente del primer valor numérico por todos los demás, es decir,
divide el primer número por el producto de los demás. Por ejemplo:
(/ 10 2) da como resultado 5.

Y el ejemplo siguiente: (/ 100 5 5) da como resultado 4, es decir, 100 / 5 = 20 y, luego,


20 / 5 = 4; o lo que es lo mismo, 100 / (5 * 5) = 4.

Otros dos ejemplos:


(/ 24 (* (+ 10.0 2) 12))
(/ 12 2 1)

Con respecto al cociente debemos realizar las mismas observaciones anteriores, esto es,
si se indica un solo valor se devuelve el mismo valor, si se indica la función sin
argumentos se devuelve 0 y si se indican valores enteros sólo se devuelven valores
enteros. Esto último cobra especial sentido en el caso de las divisiones, ya que el cociente
entre dos números enteros puede ser un número real. Veamos el siguiente ejemplo:

(/ 15 7) Si introducimos esta línea el resultado será 2.

El motivo es que, como hemos especificado valores enteros, el resultado se muestra en


forma de número entero, con la parte decimal o mantisa truncada. Para asegurarnos de
recibir una respuesta correcta (con decimales significativos), deberemos introducir uno de
los valores —o todos ellos, pero con uno es suficiente— como valor real, de la siguiente
forma:

(/ 15 7.0) Ahora el resultado será 2.14286.

El número entero podría haber sido el otro:


(/ 15.0 7)
Manual Práctico de AutoCAD

Esto debemos tenerlo muy en cuenta a la hora de realizar operaciones cuyo resultado
vaya a ser parte integrante de otra operación —o no— que puede devolver decimales.

Vemos otros ejemplos de divisiones:


(/ -12.0 7.8 210)
(/ (+ (- 23.3 32) 12.03) (/ (* (+ 1.01 2.01) 100)))
(+ datos (/ grupo (* 100 2)))
NOTA: Evidentemente, la división por 0 produce un error de AutoLISP: divide by zero.

1ª FASE INTERMEDIA DE EJERCICIOS


• Realizar mediante AutoLISP las siguientes operaciones aritméticas (están expresadas
en notación informática sencilla de una línea):
— (50 + 5) / 2
— (200 * 5 – 3) / (4 / 2)
— (10.23 – (12.03 / 3)) * (12 + (2 * -2) – ((12.5 / 2) * 2.65))
— (19 + 23) / (10 + (23 / (23 / 19)))
— ((-20 / 5) – 1) / (15.5 * ((15.5 – 1) / 12))

MATEMÁTICA AVANZADA
Fuera aparte de las funciones aritméticas de nivel básico, programando en AutoLISP
podemos realizar operaciones matemáticas complejas como raíces cuadradas o senos.
Vamos a explicar aquí las funciones que controlan estas operaciones.

Las dos primeras que veremos son sencillas de entender y utilizar. Ambas se refieren al
incremento, positivo o negativo, de una unidad a un valor numérico.
(1+ valor)
Esta sintaxis corresponde a la función de incremento positivo de una unidad al valor
indicado. Así, si queremos incrementar en 1 el valor 576, haremos:

(1+ 576)

Esto equivale a (+ 576 1) pero es de una forma más cómoda; el resultado es 577.

NOTA: La función se denomina 1+ en sí, por lo que no existe espacio entre 1 y +.


Podemos realizar estos incrementos con nombres de variable: (1+ n) lo que incrementará
en una unidad el valor de n. Esto puede ser especialmente necesario para controlar los
llamados contadores-suma en programación, del tipo:

(SETQ sum (1+ sum))

Esto ya lo veremos a la hora de declarar variables.


La siguiente función resta (incremento negativo) una unidad al valor numérico indicado.
Equivale a (- valor 1), pero de una forma más cómoda.

(1- valor)

Por ejemplo:
(1- 32) cuyo resultado es 31.
Autolisp

Otros ejemplos de estas dos funciones:


(1- n)
(1- 67.90)
(1- -23)
(1+ -34.0)
(1+ (+ tuttot 1)
(1- (* 2 2))
(1- (* (/ 32 2) (+ 10 1.0)))
(ABS valor)

Esta función ABS devuelve el valor absoluto del número indicado o expresión indicada.
De esta forma, la siguiente expresión:
(ABS –23) devuelve 23.

Las siguientes expresiones tienen el siguiente efecto indicado:


(ABS –25.78) devuelve 25.78
(ABS 45) devuelve 45
(ABS 0) devuelve 0
(ABS –13) devuelve 13
(ABS (/ 2 3.0)) devuelve 0.666667

(ABS (/ 2 -3.0)) devuelve 0.666667

(FIX valor)
FIX trunca un valor a su parte entera (positiva o negativa), es decir, de un número real
con decimales devuelve únicamente su parte entera. Pero, cuidado, no se produce
redondeo, sólo un truncamiento.

Ejemplos:
(FIX 32.79) devuelve 32
(FIX –12.45) devuelve –12
(FIX (/ 10 3.0)) devuelve 3
(FIX (/ 10 –3.0)) devuelve –3

(REM valor1 valor2 [valor3...])


Esta función AutoLISP devuelve el resto del cociente (módulo) de los dos valores
introducidos en principio. Por ejemplo, la siguiente expresión devuelve 6 como resultado:

(REM 20 7) Dicho 6 es el resto que resulta de dividir 20 / 7.


Manual Práctico de AutoCAD

Si aplicamos la regla de la división (dividendo es igual a divisor por cociente más resto):
20 = 7 * 2 + 6, vemos que se cumple correctamente.

Si se especifican más de dos valores, el resto anterior es dividido entre el actual,


devolviendo el nuevo resto de la nueva división. Por ejemplo:
(REM 20 7 4) da como resultado 2.
El primer resto 6 se calcula de la forma explicada en el ejemplo anterior y, el resultado
final 2, se produce al dividir dicho primer resto entre el tercer valor 4. Al dividir 6 / 4, nos
da un resultado (que es igual a 1) y un resto 2 (valor final obtenido). Y así sucesivamente.
Otros ejemplos:
(REM –1 2)
(REM 0 23)
(REM (* 23 2) (- (+ 1 1) 45.5))
(REM 54 (* 3 -4))
Pasemos ahora a ver las funciones trigonométricas, esto es, cómo calcularlas mediante
AutoLISP. La primera sintaxis se refiere al seno de un ángulo y es la siguiente:
(SIN ángulo)
La función SIN devuelve el seno de un ángulo expresado en radianes.
Ejemplos:
(SIN 1) devuelve 0.841471
(SIN (/ PI 2)) devuelve 1.0

NOTA: Como sabemos PI es un constante de AutoLISP, por lo que no hace falta declararla
como variable; ya tiene valor propio y es 3.14159. Aún así, se puede calcular su valor
exacto mediante la expresión: PI = 4 * arctag 1.

(COS ángulo)
COS devuelve el coseno de un ángulo expresado en radianes.
Ejemplos:
(COS PI) devuelve –1.0
(COS (* 3 4)) devuelve 0.843854

NOTA: Nótese que PI es un valor real, por lo que el resultado será real.

(ATAN valor1 [valor2])


Esta función ATAN devuelve el arco cuya tangente es valor1 expresada en radianes, es
decir, realiza el arco-tangente de dicho valor. Por ejemplo:

(ATAN 1.5) devuelve 0.98

Si se indica un segundo valor (valor2), ATAN devuelve el arco-tangente de valor1 dividido


por valor2. Esto permite indicar la razón entre los lados de un triángulo recto, es decir,
escribir la tangente directamente como cociente del seno entre el coseno. Si valor2 es 0,
el valor devuelto será igual a PI / 2 o a –PI / 2 radianes, dependiendo del signo de valor1.

Ejemplos:
(ATAN 1 1)
(ATAN 1 (* 2 -4.5))
Autolisp

Estas son las tres funciones trigonométricas de AutoLISP. En este punto se nos plantean
un par de problemas: ¿cómo calculo las restantes funciones trigonométricas? Y ¿cómo
convierto grados sexagesimales en radianes y viceversa?

La segunda cuestión es sencilla, ya que basta aplicar al fórmula rad = grados * PI / 180
para convertir grados en radianes. La operación inversa en fácilmente deducible.
La primera pregunta tiene una respuesta no menos sencilla, y es que en la mayoría —por
no decir todos— de los lenguajes de programación únicamente nos proporcionan estas
funciones trigonométricas básicas y, a partir de ellas, podemos calcular las funciones
trigonométricas derivadas inherentes. La manera se explica a continuación mediante
notación sencilla de una línea:

NOTA: El símbolo ^ significa exponenciación. √ es raíz cuadrada. signo (x) se refiere al


signo del valor; si éste es positivo signo (x) valdrá 1, si es negativo valdrá –1 y si es cero
valdrá 0. No debemos preocuparnos ahora por esto, ya que aprenderemos en breve o
más adelante —con mayor soltura— a realizar exponenciaciones, raíces cuadradas y
operaciones con signos.

Sigamos, pues, ahora con otras diferentes funciones que nos ofrece AutoLISP a la hora de
realizar operaciones matemáticas. La siguiente dice referencia a las raíces cuadradas; su
sintaxis es:

(SQRT valor)
Esta función devuelve el resultado de la raíz cuadrada del valor indicado, ya sea un
guarismo simple o una expresión matemática, como siempre. Así por ejemplo, veamos
unas expresiones con sus correspondientes evaluaciones:

(SQRT 4) devuelve 2.00


(SQRT 2) devuelve 1.4142
(SQRT (* 2 6)) devuelve 3.4641

La intención de extraer una raíz cuadrada de un número negativo produce el error


function undefined for argument de AutoLISP.

Por otro lado, la sintaxis para la función exponencial es la siguiente:

(EXPT base exponente)


EXPT devuelve el valor de base elevado a exponente. De esta forma, para elevar 5 al
cubo (igual a 125), por ejemplo, escribiremos:
Manual Práctico de AutoCAD

(EXPT 5 3)
Otro ejemplo:
(EXPT 2.3 7.23)
De esta forma, como sabemos, podemos resolver el resto de raíces (cúbicas, cuartas,
quintas...) existentes. Ya que raíz cúbica de 32 es lo mismo que 32 elevado a 1 / 3,
podemos escribir la siguiente expresión:

(EXPT 32 (/ 1 3))
Así también:
(EXPT 20 (/ 1 5))
(EXPT 10 (/ (+ 2 4) (- v23 rt sw2))
(EXPT 3 (/ 1 2))
NOTA: El intento de extraer raíces negativas de cualquier índice producirá el mismo error
explicado en SQRT.

(EXP exponente)
Esta función devuelve la constante (número) e elevada al exponente indicado. Se
corresponde con el antilogaritmo natural. Por ejemplo:
(EXP 1) devuelve 2.71828

(LOG valor)
LOG devuelve el logaritmo neperiano o natural (en base e) del valor indicado. Por
ejemplo:
(LOG 4.5) devuelve 125.0000

(GCD valor_entero1 valor_entero2)


Esta sintaxis se corresponde con la función de AutoLISP GCD, que devuelve el máximo
común denominador de los dos valores indicados. Estos valores han de ser
obligatoriamente enteros, de no ser así, AutoLISP devuelve bad argument type como
mensaje de error.
Veamos unos ejemplos:

(GCD 45 80) devuelve 5


(GCD 80 70) devuelve 10
(GCD (* 10 10) (/ 70 2)) devuelve 5

Si se indica un entero negativo el mensaje de error de AutoLISP es improper argument.

Las dos últimas funciones matemáticas que veremos pueden sernos de gran ayuda a la
hora de programar. Una de ellas (MAX) devuelve el mayor de todos los números
indicados en la lista. Su sintaxis es:

(MAX valor1 valor2...)

Los valores pueden ser números enteros o reales, y también expresiones matemático-
aritméticas. Así por ejemplo:

(MAX 78.34 –12 789 7) devolverá 789.0, ya que es el número mayor.


Autolisp

Lo devuelve como real por la aparición de decimales en el elemento 78.34. Como


sabemos, con la sola aparición de un valor real en una lista, el resultado es real.

Si el elemento mayor de la lista es un expresión matemática, se devolverá su resultado,


no la expresión en sí, por ejemplo:
(MAX (* 10 10) 5) devolverá 100 como resultado (10 * 10).

Otro ejemplo:
(MAX –5 –7 –9) devolverá –5.
(MIN valor1 valor2...)
La función MIN, por su lado, devuelve el menor de todos los valores indicados en lista.
Las demás consideraciones son análogas a la función anterior. Ejemplos:
(MIN 1 2 3 4 7) devuelve 1
(MIN 23.3 7 0) devuelve 0.0
(MIN (/ 7 3) 0.56) devuelve 0.56

Ejemplos de MAX y MIN con variables:


(MIN x y z)
(MIN (+ x1 x2) (+ y1 y2) (+ w1 w2) (+ z1 z2))

Y hasta aquí todas las funciones que tienen que ver con operaciones matemáticas.
Pasaremos, tras unos ejercicios propuestos, a ver las operaciones de comparación, muy
interesantes y sencillas de comprender.

2ª FASE INTERMEDIA DE EJERCICIOS

• Realizar mediante AutoLISP las siguientes operaciones matemáticas (están expresadas


en notación sencilla de una línea):
— √ ((20 – 3) * (8 – 2))
— 1 + 78.8 + ((78.8 ^ 2) / 2) + ((78.8 ^ 3) / 3)
— (sen (√ (80 * 28.002) – cos (PI / 2))) / (PI – (1 / 2))
— arccos (100 / 2)
— (124.6589 * (e ^ 2.3)) / (7 * √ 2)
— ln (45 * (7 / 2))
— (23.009 / 78.743) ^ (56.00123 – 1)
• Realícense ejercicios de cálculo de valores mayores y menores de listas, así como de
máximos comunes denominadores.

• Realizar un par de ejercicios de incremento y decremento de una unidad a valores.


NOTA: Las operaciones en general siguen en AutoLISP la jerarquía de las operaciones
matemáticas: paréntesis internos, paréntesis externos, operadores unitarios (signos),
potenciación, multiplicación y división, suma y resta, operadores relacionales (mayor
que, menor que...) y operadores lógicos (álgebra de Boole). Y cuando existen varios
operadores en el mismo nivel, se ejecutan de izquierda a derecha. Ahora mismo
veremos operadores relacionales o de comparación y, luego, el álgebra de Boole en
AutoLISP.
Manual Práctico de AutoCAD

Haremos un primer ejemplo muy sencillo para ingresar a mostrar las diferentes funciones
predeterminadas que tiene AUTOLISP.
Los programas en AutoLISP son archivos de texto con la extensión .LSP. Por tanto, se
crean directamente con un Editor, se recomienda el Block de Notas.
Nombre de archivo: Saludo.lsp
Contenido del archivo:
(defun c:SALUDO()
(ALERT “Hola mundo”)
)
Explicación:
Defun c: Declara una función que podrá ser llamada desde la línea de comandos de
AUTOCAD, por ello es que se le agrega c:
SALUDO(): Es una función cuyas variables serán globales, es decir, que recibirán un valor
al ejecutar la función o programa.

Debemos escribir el programa de la función SALUDO en el block de notas como se indica.

Hecho lo anterior, procedemos a guardar el archivo que contiene las sentencias. Debemos
ponerle un nombre, en este caso saludo.lsp
“lsp” es la extensión que se usa para los programas en LISP

Una vez guardado el archivo con extensión lsp procedemos a cargar el programa en
AUTOCAD. Para ello usamos la ruta siguiente: MANAGE – APPLICATIONS – VISUAL
LISP EDITOR
Autolisp

Se nos presentará un cuadro de edición (en el que pudimos también haber escrito nuestro
primer programa), en el menú de opciones elegimos FILE – OPEN FILE…

Al aparecer la ventana de búsqueda, procedemos a ubicar el archivo que contiene el


primero programa.

Una vez que pulsamos el botón ABRIR se mostrará la codificación. Debemos notar que
las comillas se deben volver a colocar.
Manual Práctico de AutoCAD

Procedemos a reescribir las comillas.

Para que AUTOCAD ejecute el programa, debemos activarlos usando el ícono que se
indica en la figura siguiente.
Autolisp

Una vez que pulsamos sobre el ícono antes indicado, aparecerá un mensaje de
notificación indicando la dirección del archivo cargado.

Para ejecutar finalmente el programa, vamos a la barra de comandos de AUTOCAD e


ingresamos mediante el teclado, el nombre del archivo, en este caso se llama SALUDO.
Notar que ya aparece en el menú contextual de opciones de comando.

Pulsamos ENTER y el programa se ejecutará mostrando el mensaje que hemos codificado.


La función creada SALUDO, al ser cargada dentro de AutoCAD, y ejecutada provocará un
resultado que mostrará un cuadro con el contenido de “Hola mundo”, como se muestra
en la siguiente figura.
Manual Práctico de AutoCAD

3.- FORMA DE CARGAR UN PROGRAMA EN AUTOLISP


En la sección anterior hemos mostrado una de las maneras de cargar un programa
codificado para AUTOLISP y cómo cargarlo al sesión de AUTOCAD actual.
Mostramos otra manera de llamar programas para que sean ejecutados en AUTOLISP

Utilizar APPLOAD
En la línea de comandos de AutoCAD escribir APPLOAD

Seguidamente, se mostrará un cuadro de diálogo de exploración para ubicar el archivo


que contiene la codificación en AUTOLISP.
Una vez que elegimos el archivo, pulsamos en LOAD
Autolisp

Aparecerá un cuadro de notificación indicando que se ha cargado un archivo ejecutable y


nos da la opción de cargarlo o no. También indica la ruta de acceso. En este caso
pulsamos en LOAD

Luego en CLOSE. Notaremos un mensaje en la barra de comandos indicando que el


archivo ha sido cargado a la sesión.

Para ejecutar el programa cargado, simplemente colocamos el nombre del mismo en la


barra de comandos, como se indica:
Manual Práctico de AutoCAD

Se ejecutará el programa según la codificación que hayamos elaborado.

4.1.- DECLARAR FUNCIONES

(DEFUN <SIMB> <LISTA ARGUM> <EXPR>...)

De acuerdo a la sintaxis indicada, creamos la siguiente codificación:


(defun seno(x) (setq xr (sin x ) ) )
Explicación:
defun Se declara una función.

seno Nombre de la función.

(x) Es el argumento de la función declarado con una variable.


Puede estar vacía o contener varios argumentos.

(setq xr (sin x ) Expresión de funciones y variables.


)

(setq) Establece el valor de un símbolo o símbolos asociados a las


expresiones. Esta es la función de asignación básica en
AutoLISP. La función setq puede asignar varios símbolos en
una llamada a la función.
En este caso, la variable xr recibe un valor de la expresión que
le sigue entre paréntesis.

sin Es la función trigonométrica seno.

Esta función, a diferencia de lo mostrado antes, se ejecutará sin necesidad de grabarla


como archivo y luego cargarla.

Para extraer el valor actual de esas variables, basta con introducir desde la Línea de
Comando un signo “!” seguido del símbolo o nombre de la variable.
Autolisp

El uso de variables locales asegura que las variables en sus funciones no se vean
afectadas por la aplicación de otras aplicaciones y que sus variables no siguen estando
disponibles después de la función de llamada ha finalizado su tarea.
El peligro en el uso de variables globales, en lugar de las variables locales, es que, sin
darse cuenta pueden ser modificadas fuera de la función, antes declarada, por otras
funciones. Esto puede conducir a un comportamiento impredecible, y que puede ser muy
difícil identificar la fuente de este tipo de problema.

Otra ventaja del uso de variables locales es que AutoCAD puede reciclar el espacio de
memoria utilizado por estas variables, mientras que las variables globales se van
acumulando dentro de espacio de memoria de AutoCAD.
Hay algunos usos legítimos de las variables globales, pero estos deben mantenerse al
mínimo. También es una buena práctica para indicar que tiene la intención de ser una
variable global. Una forma común de hacer esto es agregar una apertura y cierre de
asterisco al nombre de variable, por ejemplo, * - capa por defecto *.

Las variables locales conservan su valor sólo en la medida de la función que define los
está ejecutando. Después de la función finaliza la ejecución, los valores de las variables
locales son descartados de forma automática, y el sistema recupera el espacio de
memoria de la variable utilizada. Esto se conoce como la recolección de basura
automática, y es una característica de la mayoría de los entornos de desarrollo de LISP,
como VLISP. Las variables locales utilizan la memoria más eficiente que las variables
globales.

Otra gran ventaja es que las variables locales hacen que sea más fácil de depurar y
mantener sus aplicaciones. Con las variables globales, nunca se está seguro de cuándo o
en qué función el valor de la variable puede ser modificada, con variables locales no
tienen la medida de rastrear. Por lo general, termina con menos efectos secundarios (es
decir, una parte del programa que afecta a una variable de otra parte del programa).

Vamos a aumentar una expresión más al ejemplo anterior, haciendo que el valor
ingresado en grados sexagesimales (un grado sexagesimal es el ángulo central
subtendido por un arco cuya longitud es igual a 1/360 de la circunferencia. Es la
nonagésima (1/90) parte de un ángulo recto) sea convertido a radianes (El radián es la
unidad de ángulo plano en el Sistema Internacional de Unidades. Representa el ángulo
central en una circunferencia y abarca un arco cuya longitud es igual a la del radio).

Para hacerlo debemos agregar una función que haga la conversión.

Si sabemos que 180 grados sexagesimales es equivale a ∏ radianes, entonces si xr es la


variable que tomará el valor de la conversión, tendremos:

xr  x
180
En forma de función para AUTOLISP será: (setq xr (* x ( / PI 180)))
Entonces agregamos la expresión a la anterior, quedando de ésta manera:

(defun seno(x) (setq xr (* x ( / pi 180))) (setq s (sin xr ) ) )

La codificación en la barra de herramientas de AUTOCAD así como el resultado para un


valor de 30º sexagesimales, es como se indica a continuación:
Manual Práctico de AutoCAD

Ya tenemos un programa sencillo que nos permitirá calcular ángulos ingresando el valor
sexagesimal.

Consideraciones:
Se han usado los operadores de multiplicación (*) y de división (/), los cuales siguen un
formato de primer escribir el operador y luego los dos número o más que servirán para el
cálculo. Los números o variables deberán estar separados por un espacio.

Command: (DEFUN seno (x) (SETQ xr (* PI (/ x 18Ø.Ø ) ) ) (SETQ s

Si se extraen los contenidos de los diferentes símbolos utilizados, los resultados son los
siguientes:
!x nil
!xr 0.523599
!s 0.5
!setq #<SUBR @163caa3c SETQ>
!sin #<SUBR @16388dac SIN>

La variable "x" no almacena ningún valor, puesto que es simplemente una variable
asociada a la función "seno". Las variables "xr" y "s" son globales y mantienen los valores
almacenados. Los nombres de comandos de AutoLISP, como SETQ y SIN, devuelven su
definición de subrutinas.
La función "seno" se ha definido con una variable asociada. Con el comando DEFUN se
pueden definir funciones de usuario con tantas variables como se desee. Por ejemplo, una
función llamada "suma 3” que tiene como finalidad realizar la suma de tres números:
(DEFUN suma3 (x y z) (SETQ sum (+ x y z) ) )

Para llamar a la función "suma3" hay que especificar los valores de las tres variables
asociadas para los cuales se quiere calcular la suma.
Autolisp

Notamos que x,y,z al ser declaradas como variables locales, no se quedan almacenando
ningún valor, a diferencia de la variable sum que fue tomada como global.

Las funciones definidas por el usuario mediante (DEFUN) pueden integrarse en AutoCAD
como una orden más, Para ello deben tener un nombre precedido por C: y comprender
una lista de variables globales vacía, aunque pueden tener variables locales. Lógicamente,
el nombre de la función definida no debe coincidir con el de una orden existente de
AutoCAD ni con el de un comando de AutoLISP

Por ejemplo, si en vez de tener que evaluar la función "seno" cada vez que se quiere
ejecutar interesa implementarla en AutoCAD como una orden nueva, se definiría de la
siguiente manera:

Al ejecutar la función creada “seno”, ya no usará el paréntesis.

4.2.- PANTALLA DE TEXTO (TEXTSCR)


Sirve para mostrar sobre la pantalla grafica el editor de comandos, facilitando la
codificación de la función.

Al mostrarse el editor de comandos con todo lo que hemos ingresado, ya que se puede
desplazar, podemos mantener activa este cuadro simplemente minimizando mediente el
ícono de sub-guión de la esquina superior derecha.
Manual Práctico de AutoCAD

4.3.- ATRIBUIR VALORES

(SETQ <SIMB1><EXPR1>[<SIMB2> <EXPR2>...])

Este comando atribuye el valor de la expresión <exprl> a la variable cuyo nombre


es<simb1>, el de <expr2> a <simb2>, y así sucesivamente. Si las variables no están
previamente definidas, las crea. La función devuelve el valor atribuido a la última variable.
Los nombres de símbolos no pueden ser un literal (no valdría, por ejemplo, "QUOTE x").

SETQ es la función básica de atribución de valores en AutoLISP.


Por ejemplo:
( SETQ x 5 y "Hola" z ' (a b) w 25.3 )

La variable x, tomó el valor de 5; la variable y, tomó el valor de una cadena de


caracteres; la variable z, devuelve una lista; y w tomar el valor de 25.3
Autolisp

Importante: Hay que tener la precaución de no utilizar con SETQ símbolos de variables
que coinciden con nombres de comandos de AutoLISP, pues esto descartaría la definición
de esos comandos. Por la misma razón, tampoco se deben utilizar nombres de órdenes de
AutoCAD.

4.4.- ALMACENAR UN PUNTO


(GETPOINT [<PTO>] [<”MENSAJE”>])

Hace una pausa en la entrada del usuario de un punto, y devuelve ese punto.
Este comando aguarda a que el usuario introduzca un punto, bien directamente por
teclado o señalando en pantalla,
Para almacenar en una variable "pt1" ese punto se utilizaría SETQ, como se ha visto en el
apartado anterior.
(SETQ pt1 ( GETPOINT " Introducir un punto: ") )

Ese punto queda ya almacenado en una variable global para su posterior utilización, como
se indica mediante !pt1
(SETQ pt2 ( GETPOINT ' ( 3Ø 5Ø) "Segundo punto: ") )

Se puede ingresar el punto por medio del teclado o del indicador.


Manual Práctico de AutoCAD

Lo que hace la función es asignar el segundo punto a pt2.


En este ejemplo se ha especificado un punto de base de coordenadas (3Ø 5Ø Ø); la
coordenada Z = Ø se toma por defecto. Aparece una línea "elástica" entre ese punto de
base y la posición del cursor hasta que se "pincha" el segundo punto pt2 (la línea como
tal no se dibuja, la línea elastica sirve de guia en base al punto base pt1, hasta señalar o
ingresar el segundo punto).

4.5.- ACCESO A COMANDOS DE AUTOCAD

(COMMAND <ARGUMENTOS>...)

Ejecuta un comando de AutoCAD y la entrada suministrada.


El siguiente ejemplo muestra cómo ejecutar el comando CIRCLE y crear un círculo con un
diámetro de 2,75.
(command "circle" "5,4" "_d" 2.75)

Es como si activáramos el comando CIRCLE, pero ahora los valores ingresan


programados, si hacemos rutinas podremos dibujar muchos círculos de acuerdo a los
parámetros que demos.
Al ejecutarse CIRCLE, lo que está entre comillas indica que son valores asignados, en este
caso corresponden al centro del círculo. Luego, “d” indica que se está eligiendo como
medida del círculo su diámetro y finalmente se carga el valor del mismo, pero sin comillas,
lo cual indica que es un valor numérico.
La función devuelve el valor del diámetro. Pero dibuja el círculo en la ventana gráfica.

El siguiente ejemplo muestra cómo pedir al usuario el punto central del círculo.

(setq ccir (getpoint "\nIngrese el centro del círculo: "))

Creamos la variable ccir, luego, mediaente getpoint y un mensaje con salto de línea(\n)
pedimos los puntos, ingresamos los mismos, la función asigna el centro a la variable ccir y
muestra los puntos ingresados.
Autolisp

El siguiente ejemplo muestra como tomar la variable ccir y asigna las coordenadas del
centro del círculo cuando se ejecuta el comando CIRCLE.

(command "circle" ccir "d" 2.75)

El siguiente ejemplo muestra el comando LINE :


(command "line" "0,0" "5,7" "")

Notar que hemos puestos unas comillas al final, si no las colocamos entonces el comando
LINE seguirá activo.
Manual Práctico de AutoCAD

En el ejemplo se dibujaría una línea entre el punto 5Ø,5Ø y el almacenado en la variable


pt2 (que deberá contener, por tanto, una lista de dos o tres números reales). La cadena
vacía final introduce un RETURN y termina en AutoCAD la orden LINEA.

(COMMAND "line" “5Ø 5Ø” pt2 "")

Hubiéramos tenido el mismo resultado usando apostrofo

(COMMAND "line" '(5Ø 5Ø) pt2 "")

Los comandos del tipo "GET...", como GETPOINT del apartado anterior, no se pueden
utilizar directamente como argumentos de COMMAND. Por ejemplo, si se pretende dibujar
una línea desde el punto 5Ø,5Ø hasta un punto señalado por el usuario:

( COMMAND “line" '(5Ø 5Ø) (GETPOINT ' (5Ø 5Ø) " Segundo punto; ") "" )

Se produce un error y el abandono de la función en curso. Para especificar un punto


introducido mediante: GETPOINT (o más datos aceptados por funciones "GET,...") hay
que ejecutar previamente esa función y almacenar el valor en una variable.

Command: (SETQ pt2 (GETPOINT '(5Ø 5Ø) "Segundo punto: “ ) )


Segundo punto: (se señala) (12Ø.Ø 7Ø.Ø Ø.Ø)
Command: (COMMAND "line" ' (5Ø 5Ø) pt2 " " )

Ahora la función se ejecuta correctamente y la línea queda dibujada entre el punto 5Ø,5Ø
y el punto almacenado en "pt2"

Si se llama a una orden de AutoCAD y se especifica corno argumento de COMMAND el


símbolo predefinido pause, la orden se interrumpe hasta que el usuario introduzca los
datos que en ese momento se requieran, pudiendo hacerlo de forma dinámica mediante
"arrastre". El mecanismo es similar al uso de las contrabarras en las opciones de menú.
Autolisp

En el momento en que se introducen esos datos (puede ser un valor, una opción, un
punto, etc.) continúa la ejecución de COMMAND desde AutoLISP.
Si el usuario introduce una orden transparente durante la interrupción de "pause" (como
'ZOOM o 'PAN), la función COMMAND permanecerá temporalmente suspendida, Esto
permite al usuario efectuar todos los zoom o pan que desee antes de reanudar la función
COMMAND introduciendo los datos que sean precisos.

(COMMAND "circle" "50,50" "10" "line" "50,50" pause "")

Este ejemplo dibuja un círculo con centro en 5Ø, 5Ø y radio 1Ø. Después comienza una
línea en 5Ø, 5Ø y se interrumpe hasta que el usuario especifica el punto final de la línea,
pudiendo hacer todos los zoom y encuadre que desee. En el momento en que se teclea o
señala ese punto, la función COMMAND introduce un RETURN y la orden LINE termina.
Obsérvese que los puntos se pueden también especificar como una cadena de texto tal
como se introducirían desde el teclado, con las coordenadas separadas por comas (en el
ejemplo: "5Ø, 5Ø” ).

4.6.-LITERAL DE EXPRESIÓN

(QUOTE <EXPR>)

Ya se ha dicho que este comando, que se puede abreviar con un apóstrofo, evita que se
evalúen los símbolos. Se puede emplear con cualquier expresión en AutoLISP y siempre
devuelve el literal de esa expresión, es decir, sin evaluar.

(QUOTE ( SETQ x 25 ) )

En el ejemplo anterior, usamos QUOTE para que devuelva el literal entre los paréntesis.
Manual Práctico de AutoCAD

(QUOTE ( DEFUN diblin ( ) "nada") )

En ambos casos, QUOTE devuelve el literal de la expresión sin evaluar.


AutoLISP siempre convierte todos los nombres de símbolos, funciones de usuario o
variables en mayúsculas. Por eso la variable “x” o la función "diblin" se devuelven en
mayúsculas. El "nil" que aparece después de la función "diblin" significa que no tiene
argumentos.

4.7.- EVALUAR EXPRESIÓN

(EVAL <EXPR»

Este comando evalúa la expresión indicada y devuelve el resultado de esa evaluación.

( EVAL (SETQ x 15) )

Es equivalente a hacer directamente (SETQ x 15). Como se ha dicho, AutoLISP evalúa


directamente los paréntesis en cuanto se encuentran cerrados. Sin embargo, EVAL tiene
aplicaciones específicas, como el ejemplo que se estudiará al hablar del comando READ.

4.8.- VALORES PREDEFINIDOS DE AUTOLISP


Como ya se ha dicho, existen unas subrutinas de AutoLISP que no son propiamente
comandos, sino valores predefinidos. Estas son las siguientes:
PI: Es el valor del número real "pi" 3.1415926...
T: Es el símbolo de True, Cierto (1 lógico),
Por último, el valor de Nada, Falso (Ø lógico), se representa en AutoLISP por nil. Este
valor aparece siempre en minúsculas y no se puede acceder a él. Por ejemplo,
Command: (SETQ nil 2Ø )
error: bad argument type no es un símbolo propiamente, sino un valor que representa
Vacio o Nada.

4.9.- ATRIBUIR VALOR A UN SÍMBOLO NO EVALUADO

(SET <SIMBXEXPR>)

Este comando atribuye el valor de la expresión indicada <expr> al símbolo <simb>.


Este símbolo se considera sin evaluar. La diferencia con SETQ es que aquí se atribuye o
asocia el valor de la expresión indicada, al literal del símbolo, haciendo ambos
equivalentes. Con SETQ se almacenaban valores en símbolos de variables no literales.
Autolisp

(SET ' a 25)

AutoLISP rechaza si se hace: (SET a 25). El símbolo debe ser literal.


Únicamente lo admite si previamente se atribuye a ese símbolo un literal de otro.
Command: (SET ' x 'a )
A
Command: (SET x 25 )
25
Orden: ! x
A
Orden: !a
25

En este caso se ha atribuido al símbolo x el valor literal del símbolo a. Si extraemos el


valor asociado a x, vemos que es A. Al hacer (SET x 25) se atribuye indirectamente el
valor 25 al literal asociado a x, que es A. Por eso el valor asociado al símbolo A es ahora
25.
4.10.- EJEMPLOS
a.-PROGRAMA PARA DIBUJAR TRES LINEAS A PARTIR DE UN PUNTO
Ingresamos la codificación siguiente al cuadro de edición de AUTOLISP

(DEFUN c:dib_lineas ( / pt1 pt2 pt3 pt4)


;(DEFUN c:dib_lineas ()
(PROMPT "\nEste programa dibuja tres líneas desde un punto")
(SETQ pt1 (GETPOINT "\nPrimer punto: "))
(SETQ pt2 (GETPOINT "\nSegundo punto: "))
(COMMAND "_line" pt1 pt2 "")
(SETQ pt3 (GETPOINT "\nTercer punto: "))
(COMMAND "_line" pt1 pt3 "")
(SETQ pt4 (GETPOINT "\nCuarto punto: "))
(COMMAND "_line" pt1 pt4 "")
)

Una vez que codificamos en la ventan de edición de AUTOLISP, grabamos el archivo,


en este caso le damos un nombre: LINEAS3
Notar que en la codificación se ha configurado para que la ejecución se realice desde
la barra de comandos directamente escribiendo la función DIB_LINEAS
Manual Práctico de AutoCAD

Una vez que hemos grabado la codificación, procedemos a cargarla a la sesión activa
usando el ícono que se indica.

Una vez que cargamos el programa, procedemos a escribir en la barra de comandos el


nombre de la función DIB_LINEAS

El programa nos pedirá 4 puntos, los cuales podemos ingresar por teclado o usando el
indicador.
Autolisp

Este capítulo comenta los procedimientos básicos para la utilización de listas, cómo
crearlas y cómo acceder a todo o parte de su contenido. Ya se ha visto un caso muy
importante y habitual de lista: los puntos en dos o tres dimensiones, que son listas de dos
o tres elementos reales. Los comandos de AutoLISP que se explican a continuación
permiten acceder a los componentes de esas listas, es decir, extraer los componentes X,
Y o Z de los puntos según interese.

5.1 PRIMER ELEMENTO DE LISTA

(CAR <LISTA>)
Devuelve el primer elemento de una lista
Si <lista> es vacia "()", devuelve "nil".
Una de sus aplicaciones más importantes es extraer el primer valor de una lista que
representa un punto, es decir, la coordenada X.

Ejemplos:

(car '(a b c))

(car '((a b) c))

Command: (car '())


Manual Práctico de AutoCAD

5.2.- SEGUNDO ELEMENTO Y RESTO DE LISTA

(CDR <LISTA>)

Devuelve una lista que contiene todos menos el primer elemento de la lista
especificada.
Si la lista está vacía, devuelve "nil".
Si la lista es un tipo especial de lista llamado "par punteado" con sólo dos elementos
(se estudiara más adelante), CDR devuelve el segundo elemento sin incluirlo en una
lista. Este tipo de listas son fundamentales en la Base de Programación Gráfica.

Ejemplos:

Command: (cdr '(a . b))

5.3.- SEGUNDO ELEMENTO DE LISTA

(CADR <LISTA>)

Este comando equivale a (CAR (CDR <lista>)), por lo que es muy útil para obtener
directamente la coordenada Y de una lista que represente un punto.

Command: (SETQ pt1 ' ( 25 36 40 ) )


Command: (SETQ y1 (CADR pt1 ) )

Los comandos CAR y CDR se pueden combinar de manera similar a lo visto, hasta el
cuarto nivel de anidación. Por ejemplo, si se tiene
Autolisp

Command: (SETQ lis ' ( ( a b ) ( x y ) 5 ) )

las siguientes combinaciones equivaldrían a:


(CAAR lis) a (CAR (CAR lis) ) devuelve a

(CDAR lis) a (CDR (CAR lis) ) devuelve (b)

(CADDR lis) a (CAR (CDR (CDR lis ) ) ) devuelve 5

(CADAR lis) a (CAR (CDR (CAR lis ) ) ) devuelve b

(CADDAR lis) a (CAR (CDR (CDR (CAR lis ) ) ) ) devuelve nil

Y así todas las combinaciones posibles. Según lo visto, el comando para obtener la
coordenada Z de un punto en 3d (tercer elemento de la lista) es CADDR.

( SETQ pt1 ' ( 3Ø 6Ø 9Ø ) )


(CADDR pt1)
Manual Práctico de AutoCAD

Si el elemento buscado de la lista no existe, la función devuelve nil. Por ejemplo, con
el valor de "pt1" del ejemplo anterior:
( CDDDR pt1)

Todas estas combinaciones son extremadamente útiles, tanto para manejar listas en
general como para gestionar directamente la Base de Dalos del Dibujo de AutoCAD.

5.4.- CREACIÓN DE LISTA

(LIST <EXPR>)
Toma cualquier número de expresiones y las combina en una sola lista.

(list 'a 'b 'c)

(list 'a '(b c) 'd)

(list 3.9 6.7)

Este comando reúne todas las expresiones indicadas en <expr> y forma con ellas una
lista, que devuelve como resultado de la evaluación.
Se utiliza sobre todo para definir variables de un punto, una vez obtenidas por
separado las coordenadas. Si, por ejemplo, como resultado de un programa se han
almacenado en “x1" "y1" y "z1" las coordenadas de un punto y se quiere definir una
variable "pt1" que contenga ese punto:

( SETQ pt1 (x1 y1 z1))


Autolisp

En este caso el paréntesis que contiene las tres coordenadas es evaluado por AutoLISP
y, como la función "x1" no está definida, produce un error.

( SETQ pt1 ' (x‟ y‟ z1 ) )

En este caso la variable“ptl" almacena el literal de la lista, pero no con los valores de
las coordenadas, que son los que interesan. Para conseguirlo hay que utilizar el
comando LIST.

( LIST x1 y1 z1)

( SETQ pt1 ( LIST x1 y1 z1 ) )

Ahora sí, el valor del punto está almacenado en "pt1". Obsérvese la diferencia del
resultado con valores de variable y con literales:
( LIST x1 y1 z1) devuelve (3Ø.Ø 6Ø.Ø 9Ø.Ø)
( LIST ' x1 ' y1 ' z1 ) devuelve ( x1 y1 z1 )

5.5.- INTRODUCIR OTRA ESQUINA

(GETCORNER <PTO> [<”MENSAJE”>])

Hace una pausa en la entrada del usuario de la segunda esquina de un rectángulo.


(getcorner '(7.64935 6.02964 0.0))
Manual Práctico de AutoCAD

Toma como referencia un punto en: (7.64935, 6.02964, 0.0)


Luego pide otro punto pero que será ingresando mediante el indicador en la ventana
gráfica, al marcar un punto, la función devolverá las coordenadas del punto, que es la
esquina de un rectángulo. Notar que no se dibuja el rectángulo, solo entrega las
coordenadas del punto que marcamos.

(getcorner '(7.64935 6.02964 0.0) "Pick a corner")

En este ejemplo se agrega un mensaje para indicar que se ingrese el punto de la otra
esquina.

El punto de base se expresa respecto al SCT actual. Si se indica un punto 3D, no se


tiene en cuenta la coordenada Z: siempre se toma como tal el valor actual de la
elevación,

Command: (GETCORNER ' ( Ø Ø ) "Otro punto: ")

En el ejemplo se visualiza el mensaje "Otro punto:" y aparece un rectángulo elástico


entre "Ø, Ø" y el cursor, hasta que se "pincha" y la función GETCORNER devuelve ese
punto.

EJEMPLO 1: DIBUJAR UN RECTÁNGULO

Una aplicación muy sencilla de la utilización de puntos como listas es un programa para
dibujar un rectángulo, el usuario introduce las dos esquinas de la diagonal y el programa
se encarga de calcular las otras dos para dibujar las cuatro líneas del rectángulo.
En el texto correspondiente a este programa se observa la práctica de ir sangrando los
paréntesis, de forma que los que se van abriendo tengan el de cierre en la misma
columna en vertical.
El contenido del programa que define una función llamada "sangrado" con las cuatro
esquinas como variables locales es el siguiente:

(DEFUN rectang ( / pt1 pt2 pt3 pt4 )


(GRAPHSCR)(SETQ pt1 ( GETPOINT "Primera esquina: ") )
(TERPRI)
(SETQ pt3 (GETPOINT "Segunda esquina: ") )
(TERPRI)
(SETQ pt2 (LIST (CAR pt3) (CADR pt1 ) ) )
(SETQ pt4 (LIST (CAR pt1) (CADR pt3 ) ) )
(COMMAND "line" pt1 pt2 pt3 pt4 "c")
)
Autolisp

La codificación en la ventana de edición de AUTOLISP será como se indica:

Ejecutamos la función desde la línea de comandos:

Al ejecutar la función, se nos pedirá dos esquinas del rectángulo, suficientes para hallar
las otras esquinas.

El programa asigna a "pt1" y "pt3" las dos esquinas introducidas por el usuario. Para
calcular “pt2”' hay que tomar la coordenada X de "pt3" con (CAR pt3) y la coordenada Y
de "pt1" con (CADR pt1), reuniendo ambas en una lista con LIST. De manera análoga se
almacena en "pt4" el punto obtenido con la coordenada X de "pt1" y la coordenada Y de
"pt3". Por último se dibuja la línea entre los cuatro puntos cerrándola al final.
Manual Práctico de AutoCAD

Se puede mejorar el programa haciendo uso del comando GETCORNER para introducir
la segunda esquina

(DEFUN rectang2 ( / pt1 pt2 pt3 pt4 )


(GRAPHSCR)
(SETQ pt1 (GETPOINT "Primera esquina: " ) )
(TERPRI)
(SETQ pt3 (GETCORNER pt1 "Segunda esquina: " ) )
(TERPRI)
(SETQ pt2 (LIST (CAR pt3 ) (CADR pt1 ) ) )
(SETQ pt4 (LIST (CAR pt1) (CADR pt3 ) ) )
(COMMAND "line" pt1 pt2 pt3 pt4 "c" )
)
Codificamos en la ventana de edición de AUTOLISP

La ejecución de la función es como de indica.


Autolisp

Este capítulo comienza a examinar cómo se obtienen con AutoLISP las estructuras básicas
de programación: coincidenciales o alternativas y repetitivas. Las primeras cuando la
secuencia de instrucciones del programa depende de que se cumplan o no una o varias
condiciones establecidas. Las repetitivas cuando es necesario repetir una secuencia un
número determinado de veces o hasta que se cumpla una condición, que sirve de control
del ciclo o "bucle".
Previamente se explican otros comandos para introducción de datos (hasta ahora se han
visto GETPOINT y GETCORNER) y también comandos de comparación y operadores
lógicos, necesarios para establecer condiciones en las estructuras de los programas.

6.1 INTRODUCIR UN NÚMERO ENTERO

(GETINT [<”MENSAJE”>])

Este comando o función inherente de AutoLISP acepta un número entero introducido por
el usuario y devuelve ese número. El valor debe encontrarse entre -32768 y +32767. Si el
usuario introduce un número no entero o un dato no numérico, se produce un mensaje
de error y AutoLISP solicita que pruebe otra vez.
Command: (SETQ nent ( GETINT "Introducir numero: " ) )
Introducir número: 25 ( Return )
25
Command: ! nent
25
En el ejemplo se introduce el número entero 25, que queda almacenado en la variable
global "nent".

6.2 INTRODUCIR UN NÚMERO REAL

(GETREAL [<”MENSAJE”>])

Totalmente similar al anterior, salvo que acepta un número real. Este número puede tener
todos los decimales que el usuario desee introducir (separados por el "punto" decimal). Si
se introduce un número entero, se considera como real. Si no se introduce un número, se
produce un mensaje de error y AutoLlSP solicita al usuario que pruebe otra vez.

Command: (SETQ nreal ( GETREAL "Numero real: " ) )


Numero real: 25 (Return)
25.Ø
Command: ! nreal
25.0

El valor introducido debe ser numérico. Si se trata de un ángulo, por ejemplo, no sería
aceptado en la notación de grados-minutos-segundos. AutoLlSP rechazaría 32d 15' 3Ø".

6.3 INTRODUCIR UNA DISTANCIA

(GETDIST [<PT1>] [<”MENSAJE”>])


Manual Práctico de AutoCAD

Este comando acepta el valor de una distancia introducida por el usuario. Este valor se
puede introducir directamente desde el teclado o mediante dos puntos del dibujo.
Si se introduce directamente, el formato debe ser el actual establecido por la orden
"Unidades". Pero, independientemente de este formato, GETDIST devuelve siempre un
número real.
Si se especifica un punto de base <ptl>, AutoLISP visualiza una línea elástica entre
ese punto y la posición del cursor, aguardando a que el usuario introduzca un segundo
punto. Esto se puede hacer con cualquiera de los métodos de AutoCAD: coordenadas
absolutas, relativas rectangulares, relativas polares, señalando directamente, etc.
Command: ( SETQ dis ( GETDIST ' (0 0) "Segundo punto: " ) )

Segundo punto: 1, 1
Command: !dis
1.41421

Para evaluar una distancia en general, dejando al usuario que señale los dos puntos,
sería necesario almacenar el valor del primer punto en una variable.
Command: ( SETQ pt1 ( GETPOINT "Primer punto:" ) )
(SETQ dis ( GETDIST pt1 " Segundo punto: ") )
Primer punto: 5Ø, 5Ø Segundo punto: 1ØØ, 1ØØ
7Ø. 71Ø7

6.4.- INTRODUCIR UNA CADENA DE TEXTO

(GETSTRING [<CR>] L<”MENSAJE”>])

Este comando acepta una cadena de caracteres introducida por el usuario desde el
teclado y devuelve esa cadena. Si la cadena contiene más de 132 caracteres, sólo
devuelve los 132 primeros caracteres.
Autolisp

Si se especifica <cr>, se toma como señal o condición de que el texto puede contener
espacios en blanco, siempre que <cr> no sea "nil".
Si <cr> fuera "nil" o no existiera, al introducir la cadena de texto desde AutoCAD el
primer espacio en blanco que se pretenda incluir es tomado como "Return" y termina
el texto. Si <cr> es distinto de "nil", la cadena de texto puede contener espacios en
blanco y entonces debe terminarse forzosamente con "Return".

(SETQ cad (GETSTRING "\nIntroducir texto: " ) )

6.5 OPERADORES DE COMPARCIÓN

(=) (/=) (<) (>) (<=) (>=)

Esta serie de comandos de AutoLISP efectúan operaciones de comparación de valores,


ya sean numéricos o textuales. Los valores se pueden indicar expresamente o por las
variables que los contienen.

Igual: (= <átomo> <átomo> ...)

Compara los valores de todos los <átomo> especificados. Si son todos iguales, el
resultado de la evaluación es "T'. En caso contrario devuelve "nil".

( SETQ x1 5 )
( SETQ y1 x1 )
( = x1 y1 )

Los valores de ambas variables son 5 y por tanto la función devuelve "T". Hay que
tener muy en cuenta que este comando sólo compara valores y no listas o
expresiones. Si, por ejemplo, se tienen dos variables, "ptl" y "pt2", con dos puntos en
2D que son listas de dos elementos, el resultado de (= ptl pt2) es "nil" porque esas
variables no contienen valores numéricos, sino listas.
Para comparar la igualdad de ambos puntos habría que recurrir a un comando de
operaciones lógicas como EQUAL (estudiado en el siguiente apartado).

No Igual: (/= <alomo> <átomo>…)

Compara los dos valores y devuelve "T" si electivamente son distintos. La función sólo
está definida para dos argumentos.
Manual Práctico de AutoCAD

(SETQ a b "Hola" )
( / = a b)
T

(/= 2 3)
(/= "texto" "textos")
(/= (* 2 2) (* 2 4) (* 2 3)

Devuelve nil si todos los valores son iguales, por ejemplo:

(/= "casa" "casa" "casa")

(/= "1 2 3" "1 2 3" "1 2 3" "1 2 3" "1 2 3")

(/= 32 32 32 32)

(/= (* 10 10) (* 25 4))


Si únicamente se indica un valor, AutoLISP devuelve T.

Menor: (< <átomo> <átomo> ..)

Devuelve "T" si el valor del primer <átomo> es menor que el segundo. La


comparación se efectúa según el valor de los códigos ASCII. Por tanto, para valores
textuales seria en orden alfabético, siendo el espacio en blanco el carácter de menor
valor y las mayúsculas de menos valor que las minúsculas.

Si se indican más de dos <átomo>, el resultado será “T” si cada uno de ellos es menor
que el siguiente; es decir, se encuentran ordenados por valores crecientes de código
ASCII.

Command: ( SETQ v1 1Ø v2 3Ø v3 “A” v4 “A” v5 “f” )

Dadas esas variables con esos valores asignados, los resultados de emplear el
comando "Menor" con varias combinaciones serían los siguientes:
( < v1 v2 v3 v4 v5 ) nil
( < v1 v2 v3 v5 ) T
Autolisp

( < v3 v5 ) T
( < v4 v5 v1 ) nil

Menor o Igual: ( <= <átomo> <átomo> ...) Similar al comando anterior,


funciona de la misma manera pero comparando la condición menor o igual.

Command: ( SETQ v1 3Ø v2 1Ø v3 3Ø v4 "A" v5 "a" v6 "A")

Algunas de las combinaciones posibles darían los siguientes resultados:


( <= v1 v3 v4 v6) T
( <= v2 v1 v4 v5) T
( <= v1 v3) T
( <= v5 v4 v6) nil
Mayor: (> <átomo> <átomo> ...) Compara todos los <átomo>
especificados y devuelve "T" sólo si cada valor es mayor que el siguíente; es
decir, se encuentran ordenados de mayor a menor:

Command: ( SETQ v1 2Ø v2 2Ø v3 "C" v4 "f" v5 "C")

Estos serían algunos de los resultados de la evaluación del comando con esas
variables:
(> v1 v2 v3 v5 v4) nil
(> v1 v3 v4) nil
(> v4 v5 v3 v2 v1) nil
(> v4 v3 v2) T

Mayor o Igual : (> = <átomo> <átomo> …)

Similar al anterior, establece la comparación "Mayor o Igual". Devuelve "T" sólo si cada
<átomo> es mayor o igual que el siguiente.

Command: ( SETQ v1 2Ø v2 2Ø v3 "C" v4 "f" v5 "C" )

Estas variables ofrecerían los siguientes resultados:


(>= v5 v4 v3 v1) nil
(>= v4 v5 v3 v2 v1) T
(>= v4 v5 v2 v3 v1) nil
(>= v1 v2) T

6.6 OPERADORES LÓGICOS


Existen fundamentalmente cuatro comandos que actúan como operadores lógicos:
AND, OR, EQUAL y NOT. Estos comandos devuelven únicamente los resultados "T"
(cierto) o "nil" (Falso).

(AND <expr> ...)

"Y" lógico Este comando realiza el "y" lógico de una serie de expresiones que son las
indicadas en <expr). Evalúa todas las expresiones y devuelve "T" si ninguna de ellas
es "nil". En el momento en que encuentra alguna expresión con resultado "nil",
abandona la evaluación de las demás y el comando devuelve “nil”.
Manual Práctico de AutoCAD

Su función es detectar si exite algún "nil" en las expresiones indicadas.


( SETQ v1 1Ø v2 1Ø )
(AND (<= v1 v2) (>= v1 v2 ) )
(AND ( = v1 v2) (> v1 v2 ) )

Se observa que con el comando AND se puede evaluar cualquier tipo de expresión, por
compleja que sea, y cuantas expresiones haga falla.

(OR <expr> ...)

Realiza el “o" lógico de la serie de expresiones indicadas. Evalúa todas las expresiones
y devuelve “nil” si todas ellas son “nil”. En el momento en que encuentra un resultado
diferente de “nil”, abandona la evaluación y devuelve "T".

Se utiliza para detectar si existe alguna expresión diferente de "nil" en las indicadas.

( SETQ v1 2Ø v2 2Ø)(OR (< vi v2) (> v1 v2 ) )

(EQUAL <expr1> <expr2> | <margen>|)

Identidad lógica. Comprueba si las dos expresiones indicadas son idénticas, es decir, si
el resultado de ambas evaluaciones es el mismo. En ese caso devuelve "T", o "nil" si
no es el mismo.

A diferencia de "=", se puede utilizar para comparar cualquier expresión. Una


aplicación muy sencilla es comparar si dos puntos son iguales:

( SETQ pt1 ' ( 5Ø 25 Ø ) pt2 ' ( 5Ø 25 Ø) pt3 ' ( 3Ø 2Ø 1Ø ) )


Autolisp

El argumento <margen> optativo se utiliza cuando se comparan expresiones cuyos


resultados son números reales y puede haber una pequeña diferencia de un decimal.
Se suministra un valor del margen respecto al cual se consideran iguales los
resultados.

( SETQ n1 2 . 5346 n2 2.5347 )

Usando el signo “=” tendremos:


(= 5 5) devuelve T
(= 65 65.0) devuelve T
(= 7 54) devuelve nil
(= 87.6 87.6 87.6) devuelve T
(= 34 34 –34 34) devuelve nil

Veamos ahora algún ejemplo con cadenas:


(= "hola" "hola") devuelve T

(= "casa" "casa2") devuelve nil

(= "H" "H" "H" "H") devuelve T

(= "hola ahora" "hola ahora") devuelve T

NOTA: Nótese, como adelanto, que las cadenas literales han de ir encerradas entre
comillas, como en casi todos los lenguajes de programación.
Con variables declaradas, que ya veremos, sería de la misma forma. Si sólo se indica
un valor en la lista, AutoLISP devuelve T.
Manual Práctico de AutoCAD

NOTA: Hay que tener en cuenta que esta función sólo compara valores y no listas o
expresiones. Si, por ejemplo, se tienen dos variables pt1 y pt2 con dos puntos que son
listas de tres elementos (una coordenada X, una coordenada Y y una coordenada Z),
para comparar la igualdad de ambos habría que recurrir a una función lógica como
EQUAL.

(NOT <expr>)

"NO" lógico Admite una única <expr> como argumento. Devuelve el "no" lógico de
esa expresión. Es decir, si el resultado de esa explosión es diferente de "nil", devuelve
"nil", y si el resultado es "nil", devuelve "T".

( SETQ v1 2Ø v2 3Ø )

Estos operadores pueden utilizarse combinados entre si. Por ejemplo:


( AND ( OR ( NOT ( < v1 v2 ) ) ( = v2 v3 ) ) ( > v1 v3) )
En este ejemplo podría sustituirse el operador NOT haciendo uso de su equivalencia:
( NOT ( < v1 v2 ) ) equivale a ( >= v1 v2 )

6.7 IDENTIDAD DE EXPRESIONES

(EQ <EXPR1> <EXPR2>)

Este comando compara las dos expresiones indicadas y devuelve T (cierto) si ambas
son idénticas, o nil (falso) en caso contrario. Se utiliza sobre todo para comparar listas
y ver si hay igualdad estructural.
( SETQ list1 ' (x yz ) )
( SETQ list2 ' (x y z ) )
( SETQ list3 list2 )
( EQ list1 list2 ) devuelve T
( EQ listi list3 ) devuelve nil

Se observa que list1 y list2 son exactamente la misma lista por definición. Pero list3 es
por definición igual a list2, pero no a list1. Por eso EQ devuelve nil.
La diferencia con EQUAL es que este compara los resultados de evaluar las
expresiones mientras que EQ compara la identidad estructural de las

Você também pode gostar