E N D
Um pouco de História Scheme foi criada em 1975 no laboratório de AI do MIT por Guy L. Steele e Gerald J. Sussman que queriam criar uma linguagem de semântica simples e clara. Scheme foi influenciada pelo cálculo lambda, que é uma das primeiras linguagens de programação funcional no mundo, também teve seu escopo estático herdade de Algol e a sintaxe de Lisp. É uma linguagem muito bem desenhada e de propósito geral.
Características A flexibilidade de Scheme é gatantida devido a ausência de restrições, assim o porder da linguagem não limitando . Utilização de sistema de recursão denominado “Tail Recursion” (recursão de cauda).
Características Homogeneidade com sua notação pré-fixada, ou seja, existe basicamente uma regra que rege a escrita de qualquer expressão: (+ 2 3) (squart 5) (f x y)
Características A passagem de parâmetros é feita por valor. Utilização de Listas como mecanismo básico de estruturação de dados. Suporta multiplos-paradigmas como, programação funcional, imperativa , orientação a objetos, etc.
Tipos de Dados Boolean: #t = True (Qualquercoisadiferente de zero e “Listavazia”). #f = False (Zero ou “Listavazia”).
Tipos de Dados Numbers: Number = (42). Complex = (2+3i). Real = (3.1416), (22/7), (42)
Tipos de Dados Numbers: Rational = (3.1416), (22/7) Integer = (42). Number = Complex = Real = Rational = Integer.
Tipos de Dados Characteres: São representadospelaprefixo #\ #\c = caracter (c). #\newline = (nova linha). #\space = (espaçoembranco).
Tipos de Dados Symbols: Apesar de ser tipo simples, ouseja, primitivocomoosanteriores, sãotratadoscomoidentificadores de variáveis, portantoseu valor é o valor contidonamesma. Para especificarmos um símbolousamos a palavrareservadaquoteouaspa simple antes do símbolo.
Tipos de Dados Symbols: (quotexyz) =>xyz ‘E => E
Tipos de Dados String: Não é um tipo simples, ouseja, primitivocomoosanteriores, é compostapelacombinação de caracteres, sendoassimumaseqüência de caracteres de modoestruturado e entre aspasduplas “”.
Tipos de Dados String: (string #\h #\e #\l #\l #\o) ) => "hello" "Hello, World!" => "Hello, World!"
Tipos de Dados Vectors: São seqüênciascomo as Strings mas, seuselementospodem ser umaseqüência de qualquertipo e nãoapenas de caracteres. (vector 0 1 2 3 4) => #(0 1 2 3 4)
Tipos de Dados Dotted pair: É composto de doisvaloresarbitrarios, sendo o primeirochamado de car e o segundo de cdr e suacombinação é realizada com a palavrareservadacons.
Tipos de Dados Dotted pair: (cons 1 #t) => (1 . #t)
Tipos de Dados List: Listaspodem ser construídassimplesmentecolocandoosvaloresdesejados entre parênteses e utilizandoaspa simple antes do primeiroparênteseouutilizando a palavrareservadalist. Listaspodemconterqualquer valor inclusive lista de lista.
Tipos de Dados List: > ‘(2 4 6 8 10) => (2 4 6 8 10) > (list 2 4 6 8 10) => (2 4 6 8 10)
Tipos de Dados List: Assimcomoemvetores, podemosutilizarcar e cdrparaacessarmos o 1º elemento e o restantedalistarespectivamente. > (car (list 2 4 6 8 10)) => 2
Tipos de Dados List: > (cdr (list 2 4 6 8 10)) => (4 6 8 10) > (car (cdr (list 2 4 6 8 10))) => 4
Tipos de Dados List: Podemosutilizarváriascombinações de car e cdr. > (cadr (list 2 4 6 8 10)) => 4 > (cddr (list 2 4 6 8 10)) => (6 8 10)
Tipos de Dados List: (caarls) ; is the same as (car (car ls)) (cadrls) ; is the same as (car (cdrls)) (cdarls) ; is the same as (cdr (car ls)) (cddrls) ; is the same as (cdr (cdrls)) (caaarls) ; is the same as (car (car (car ls))) (caadrls) ; is the same as (car (car (cdrls))) (cadarls) ; is the same as (car (cdr (car ls))) (caddrls) ; is the same as (car (cdr (cdrls))) (cdaarls) ; is the same as (cdr (car (car ls))) (cdadrls) ; is the same as (cdr (car (cdrls))) (cddarls) ; is the same as (cdr (cdr (car ls))) (cdddrls) ; is the same as (cdr (cdr (cdrls)))
Tipos de Dados List: (cadaarls) ; is the same as (car (cdr (car (car ls)))) (cadadrls) ; is the same as (car (cdr (car (cdrls)))) (caddarls) ; is the same as (car (cdr (cdr (car ls)))) (cadddrls) ; is the same as (car (cdr (cdr (cdrls)))) (cdaaarls) ; is the same as (cdr (car (car (car ls)))) (cdaadrls) ; is the same as (cdr (car (car (cdrls)))) (cdadarls) ; is the same as (cdr (car (cdr (car ls)))) (cddadrls) ; is the same as (cdr (cdr (car (cdrls)))) (cdddarls) ; is the same as (cdr (cdr (cdr (car ls)))) (cddddrls) ; is the same as (cdr (cdr (cdr (cdrls))))
Expressões Condicionais Existemtrêstipos de expressõescondicionais: Usando a palavrareservadaIf. Usando a palavrareservadaCond. Usando a palavrareservadaCase.
Expressões Condicionais ExpressãocondicionailIf : (if condição conseqüência alternativa) (if condição conseqüência)
Expressões Condicionais ExpressãocondicionailIf : (if (< a b) (square a) (square b)) (if (< x1 x2) (> x2 x3) (if (> x1 x2) (< x2 x3) #f))
Expressões Condicionais ExpressãocondicionailCond: (cond (condição1 conseqüência1) (condição2 conseqüência2) . . . (else alternativa))
Expressões Condicionais ExpressãocondicionailCond: (cond ((> a b) (square a)) ((> b c) (square b)) . . . (else (square c)))
Expressões Condicionais ExpressãocondicionailCase : (case arg expr1 expr2 expr3 ...)
Expressões Condicionais ExpressãocondicionailCase : (case (+ 3 4) ((7) 'seven) ((2) 'two) (else 'nothing)) => seven
Expressões Condicionais ExpressãocondicionailCase : (case 'a ((a b c d) 'first) ((e f g h) 'second) (else 'rest)) => first
Operadores Lógicos Existemtrêstipos de expressõeslógicas: Usando a palavrareservadaAnd. Usando a palavrareservadaOr. Usando a palavrareservadaNot.
Operadores Lógicos Expressõeslógica com And: (and expr1 expr2 ... exprn)
Operadores Lógicos Expressõeslógica com And: (and (< 2 5) (< 2 4)) =>#t
Operadores Lógicos Expressõeslógica com Or: (or expr1 expr2 ... exprn)
Operadores Lógicos Expressõeslógica com Or: (or (< 2 5) (< 2 4)) =>#t
Operadores Lógicos Expressõeslógica com Not: (not expr)
Operadores Lógicos Expressõeslógica com Not: (not (< 5 10)) => #f
Declarações Utilizamos a palavrareservadadefineparadeclararvariáveisglobais: (define a 10) a =>10
Declarações Utilizamos a palavrareservadaset! Para alterarvariáveis: (define a 10) a =>10 (set! a 5) a => 5
Declarações Podemosdeclarar procedures utilizando a palavrareservadadefineoulambda. Nãoexistediferença entre as declarações. (define square (lambda (x) (* x x)))
Declarações Utilizando a palavrareservadadefine: (define (square x) (* x x)) (square 2) => 4
Declarações Utilizando a palavrareservadalambda: (lambda formal-parâmetrosbody) (lambda (x) (* 2x) 5) => 10
Declarações Utilizamos a palavrareservadalet e let* paracriarvariáveislocais. A diferença entre as duasdeclarações é que let* é um aninhamento de lets, ouseja, umavariáveldeclaradaem um let mais a esquerdapode ser usadaem um let mais a direita. (let ((var1 exp1) (var2 exp2) . . . (varn expn)) body)
Declarações Utilizando a palavrareservadalet. (let ((x 2) (y 10)) (+ x y)) => 12 (let ((x 2) (y 10)) (/ y x)) => 5
Declarações Utilizando a palavrareservadalet. (define x 10) (+ (let ((x 5)) (* x (+ x 2))) x) => 45 (define x 10) (let ((x 5) (y (* x 2))) (+ x y)) => 25
Declarações Utilizando a palavrareservadalet*. (let* ((var1 exp1) (var2 exp2) . . . (varn expn)) body)
Declarações O que é equivalente a: (let ((var1 expr1)) (let ((var2 expr2)) (let ... (let ((varnexprn)) body) ... )))
Declarações Utilizando a palavrareservadalet*. (define x 10) (let* ((x 5) (y (* x 2))) (+ x y)) => 15
Declarações Comparandolet com let*. (define x 10) (let ((x 5) (y (* x 2))) (+ x y)) => 25 (define x 10) (let* ((x 5) (y (* x 2))) (+ x y)) => 15