Trabalho Clp

11
Racket Alex ..., Jefferson Alves Costa, José Luiz... 1. (Introdução com histórico, criadores, motivações para a criação da linguagem, influências sobre o projeto da linguagem, campos onde a linguagem é utilizada.) Na metade do ano 1990, Matthias Fulleisen fundou PLT, um grupo de pesquisa, depois como um projeto dedicado a produção de materiais pedagógicos para iniciantes em programação. O grupo decidiu desenvolver um ambiente de programação pedagógica baseado em Scheme. A equipe incluiu Flatt, Robby Findler, Shriram Krishnamurthi, Cormac Flanagan, e muitos outros produziram o DrScheme, um ambiente de programação para programadores novatos em Scheme e um ambiente de pesquisa por soft typing. A linguagem principal de desenvolvimento que DrScheme suportava era PLT Scheme. Em paralelo, o time dava workshops para professores de ensino médio, os treinando em program design e programação funcional. Ao passar dos anos, DrSheme foi ganhando inovações. Em 2001: A equipe principal (Felleisen, Findler, Flatt, Krishnamurthi) escreveu e publicou seu primeiro livro, Como projetar programas (How to Design Programs), baseado em sua filosofia de ensino. 7 de Junho, 2010: PLT Scheme passou a ser chamada Racket. Racket, um de seus objetivos de projeto é servir como uma plataforma para criação de linguagem, design e implementação. É uma linguagem relativamente nova, que mostra sua origem em Scheme, um dos dois mais conhecidos dialetos de Lisp. É usado para própositos gerais de programação, educação de ciência da computação, pesquisa e scripting. Seu ambiente de desenvolvimento, DrRacket, é escrito em Racket e sua plataforma é de distribuição livre.

description

Breve descrição sobre a linguagem Racket

Transcript of Trabalho Clp

Page 1: Trabalho Clp

Racket

Alex ..., Jefferson Alves Costa, José Luiz...

1. (Introdução com histórico, criadores, motivações para a criação

da linguagem, influências sobre o projeto da linguagem, campos onde a linguagem é utilizada.)

Na metade do ano 1990, Matthias Fulleisen fundou PLT, um grupo de pesquisa, depois como um projeto dedicado a produção de materiais pedagógicos para iniciantes em programação. O grupo decidiu desenvolver um ambiente de programação pedagógica baseado em Scheme. A equipe incluiu Flatt, Robby Findler, Shriram Krishnamurthi, Cormac Flanagan, e muitos outros produziram o DrScheme, um ambiente de programação para programadores novatos em Scheme e um ambiente de pesquisa por soft typing. A linguagem principal de desenvolvimento que DrScheme suportava era PLT Scheme.

Em paralelo, o time dava workshops para professores de ensino médio, os treinando em program design e programação funcional. Ao passar dos anos, DrSheme foi ganhando inovações. Em 2001: A equipe principal (Felleisen, Findler, Flatt, Krishnamurthi) escreveu e publicou seu primeiro livro, Como projetar programas (How to Design Programs), baseado em sua filosofia de ensino. 7 de Junho, 2010: PLT Scheme passou a ser chamada Racket. Racket, um de seus objetivos de projeto é servir como uma plataforma para criação de linguagem, design e implementação. É uma linguagem relativamente nova, que mostra sua origem em Scheme, um dos dois mais conhecidos dialetos de Lisp. É usado para própositos gerais de programação, educação de ciência da computação, pesquisa e scripting. Seu ambiente de desenvolvimento, DrRacket, é escrito em Racket e sua plataforma é de distribuição livre.

Page 2: Trabalho Clp

2. (A linguagem em questão é compilada, interpretada ou híbrida? É

scripting ou não?) Racket, é uma linguagem alto­nível e tem um sistema híbrido, cada expressão ou definição é compilado em um formato bytecode interno usando um compilador JIT, e então roda na máquina virtual. No modo iterativo, a compilação ocorre em tempo de execução. 3. (Paradigma que a linguagem implementa (se lógico, funcional,

proceidural, etc.)) Racket é uma linguagem multiparadigma: Funcional: procura fazer as funções ser mais próximas possível das funções matemáticas e evita estados ou dados mutáveis. Procedural: é um paradigma que usa conceitos de chamada de procedimentos. Tem a vantagem de reutilizar o mesmo código em diversas partes do programa, facilidade de organizar o fluxo do programa, ser modular e estruturado. Modular: significa que o programa pode ser compilado separadamente em partes. É bom para programas grandes e complicados. Reflexivo: o programa tem a capacidade de analisar e modificar a estrutura e o comportamento de um objeto em tempo de execução. Orientação a objeto: representa conceitos que tem campos de dados e procedimentos associados chamados métodos. Pragramação meta: é a escrita de um programa que escreve ou manipula outros programas, ou ele mesmo, como seus dados ou fazem parte do trabalho em tempo de compilação que seria feita em tempo de execução. Lógica: baseada na lógica de primeira ordem. 4. (Tipos abstratos de dados, orientação a objeto) Tipos abstratos de dados Um tipo abstrato de dados (TAD) especifica um conjunto de dados e operações que são executadas sobre esses dados. O TAD tem o objetivo de simplificar o algoritmo através da abstrações das variáveis em uma entidade.

Page 3: Trabalho Clp

Uma estrutura tem a definição: (define­struct nomedaestrutura (valor1 valor2)) onde, make­nomedaestrutura é o construtor que cria a estrutura nomedaestrutura­valor1 e nomedaestrutura­valor2 são seletores que extraem valor1 e valo2, respectivamente. Ex: (define­struct structagenda (nome telefone)) (define agenda (make­structagenda 'eu '32940568)) > (structagenda­nome agenda) ‘eu > (structagenda­telefone agenda) 32940568 Orientação a objeto Para se trabalhar com orientação a objeto, o programador tem que declarar no DrRacket a biblioteca racket/class. Uma class (classe) contém uma coleção de métodos, campos que têm expressões de valores iniciais e valores que iniciam os argumentos. Nesse contexto, um objeto é uma coleção de vinculação por campos que são instanciados de acordo com a descrição da classe. 5. (Operadores.) Tipos primitivos de dados:

numeros integers (ex: 1, 4, ­3, 0) floats (ex: 0.0, 3.5, 1.23E+10) rationals (ex: 2/3, 5/2)

simbolos (ex: fred, x, a12, set!) boleano: Racket usa simbolos especias para representar verdadeiro “#t”

ou false “#f”. strings (ex: "hello word") caracteres (ex #\c)

Case is significant in Racket for symbols. (It isn't significant for symbols in the R5RS Scheme standard, which means it isn't significant for variable names.) Recommendation: write your programs so that they work correctly whether or not case is significant in symbols. Note that you can have non­alphanumeric characters such as + or ­ or ! in the middle of symbols. (You can't have

Page 4: Trabalho Clp

parentheses, though.) Aqui estão algumas das funções basicas que scheme proporciona para os tipos acima.

Funçoes Aritméticas (+, ­, *, /, abs, sqrt) Relacional (=, <, >, <=, >=) (for numbers) Relacional (eq?, eqv?, equal?) para dados arbitrários Logicos (and, or, not): and e or são funçoes de curto­circuito.

Some functions are predicates, that is, they are truth tests. In Racket, they return #f or #t.

number? integer? pair? symbol? boolean? string? eqv? equal? = < > <= >=

6. (Escopo) O escopo de uma vinculação é o conjunto de formas de origem a que se aplica. O ambiente de uma forma é o conjunto de ligações, cujo escopo inclui a forma. 7. (Expressões, estruturas de controle, desvio condicional.)

Um módulo do programa é escrito como #lang <langname> <topform> <topform> é uma <definição> ou uma <expr>. Por convenção, * em uma gramática significa zero ou mais repetições do elemento de procedimento, o + significa uma ou mais repetições do elemento de procedimento, e agrupa uma sequência como um elemento de repetição. Uma definição tem a forma ( define <id> <expr> ) , vincula <id> para o resultado de <expr>, enquanto ( define ( <id> <id>* ) <expr>+ ) vincula o primeiro <id> para a função(chamada também de procedimento) que pega como argumentos nomeados pelos restantes <id>s. No caso dessa função, as <expr>s são o corpo da função. Quando a função é chamada, retorna o resultado da última <expr>. Um comentário, se inicia com ; e vai até o fim da linha. Exemplos: (define x 3) ; define x para ser 3 (define (x str) ; define x como uma função de um argumento (substring str 0 x)

Page 5: Trabalho Clp

> x 3 > (x “meu carro”) “meu” #notação# A gramática para a utilização de uma forma sintática algo é apresentado assim: (Algo [Id + ...] an­expr ...) usando a sintaxe dos identificadores racketes mostra que as variaveis em italico Id e an­expr são meta­variaveis. A convenção de nomenclatura define implicitamente o significado de muitas meta­variáveis:

*A meta­variável que termina em id representa um identificador, como x ou my­favorite­martian.

*Um identificador de meta que termina em keyword representa uma palavra­chave, como #: tag.

*Um identificador de meta que termina com expr representa qualquer sub­formulário, e ele vai ser analisado como uma expressão.

*Um identificador de meta, que termina com o body significa qualquer sub­formulário, que será analisado tanto como uma definição

local ou uma expressão. Um body pode analisar como uma definição só se não for precedida de qualquer expressão, eo último body deve ser uma expressão. Colchetes na gramática indicam uma seqüência entre parênteses de formas, onde os colchetes por convenção são utilizados . Um ... indica zero ou mais repetições da forma anterior, e ... + indica uma ou mais repetições do que o ponto de referência anterior. Caso contrário, os identificadores não­itálico representam a si

mesmos Com base na gramática acima, então, aqui estão alguns usos conformidade.

Page 6: Trabalho Clp

(Algo [X]) (Algo [X] ( + 1 2)) (Algo [X my­favorite­martian x] ( + 1 2) # F)

Algumas especificações sintático­formulário referem­se a meta­variáveis que não são implicitamente definidos e não previamente definido. Meta­variáveis como são definidos após a forma principal, utilizando um formato BNF­como alternativas: (Algo­else [ thing + ...] an­expr ...)

thing = thing­id | thing­keyword

O exemplo acima diz que, dentro de uma forma something­else, uma thing é um identificador ou um keyword. * Expressões regulares * A regexp encapsula um valor padrão que é descrita por uma corda ou barbante byte . O combinador regexp tenta corresponder a esse padrão contra (a parte) outra string ou string byte, que vamos chamar de seqüência de texto, quando você chama funções como regexp­match . A seqüência de texto é tratado como texto puro, e não como um padrão. 1. A escrita de padrões Regexp

uma string ou um byte string pode ser usado diretamente como padrão regexp, ou pode ser prefixado com # Rx para formar um valor literal regexp . Por exemplo, # rx

"abc" é um valor de string baseado em regexp e # rx# "abc" é um valor

Page 7: Trabalho Clp

de string byte baseado em regexp. Alternativamente, uma string ou byte string pode ser prefixado com # Px

, Como em # px "abc", por uma sintaxe ligeiramente alargado de padrões dentro da string.

A maioria dos caracteres em uma regexp padrão são feitos para combinar ocorrências de

si na seqüência de texto . Assim, o padrão # rx "abc" corresponde a uma string que contém os

caracteres a , b , c em sucessão. Outros caracteres agem como metacaracteres e algumas sequências

de caracteres atua como metassequências. Ou seja, eles especificam algo literais diferente de si mesmos.

Por exemplo, no padrão # rx "a.c", os caracteres a e c se por si mesmos, mas o metacharacter . pode corresponder a qualquer caractere.

Portanto, o padrão # rx "a.c" corresponde a a , Qualquer caractere, e c em sucessão. Estruturas de controle If Tem a forma (if <expr1> <expr2> <expr3>) <expr1> = expressão do teste da condição <expr2> = então­expr <expr3> = senão­expr Exemplo: > (if (> 5 6) “maior” “menor”) “menor” > (if (= 5 6) "iguais" "diferentes") “diferentes And e or São avaliações curto­circuito e têm as formas: (and <expr>*) (or <expr>*) Exemplos: > (and (= 5 6) (< 5 6)) #f > (or (= 5 6) (< 5 6)) #t Cond

Page 8: Trabalho Clp

Tem a forma: ( cond [ <expr> <expr>* ] * ) Testa de condição em condição, se alguma verdadeira, não testa as outras condições. Exemplo: > (cond

[(= 5 6) "iguais"] [(> 5 6) "maior"] [(< 5 6) "menor"])

“menor” 8. (Subprogramas.) 9. (Há suporte à concorrência (programação paralela)?)

Racket suporta múltiplas threads de controle dentro de um programa, o armazenamento local de segmento, alguns mecanismos primitivos de sincronização, e um quadro para compor abstrações de sincronização. Além disso, as bibliotecas racket/future e racket/place fornecem suporte para paralelismo para melhorar o desempenho.

10. (Exemplo a ser implementado: o problema clássico dos “Números

de Lucas”.) #lang racket (define (lucas num) (cond [(= num 0) 2] [(= num 1) 1] [else (+ (lucas (­ num 1)) (lucas (­ num 2)))])) (define max 10001) (define min 1) (for ([i (in­range min max)]) (display (lucas i)) (printf " ")) 11. Sistema de tipos Sistema de tipos

Page 9: Trabalho Clp

Booleanos É #t para verdadeiro e #f para falso. Em condicionais, os os valores não­#f são tratados como verdadeiro. Ex: > (= 4 (+ 2 2)) #t O procedimento boolean? Reconhece as duas constantes booleanas. Ex: > (boolean? “nao”) #f Números São escritos do jeito usual, incluindo frações e números imaginários. Inteiro: 1 Racional: ½ Complexo: 1+2i Ponto­flutuante: 3.14 e 6.05e+23 Exemplos: > 0.5 0.5 > #e0.5 ½ Caractereres Caracter corresponde a um inteiro, o tipo caracter é separado dos números. Os procedimentos char­>integer e integer­>char converte entre números de valor escalar e o caracter correspondente. Exemplos: > (integer­>char 65) #\A > (char­>integer #\A) 65 String Uma string é um vetor de caracteres de tamanho­fixado e são escritas entre aspas duplas. Ex: > “Banana” “Banana” Bytes É um inteiro exato entre 0 e 255. O procedimento byte? analisa se é byte ou

Page 10: Trabalho Clp

não. Ex: > (byte? 4) #t > (byte? 300) #f Símbolos É um valor que vem depos de ‘ e o procedimento symbol? Verifica se é um símbolo, retornando verdadeiro(#t) ou falso(#f). Exemplos: > ‘x ‘x > (symbol? ‘x) #t > (symbol? 5) #f Palavras­chave É igual a símbolo só que imprime com pré­fixo #: Ex: > (string­>keyword “banana”) ; converte a string para palavra­chave ‘#:banana Pares São dois valores que são combinados com o procedimento cons. Ex: > (cons 2 4) ; Imprime colocando ‘ no começo e . entre os pares ‘(2 . 4) > (car (cons 2 4)) ; Procedimento car imprime o primeiro valor do par 2 > (cdr (cons 2 4)) ; Procedimento cdr imprime o segundo valor do par 4 > (pair? (cons 2 4)) ; Procedimento pair verifica se é um par #t Listas Combinação dos pares que formam uma lista ligada. Ex: > (cons 0 (cons 1 (cons 2 null))) ‘(0 1 2) Procedimento list? verifica se é uma lista, retorna #t ou #f.

Page 11: Trabalho Clp

> (list? (cons 2 4)) #f Vectors Um vector é um array de tamanho­fixo. Ex: > #(“x” “y” “z”) ‘#(“x” “y” “z”)