Curso Livre de Algoritmos e Programação/Guile: Operadores Lógicos, Relacionais e Aritméticos
Guile: Operadores Lógicos, Relacionais e Aritméticos
· Operadores lógicos
Os operadores lógicos para guile lembram os operados da python também, pois também são os 3, “and”, “or” e “not”. Quando a expressão é verdadeira é #t, já quando ela é falsa é #f quando é diferente de verdadeira.
· Operadores relacionais
Os operadores relacionais também são parecidas com os operadores em python, estes são “==”, “<”, “>”, <=, >=, podem ser utilizadas da seguinte forma (> 5 3) ; => #t.
Em guile também existe o “eqv?” que observa se os caracteres são equivalentes.
· Operadores aritméticos
Os operadores aritméticos em guile são “+” que é o operador de soma, “-“ de subtração, “*” de multiplicação, “/” de divisão, “expt” que é o operador de exponencial, “quotient” que pega a parte inteira de divisão e “remainder” que pega o resto da divisão
Operadores Lógicos, Relacionais e Aritméticos[editar | editar código-fonte]
Lógicos[editar | editar código-fonte]
#t ; para verdadeiro
#f ; para falso -- diferente de #f é verdadeiro
(not #t) ; => #f
(and 0 #f) ; => #f
(or #f 0) ; => 0
Relacionais[editar | editar código-fonte]
Números[editar | editar código-fonte]
(> 2 2) ; ==, <, >, <==, >=
(= 3 3.0) ; => #t
(eqv? 3 3) ; => #t
Caracteres[editar | editar código-fonte]
(char=? #\c #\c) ; => #t
(eqv? #\c #\c) ; => #t
Objetos[editar | editar código-fonte]
(eq? (list 3) (list 3)) ; => #f (ponteiros diferentes)
(eq? 'a 'a) ; => #t (símbolos comparados aos ponteiros)
(eqv? 'a 'a) ; => #t
(equal? (list 'a 'b) (list 'a 'b)) ; => #t
(equal? (list 'a 'b) (list 'b 'a)) ; => #f
Aritméticos[editar | editar código-fonte]
(+ 1 1) ; => 2
(- 8 1) ; => 7
(* 10 2) ; => 20
(expt 2 3) ; => 8
(quotient 5 2) ; => 2
(remainder 5 2) ; => 1
(/ 35 5) ; => 7
Estruturas de Seleção e Estruturas de Repetição[editar | editar código-fonte]
Seleção[editar | editar código-fonte]
(if #t ; teste
"aqui é verdadeiro" ; então
"aqui é falso") ; senão
; => "aqui é verdadeiro"
(cond ((> 2 2) (error "errado!"))
((< 2 2) (error "errado de novo!"))
(else 'ok)) ; => 'ok
Repetição[editar | editar código-fonte]
Recursão[editar | editar código-fonte]
(define (fact n)
(if (= n 1)
1
(* n (fact (- n 1)))))
Cauda Recursiva[editar | editar código-fonte]
(define (lp i)
(when (< i 10)
(format #t "i=~a\n" i)
(lp (1+ i))))
(lp 5) ; => i=5, i=6, ...
Chamado Let[editar | editar código-fonte]
(let lp ((i 0))
(when (< i 10)
(format #t "i=~a\n" i)
(lp (1+ i)))) ; => i=0, i=1, ...
Iteração[editar | editar código-fonte]
(for-each (lambda (i) (format #t "i=~a\n" i))
(iota 10)) ; => i=0, i=1, ...
Expressão do[editar | editar código-fonte]
(do vínculos (predicado valor)
corpo)
[vínculos] → ((p1 i1 u1) (p2 i2 u2) … )
variável p, inicialização i, atualização de ciclo u
(define (fact-do n)
(do ((n1 n (- n1 1)) (p n (* p (- n1 1)))) ((= n1 1) p)))
Vetores[editar | editar código-fonte]
'#(1 2 3) ; vetor de inteiros
'#(a 0 #\a); símbolo, inteiro, caractere
(define vec (vector 2 2 3 4))
(define wall (make-vector 100 'bottle-of-beer))
;; Use vector-set! para atualizar um slot
(vector-set! vec 0 1)
(vector-set! wall 99 'down)
vec ; => #(1 2 3 4)
Funções[editar | editar código-fonte]
Simples[editar | editar código-fonte]
; Olá mundo como uma variável
(define vhello "Olá mundo") ;1
; Olá mundo como uma função
(define fhello (lambda () ;2
"Olá mundo"))
Com parâmetros[editar | editar código-fonte]
; olá com nome
(define hello
(lambda (nome)
(string-append "Olá " nome "!")))
; soma de três números
(define sum3
(lambda (a b c)
(+ a b c)))
Forma curta[editar | editar código-fonte]
; olá com nome
(define (hello nome)
(string-append "Olá " nome "!"))
; soma de três números
(define (sum3 a b c)
(+ a b c))
Referencias
Scheme (introdução) - https://rodrigorgs.github.io/aulas/mata56/aula08-lisp