olá pessoal, neste post irei falar um pouco sobre operadores lógicos e operadores de comparação, é um assunto bem simples, mas muito importante.
Operadores de comparação
Assim como em outras linguagens, o AutoLISP permite fazer comparações entre duas entidades, como por exemplo verificar se o conteúdo de duas variáveis são iguais. Toda expressão em lisp retorna um valor, no caso da comparação, existe dois resultados diferentes possíveis: T (verdadeiro) ou nil (falso). Uma expressão de comparação em AutoLisp é sempre composta do comparador, seguidos de dois argumentos. Estes argumentos devem ser átomos, sendo que alguns comparadores podem comparar também listas.
OBS: quando se compara duas strings, ele leva em consideração a ordem
lexicográfica, que é análoga à ordem das palavras em um dicionário. Esta ordem
lexicográfica se baseia na ordenação dos caracteres estabelecida na tabela ISO8859-1 (http://pt.wikipedia.org/wiki/ISO_8859-1).
Assim, quando se compara duas strings s e t, procura-se a primeira posição, digamos k, em que as duas strings diferem. Se s[k] vem antes de t[k] na tabela ISO então s é lexicograficamente menor que t.
Abaixo será listado os comparadores mais importantes em AutoLisp, seguidos de sua descrição e exemplos:
- = (IGUAL)
- Descrição: compara se dois átomos (ou expressões que retornam átomos) são iguais.
- Exemplos:
- (= 10 10) , retorna T;
- (= 1 2) , retorna nil;
- (setq a 11) (setq b 11) (= a b) , retorna T;
- (= "autolisp" "autolisp") , retorna T;
- (= "brasil" "autolisp") , retorna nil;
- (= "autoCAD" "autocad") , retorna nil;
- (= 10 (- 20 10)) , retorna T;
- BUG?
- As duas expressões abaixo, deveriam retornar ambas T, porém isto não ocorre:
- (= 6.0 (- 8.1 2.1)) , retorna T;
- (= 6.0 (- 8.2 2.2)) , retorna nil;
- Não encontrei uma explicação oficial sobre este bug, mas é bem provável que esteja ocorrendo um erro de arredondamento, pois no teste abaixo verificamos que existe uma influência do número de casas:
- (= 5.999999999999999 (- 8.2 2.2)) , retorna T;
- /= (DIFERENTE)
- Descrição: compara se dois átomos (ou expressões que retornam átomos) são diferentes.
- Exemplos:
- (/= 10 10) , retorna nil;
- (/= 1 2) , retorna T;
- (setq a 11) (setq b 11) (/= a b) , retorna nil;
- (/= "autolisp" "autolisp") , retorna nil;
- (/= "brasil" "autolisp") , retorna T;
- (/= "autoCAD" "autocad") , retorna T;
- (/= 10 (- 20 10)) , retorna nil;
- > (MAIOR)
- Descrição: compara se o primeiro argumento é maior do que o segundo.
- Exemplos:
- (> 10 10) , retorna nil;
- (> 1 2) , retorna nil;
- (> 5 1) , retorna T;
- (setq a 55) (setq b 54) (> a b) , retorna T;
- (> "autolisp" "autolisp") , retorna nil;
- (> "brasil" "autolisp") , retorna T;
- (> "autolisp" "brasil") , retorna nil;
- (> "autoCAD" "autocad") , retorna nil;
- (> (+ 1 2) (- 1 2)) , retorna T;
- (> (/ 10 2) 5) , retorna nil;
- < (MENOR)
- Descrição: compara se o primeiro argumento é menor do que o segundo.
- Exemplos:
- (< 10 10) , retorna nil;
- (< 1 2) , retorna T;
- (< 5 1) , retorna nil;
- (setq a 55) (setq b 54) (< a b) , retorna nil;
- (< "autolisp" "autolisp") , retorna nil;
- (< "brasil" "autolisp") , retorna nil;
- (< "autolisp" "brasil") , retorna T;
- (< "autoCAD" "autocad") , retorna T;
- (< (+ 1 2) (- 1 2)) , retorna nil;
- (< (/ 10 2) 5) , retorna nil;
- >= (MAIOR OU IGUAL)
- Descrição: compara se o primeiro argumento é maior ou igual ao segundo.
- Exemplos:
- (>= 10 10) , retorna T;
- (>= 1 2) , retorna nil;
- (>= 5 1) , retorna T;
- (setq a 55) (setq b 54) (>= a b) , retorna T;
- (>= "autolisp" "autolisp") , retorna T;
- (>= "brasil" "autolisp") , retorna T;
- (>= "autolisp" "brasil") , retorna nil;
- (>= "autoCAD" "autocad") , retorna nil;
- (>= (/ 10 2) 5) , retorna T;
- <= (MENOR OU IGUAL)
- Descrição: compara se o primeiro argumento é menor ou igual ao segundo.
- Exemplos:
- (<= 10 10) , retorna T;
- (<= 1 2) , retorna T;
- (<= 5 1) , retorna nil;
- (setq a 55) (setq b 54) (<= a b) , retorna nil;
- (<= "autolisp" "autolisp") , retorna nil;
- (<= "brasil" "autolisp") , retorna nil;
- (<= "autolisp" "brasil") , retorna T;
- (<= "autoCAD" "autocad") , retorna T;
- (<= (/ 10 2) 5) , retorna T;
- eq (IDÊNTICO)
- Descrição: compara se os argumentos são derivados um do outro (não compara listas).
- OBS1: na grande maioria dos casos, o resultado será idêntico ao "=" (IGUAL), como é mostrado nos exemplos abaixo, que são os mesmos utiizados nos exemplos do "=", e que retornaram o mesmo resultado.
- Exemplos:
- (eq 10 10) , retorna T;
- (eq 1 2) , retorna nil;
- (setq a 11) (setq b 11) (eq a b) , retorna T;
- (eq "autolisp" "autolisp") , retorna T;
- (eq "brasil" "autolisp") , retorna nil;
- (eq "autoCAD" "autocad") , retorna nil;
- (eq 10 (- 20 10)) , retorna T;
- OBS2: pesquisando na internet, por casos onde o "=" e o "eq" retornam valores diferentes, consegui achar uma situação em que eles se diferem. Quando se salva o nome de uma entidade desenhada, em duas variáveis diferentes, a comparação com o "=" retorna nil, e com "eq" retorna T. Como o código para este exemplo contém assuntos que ainda não expliquei, coloquei o código para este exemplo, ao final deste post, na seção extras.
- equal (EQUIVALENTE)
- Descrição: compara se os argumentos são equivalente (pode comparar listas)
- Exemplos:
- (equal 10 10) , retorna T;
- (equal 1 2) , retorna nil;
- (equal 5 1) , retorna nil;
- (setq a 55) (setq b 54) (equal a b) , retorna nil;
- (equal "autolisp" "autolisp") , retorna T;
- (equal "brasil" "autolisp") , retorna nil;
- (equal "autolisp" "brasil") , retorna nil;
- (equal "autoCAD" "autocad") , retorna nil;
- (equal (list 1 2 3) (list 1 2 3)) , retorna T;
- (equal (list 1 2) (list 2 1)) , retorna nil;
Operadores lógicos
Com os operadores lógicos, podemos montar expressões booleanas, que ao serem avaliadas, retornam T (verdadeiro) ou nil (falso). Assim, com ajuda dos operadores de comparação, podemos montar expressões mais complexas. Os operadores lógicos disponíveis em AutoLISP são três: AND, OR e NOT.
OBS: toda lista e todo átomo é considerado como T (verdadeiro), sendo que o único valor que é considerado nil (falso) é o próprio átomo nil.
- AND (e)
- Descrição: Operador lógico onde a resposta da operação é verdade (T) se ambas as variáveis de entrada forem verdade.
- Exemplos:
- (and 10 10) , retorna T;
- (and 1 2) , retorna T;
- (setq a 55) (setq b 54) (and a b) , retorna T;
- (and "brasil" "autolisp") , retorna T;
- (and (list 1 2) (list 2 1)) , retorna T;
- (and (= (list 1 2) (list 1 2)) (equal (list 1 2) (list 1 2))) , retorna nil;
- (and (> 2 0) (< -2 0)) , retorna T;
- (and (= 1 1) (> 1 1)) , retorna nil;
- (and (< 10 5) (> 10 20)) , retorna nil;
- (and T nil) , retorna nil;
- (and T) , retorna T;
- OR (ou)
- Descrição: Operador lógico onde a resposta da operação é verdade (T) se e somente se pelo menos uma das variáveis de entrada for verdade.
- Exemplos:
- (or 10 10) , retorna T;
- (or 1 2) , retorna T;
- (setq a 55) (setq b 54) (or a b) , retorna T;
- (or "brasil" "autolisp") , retorna T;
- (or (list 1 2) (list 2 1)) , retorna T;
- (or (= (list 1 2) (list 1 2)) (equal (list 1 2) (list 1 2))) , retorna T;
- (or (> 2 0) (< -2 0)) , retorna T;
- (or (= 1 1) (> 1 1)) , retorna T;
- (or (< 10 5) (> 10 20)) , retorna nil;
- (or T nil) , retorna T;
- (or T) , retorna T;
- NOT (negação)
- Descrição: Operador lógico que representa a negação (inverso) da variável atual. Se ela for verdade, torna-se falsa, e vice-versa.
- OBS: deve avaliar um argumento, que pode ser uma expressão.
- Exemplos:
- (not 10) , retorna nil;
- (setq a 55) (setq b 54) (not (or a b)) , retorna nil;
- (not "autolisp") , retorna nil;
- (not (list 1 2)) , retorna nil;
- (not (= (list 1 2) (list 1 2))) , retorna T;
- (not (equal (list 1 2) (list 1 2))) , retorna nil;
- (not (> 2 0)) , retorna nil;
- (not (> 1 1)) , retorna T;
- (not T) , retorna nil;
- (not nil) , retorna T;
No próximo post, eu irei falar sobre as funções condicionais. Até lá, pessoal!
REFERÊNCIAS
- Cadeias de caracteres (strings): http://www.ime.usp.br/~pf/algoritmos/aulas/strings.html- Operadores lógicos: http://pt.wikipedia.org/wiki/Operadores_l%C3%B3gicos
- AutoLISP III- Funções de repetição e condicionais, Obter e converter informação, João Tavares e Joaquim Fonseca - DEMec, FEUP
- Fórum com discurssão sobre "=, eq, equal": http://forums.augi.com/showthread.php?6240-eq-equalEXTRAS
- Exemplo que mostra um caso, onde as funções "=" e "eq" retornam valores diferentes:1) desenhe uma entidade simples qualquer, como por exemplo uma linha.
2) Salvando o nome da entidade desenhada na variável entA (selecione a linha após o comando): (setq entA (car (entsel)))
3) Salvando o nome da mesma entidade desenhada na variável entB (selecione a linha após o comando): (setq entB (car (entsel)))
4) Comparação usando "=": (= entA entB) , retorna nil ;
5) Comparação usando "eq": (eq entA entB) , retorna T;
Nenhum comentário:
Postar um comentário