quinta-feira, 27 de agosto de 2009

Linguagem Scheme

É uma linguagem interpretada,utiliza notação pré-fixada e sua sintaxe na forma homogênea de lista:
(g x y), onde g é a função que será aplicada aos parâmetros x e y.
É possível a utilização de parênteses para a construção de expressões aninhadas:
(f (g x)) equivale a f(g(x)) na matemática!

Operadores Aritméticos:
+, -, *, /
(+ 2 3) resulta em 5
(* 2 3 4) resulta em 24

As operações + e * somam e multiplicam tudo que está dentro dos parênteses (+ 2 3 4) retorna 9
As operações - e / subtraem e dividem os demais parâmetros do primeiro:
(- 15 7 2) retorna 6
A operação +, sozinha, retorna 0
A operação *, sozinha, retorna 1
- e / não podem ser utilizados sozinhos!


Alguns exemplos de expressões:

(+ (* 2 4) 3) equivale 2 x 4 + 3
(* (+ 2 4) 3) equivale (2+4) x 3
(+ (+ 1 2) 3) equivale 1 + 2 + 3

(+ (/ 27 3) (* 3 2)) equivale
27 / 3 + 3 x 2

(/ (* (+ 8 a ) (- b 4)) 2) equivale
 ((8 + a) x (b - 4))/2


Avaliação de expressões :
Cada forma possível em scheme possui um valor associado.
reescrita: a cada passo da avaliação, uma parte da expressão é substituida por seu valor.
(+ (* 8 -5) 7.3 (* 2 7.3) executa mult.
(+ -40 7.3 (* 2 7.3)) executa multipl.
(+ -40 7.3 14.6) executa soma = -18.1
A ordem não é pré-definida.Um numeral resulta no próprio número!

Primitiva QUOTE:
Utilizada para que dados literais não tenham que ser avaliados:
(QUOTE A) retorna A
(QUOTE (A B C)) retorna (A B C)
É o mesmo que
´A retorna A
‘(A B C) retorna (A B C)

Seletores de Listas: car e cdr
car -> retorna o 1o. Elemento da lista
cdr -> retorna os demais elementos da l

Exemplos de CAR:
(car ‘(A B C)) retorna A
(car ‘((A B) C D)) retorna (A B)

Exemplos de CDR:
(cdr ‘(A B C)) retorna (B C)
(cdr ‘((A B) C D)) retorna (C D)
(cdr ‘(A)) retorna ()

Devem ser listas não nulas!
____________________________

CONS -> construtor de lista
constrói uma lista a partir de seus 2 argumentos:
1o. Átomo ou lista
2o. Normalmente lista
Insere o 1o. Argumento como o 1o. Elemento da lista do 2o. Parâmetro:
(cons ‘A ‘()) retorna (A)
(cons ‘A ‘(B C)) retorna (A B C)

  • O CAR e o CDR desmontam a lista
  • O CONS, monta novamente
  • (cons (CAR lis) (CDR lis)) função identidade!

LIST
:
Função que constrói uma lista de um número variável de parâmetros.
(LIST ‘Maçã ‘Laranja ‘Uva)
Equivale a:
(CONS 'Maçã(CONS 'laranja(CONS 'UVA'() ) ) )

Funções Predicado:
Retornam verdadero #V ou falso #F:
EQ?, NULL? E LIST?
(EQ? X Y):
Retorna #T se X e Y são átomos e iguais. Para X e Y simbólicos.
Retorna #F, caso contrário
(EQ? ‘A ‘A) retorna #T
(EQ? ‘A ‘B) retorna #F


(LIST? X):
Retorna #T se X for uma lista
Retorna #F, caso contrário
(LIST? ‘(x y)) retorna #T
(LIST? ‘x) retorna #F

(NULL? X)
Retorna #T se X for uma lista vazia
Retorna #F, caso contrário
(NULL? ‘(A B)) retorna #F
(NULL? ‘()) retorna #T


Funções de Predicados - dados numéricos:
Retornam #T ou #F
=(igual), <>(diferente), >(maior), <(menor), >= (maior ou igual), <= (menor ou igual), even? (é par?), odd? (é impar?)

OBS.: = para dados numéricos e EQ? Para dados simbólicos!
EQV?: funciona tanto para dados numéricos como para dados simbólicos (mais lenta).

Funções de Saída Simples:

(display expressão)
(new line)
Os parâmetros de scheme são sempre passados por valor!
Exibe também a saída automática do interpretador, exibindo o resultado das avaliações.

Funções para Construir Funções
Função Lambda na forma de lista:

(Lambda (L) (CAR (CDR L)))
Retorna o segundo elemento
(Lambda (L) (CAR (CDR L))) ‘(A B C)
Retorna B

Função Define:
Vincular um nome a um valor
Vincular um nome a uma expressão Lambda
(define símbolo expressão)

 Exemplos:
(define pi 3.14159)
(define dois_pi (* 2 pi))

Vincular uma expressão Lambda a um nome:
Omite-se a palavra Lambda
2 Listas como parâmetro
(define (nome_da_função parâmetros)
corpo
)

Exemplo:
(DEFINE (quadrado number)
(* number number)
)
Aplicação: (quadrado 5)
Exibe 25.

(DEFINE (segunda A)
(CAR (CDR A)))
(segunda ‘(A B C)) retorna B

Exemplo:
Cálculo do fatorial de um número n

(DEFINE (fatorial n)
    (COND
      ( (= n 0) 1)
       (ELSE (* n (fatorial (- n 1)))
    )
)            ;fim do define

Nenhum comentário: