1.1. Estudo de Caso: MosML

Documentos relacionados
Controle de Fluxo em ML

Introdução à Ciência da Computação

Linguagens de Programação Conceitos e Técnicas. Amarrações Prof. Tiago Alves de Oliveira

Linguagem Pascal. Prof. Antonio Almeida de Barros Junior

Programação Introdução

Linguagens de Programação Conceitos e Técnicas. Amarrações

Puca Huachi Vaz Penna

Programação de Computadores II Aula 03. Linguagem C I

= = = = = = = = = = = = = = = =

Pascal. -Cabeçalho do programa. - label - const - type - var - procedure - function. - integer - real - byte - boolean - char - string

Programação de Computadores II

Linguagem de programação: Pascal

Computação I (MAB120) DCC/UFRJ

Linguagem Haskell. Universidade Estadual Santa Cruz Conceitos de Linguagens de Programação. Tiago Carneiro 19 Agosto 2013

Linguagens de Programação Funcional

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

Pedro Vasconcelos DCC/FCUP. Programação Funcional 3 a Aula Definição de funções

O AMBIENTE DE PROGRAMAÇÃO VISUAL -PLANO DE ENSINO. Prof. Angelo Augusto Frozza, M.Sc.

Listas em Haskell. Listas. Linguagem Haskell. Maria Adriana Vidigal de Lima. Faculdade de Computação - UFU. Setembro

Fundamentos de Lógica e Algoritmos. Aula 3.2 IDLE, Variáveis e Tipos. Prof. Dr. Bruno Moreno

Linguagem Pascal. Prof. Sérgio Rodrigues. É a descrição, de forma lógica, dos passos a serem executados no cumprimento de determinada tarefa;

para facilitar o trabalho com listas listas Cell model Lista é representada através de uma lista de células

Introdução à Linguagem Lua Variáveis e Expressões

Variáveis primitivas e Controle de fluxo

Sintaxe do Pascal Simplificado Estendido de 12 novas construções em Notação EBNF (BNF estendida)

Introdução à Programação. Uma Abordagem Funcional

Instituto Federal de Educação, Ciência e Tecnologia do RN Câmpus Currais Novos. LINGUAGEM C++ VARIÁVEIS COMPOSTAS Arrays Aula I

Tipos Algébricos. Programação Funcional. Capítulo 11. José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

Conceitos de Linguagens de Programação

Aula Prática 3. Paradigmas da Programação I / Programação Funcional. ESI/MCC 1 o ano (2005/2006)

Nomes, Amarração, Verificação de Tipos, e Escopo

ao paradigma imperativo

Processamento da Informação Teoria. Desvio Condicional

Tipo. Tipo de uma variável: especificação de

PROGRAMAÇÃO ESTRUTURADA E ORIENTADA A OBJETOS

Laboratório de Programação II

INF1007: Programação 2. 0 Revisão. 06/08/2015 (c) Dept. de Informática - PUC-Rio 1

Introdução à Programação uma Abordagem Funcional

Pedro Vasconcelos DCC/FCUP. Programação Funcional 2 a Aula Tipos e classes

Noçõ linguagem Java. Profs. Marcel Hugo e Jomi Fred Hübner. Departamento de Sistemas e Computação Universidade Regional de Blumenau - FURB

CIT Aula 02 Variáveis e Estruturas de desvio condicional. Autor: Max Rodrigues Marques Carga Horária: 2 h 22/07/15 1

Aula Prática 2. Paradigmas da Programação I / Programação Funcional

Introdução à Programação em C

3. Linguagem de Programação C

Aula prática 14. Expressão Lambda

Funções de Ordem Superior

Aula 4: Introdução à Linguagem C++

Primeira Prova de Linguagens de Programação - DCC024W - Sistemas de Informação

Algoritmos e Estrutura de Dados I Conceitos de Algoritmos. Prof. Elyssandro Piffer

Linguagens de Programação Aula 13

Compiladores Análise de Tipos

Pedro Vasconcelos DCC/FCUP. Programação Funcional 2 a Aula Tipos e classes

A Linguagem Lua Lua Puc-Rio

Programação I Aula 3 Primeiros programas

Intuição da sintaxe de L2 (35)

Introdução à linguagem C++

Arquitetura Von Neumann Dados e instruções são obtidos da mesma forma, simplificando o desenho do microprocessador;

Erros de Tipo em Pascal Simplifificado

ALGORITMOS VARIÁVEIS E OPERADORES. Prof. Angelo Augusto Frozza, M.Sc.

Grupo 3: 8,3 - Parte Léxica (2,0): 1,9 - Na parte I especificou tamanho de identificador com 512 caracteres, mas não tratou (-0,1) -Parte Sintática

O nome da variável é utilizado para identificação (para carga e posterior uso). Porém, são necessárias algumas regras para nomear essa variável:

Aula 03: Introdução a C

Aula 4 - Operadores. Prof. Laura Silva de Assis. Engenharia de Computação 2 o Período

Computação Eletrônica. Tipos de dados, constantes, variáveis, operadores e expressões. Prof: Luciano Barbosa

FACCAT Sistemas de Informação. Estruturas de Dados

1/50. Conceitos Básicos. Programa Básico

LINGUAGEM C: COMANDOS DE CONTROLE CONDICIONAL

Linguagens de Programação 2 Amarrações

Estruturas de dados. Pedro Vasconcelos. 3 de Março de 2014

Aula 13 Oficina de Programação Modularização. Profa. Elaine Faria UFU

Computação 1 - Python Aula 3 - Teórica: Tipos de dados, Strings, Estrutura Condicional 1/ 28

Teoria da Computação e Algoritmos. Introdução à Linguagem Pascal. ALGORITMO <Nome do algoritmo>; <definições>; INÍCIO <Comandos>; FIM.

Métodos Computacionais. Tipos Estruturados

Histórico. Origens da linguagem

1 Expressões, valores e tipos 1. 2 Variáveis e atribuições 5. cálculo de expressões segue a estrutura de parênteses e as prioridades dos operadores

LINGUAGEM C: VARIÁVEIS E EXPRESSÕES

Introdução à Programação / Programação I

Universidade Federal do Espírito Santo Centro Tecnológico Departamento de Informática. Erlang. Luiz Carlos Passamani Filho.

Técnicas Alternativas de Programação: Programação Funcionalista Alexandre Direne - Dep. de Informática - UFPR

Curso Profissional de Gestão e Programação de Sistemas Informáticos. Programação e Sistemas de Informação. Módulo 1. 3ª Parte Prof. Sandra Pais Soares

Introdução à Programação Aula 3 Primeiros programas

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

Linguagem de Programação e Compiladores

UNISINOS - UNIVERSIDADE DO VALE DO RIO DOS SINOS CENTRO DE CIÊNCIAS EXATAS E TECNOLÓGICAS (C6/6) Curso: Informática

Análise de Programação

Algoritmos I Aula 13 Linguagem de Programação Java

Modularização. Prof. Antonio Almeida de Barros Junior

Algoritmos II prof. Daniel Oliveira

Variáveis Tipos de Dados. APROG (Civil) Aula 2

Working 03 : Conceitos Básicos I

Introdução à Linguagem C Variáveis e Expressões

Métodos Computacionais

Fluxogramas e variáveis

Algoritmos. Algoritmos. Linguagem de programação. Conceitos. Conceitos. Conceitos. Sintaxe do comando para incluir bibliotecas no programa:

APÊNDICE A - FUNDAMENTOS DA LINGUAGEM DE PROGRAMAÇÃO PASCAL.

Variáveis Tipos de Dados

Introdução a JAVA. Variaveis, tipos, expressões, comandos e blocos

Transcrição:

1.1. Estudo de Caso: MosML 1.1.1. Introdução MoscowML (ou simplesmente MosML) é um subconjunto do ML padrão (ML=MetaLanguage). O programa básico é a declaração de uma função. Exemplo: Fatorial em ML Introduz declaração de uma função Nome da função - fun fat n = if n=0 then 1 else n*fat(n-1); > val fat = fn : t -> t Operador de amarração Corpo da função Resposta (ou assatura): retorna o tipo de dado do valor defido Pode especificar o tipo do parâmetro "n" e o tipo que a função retorna. Por exemplo: fun fat(n: t):t =... Porém, ML tem um mecanismo de ferência de tipos (os tipos da maioria das expressões podem ser determados sem necessidade de o programador especificar o tipo das variáveis) Neste exemplo, como tem "1", ele deduz que é teiro - fun fat(n:real) : real = if n=0.0 then 1.0 else n*fat(n-1.0); > val fat = fn : real -> real - fat (3.0); > val it = 6.0 : real - fat(3.2);! Uncaught exception:! Out_of_memory Obs: para escrever uma mensagem na tela digite prt "xxx \n"; alguns exemplos: - val str = "teste \n"; > val str = "teste \n" : strg - prt str; teste > val it = () : unit - prt (str ^ " e mais um \n" ^ str); teste e mais um teste > val it = () : unit - prt "Hello World! \n"; Hello World! > val it = () : unit

1.1.2. Funções Funções são tratadas como valores (por isso a resposta "val fat") Depois que a função foi declarada, ela pode ser chamada (ex: - fat 5; > val it = 120 : t) ML possui o equivalente a uma função lambda, isto é, permite defir funções sem nome (* com nome *) - fun cube(x) = x * x * x; > val cube = fn : t -> t - cube(3); > val it = 27 : t (* sem nome *) -(fn x => x * x * x) (3); > val it = 27 : t - (fn x:t => x * x) 2; > val it = 4 : t Uma maneira alternativa de defir uma função sem usar a palavra reservada fun, é val rec f = fn<match> A palavra reservada rec, abreviatura de "recursive",é necessária somente se a função f é recursiva, isto é, ela forma para ML que a função que está sendo defida é recursiva e não foi defida antes. Torna-se importante salientar que declarações que usam fun são automaticamente assumidas como recursivas - val rec fat = fn n => if n = 0 then 1 else n * fat (n-1); > val fat = fn : t -> t - fat 4; > val it = 24 : t - val rec reverse = fn nil => nil x::xs => reverse(xs) @ [x]; > val reverse = fn : 'a list -> 'a list - reverse [7,2,5,8]; > val it = [8, 5, 2, 7] : t list - val F = fn n => if n=0 then 1 else 1+F(n-1);! val F = fn n => if n=0 then 1 else 1+F(n-1);! Unbound value identifier: F - val F = fn n => if n>0 then "positivo" else "negativo"; > val F = fn : t -> strg - F(10); > val it = "positivo" : strg - F(~20); > val it = "negativo" : strg 1.1.3. Amarração ML permite que nomes sejam amarrados a valor (declaração value); é diferente de um comando de atribuição; o nome é amarrado a um valor, mas não pode "trocar" de valor, a menos que seja feita uma nova amarração. Program Store Control Environment Store Rules... X 7 Y 5 X 3 Deve-se armazenar quais amarrações são troduzidas (no environment store) Cada célula do environment store contém um par: nome e valor amarrado a ele. Ex: val x = 3;

Quanto tiver, por exemplo, "x+3", x é trocado pelo seu valor, que é encontrado no environment store Para cada declaração, uma nova amarração é troduzida no environment store É possível fazer uma nova amarração a um novo valor, porém a amarração antiga nunca mais poderá ser usada Obs1: se colocar, por exemplo, "x=y", ML vai tratar como igualdade e vai retornar um valor booleano (true ou false) Obs2: se usar um nome sem "amarrar", ele dá um erro "unbound value identifier: -" Amarrações temporárias: - val n = 5; > val n = 5 : t - fun sum1to n = n * (n+1) div 2; (* n = parâmetro, escopo local *) > val sum1to = fn : t -> t - sum1to 100; > val it = 5050 : t - sum1to n; > val it = 15 : t Declarações válidas localmente são usadas quando é necessário criar alguns valores temporários dentro da função (como se fossem variáveis locais) Para isto: let val <nome1> = <expressão1>; val <nome2> = <expressão2>;... val <nomen> = <expressãon>; <expressão> (* amarrações do let só são válidas aqui *) end Exemplos (";" nos comandos dentro do let é opcional): - val raio = 10.6; > val raio = 10.6 : real - let val pi = 3.1416 pi * raio * raio end; > val it = 352.990176 : real 1.1.4. Tipos - let val x = 3; val y = x * x; x * y end; > val it = 27 : t load "math"; open math; - fun area(a, b, c) = let val p = (a + b +c) / 2.0; sqrt (p * (p-a) * (p-b) * (p-c)) end; > val area = fn : Real.real * Real.real * Real.real -> Real.real ML é fortemente tipada (o tipo de qualquer "variável" ou expressão pode ser determado em tempo de compilação) ML dá erro de tipo e não converte tipos (por exemplo se uma função espera um teiro e é fornecido um real) Exemplo: - fun doublereal x:real = x * x; > val doublereal = fn : Real.real -> Real.real - doublereal 2;! doublereal 2;

! Type clash: expression of type! t! cannot have type! Real.real - doublereal (real 2); > val it = 4.0 : Real.real Outro exemplo, a operação de divisão ("/") não funciona com teiro; neste caso deve-se usar a função "real" que converte de teiro para real - val resp = 2 / 4;! val resp = 2 / 4;! Type clash: expression of type! t! cannot have type! Real.real - val resp = real 2 / real 4; > val resp = 0.5 : Real.real Outras funções de conversão load "Real"; open Real; (* de real para strg *) - val str = tostrg(3.1416); > val str = "3.1416" : strg (* de real para teiro *) - val X = trunc(3.14); > val X = 3 : t - val Y = round(3.14); > val Y = 3 : t - val x = trunc(2.8); > val x = 2 : t - val y = round(2.8); > val y = 3 : t ML permite que alguns tipos em uma expressão sejam "type variables" (tipos variáveis), nos quais o tipo de uma subexpressão pode ser determado e depender do tipo atual fornecido durante a execução. Por exemplo "hd" e "tl" são aplicadas a qualquer tipo de lista (teiros, reais, caracteres, etc.). "hd" e "tl" não podem ser aplicadas a tuplas Uma função cujo tipo contém tipos variáveis é POLIMÓRFICA (tipos das variáveis refere-se a tipos fixos mais arbitrários, que são trocados pelos tipos atuais quando as funções são aplicadas) - fun fst (x, y) = x; > val fst = fn : 'a * 'b -> 'a - fst(3,6); > val it = 3 : t - fst (5.6,7.8); > val it = 5.6 : real - fst (9.8, 2); > val it = 9.8 : real - fst ("ave", 10); > val it = "ave" : strg ML usa pattern-matchg para resolver a questão dos tipos variáveis durante a execução (** escrever só até aqui no quadro **) e para determar estaticamente os tipos de funções com formação de tipo completa nas suas declarações (type ference ou ferência de tipo).

1.1.5. Estrutura de dados em ML 1. LISTA: os elementos são todos do mesmo tipo; ML fornece uma notação simples para listas que são escritas entre colchetes com vírgulas para separar os elementos - [2,6,1]; > val it = [2, 6, 1] : t list - [3.4, 5.6, 7.8]; > val it = [3.4, 5.6, 7.8] : real list - val LC=[#"a", #"g", #"m"]; > val LC = [#"a", #"g", #"m"] : char list - ["a", "b"]; > val it = ["a", "b"] : strg list - []; > val it = [] : 'a list - val L = [7,4,9,2]; > val L = [7, 4, 9, 2] : t list - hd(l); > val it = 7 : t - tl(l); > val it = [4, 9, 2] : t list - hd(tl(tl(l))); > val it = 9 : t - hd([#"l", #"m", #"A", #"e"]); > val it = #"L" : char - (* cons *) 2::L; > val it = [2, 7, 4, 9, 2] : t list - (* concatenar listas do mesmo tipo *) [5,6,7]@L; > val it = [5, 6, 7, 7, 4, 9, 2] : t list Obs: Em ML strgs e listas são tipos diferentes; entretanto, existe uma grande similaridade entre um strg e uma lista de caracteres e é possível fazer uma conversão entre as duas representações usando as funções built- explode e implode. Outra função semelhante a implode, concat, trabalha com listas de strgs e produz um strg que é a concatenação de todos os strgs de L, em ordem. (* explode pega um strg e converte para uma lista de caracteres *) - explode ("universidade"); > val it = [#"u", #"n", #"i", #"v", #"e", #"r", #"s", #"i", #"d", #"a", #"d", #"e"]: char list - explode(""); > val it = [] : char list (* implode pega uma lista cujos elementos sao caracteres e concatena-os formando um strg *) - implode([#"o", #"v", #"o"]); > val it = "ovo" : strg - (* concat concatena todos os strgs de uma lista formando um strg fal *) concat(["puc ", "fica ", "em ", "POA!"]); > val it = "PUC fica em POA!" : strg 2. TUPLA: é formada por uma lista de duas ou mais expressões de qualquer tipo, separadas por vírgulas e que ficam entre parênteses; é semelhante a registro, mas os campos são identificados pela posição na tupla. - val t = (4, 5.0, "seis"); > val t = (4, 5.0, "seis") : t * Real.real * strg - (1,2,3); > val it = (1, 2, 3) : t * t * t - (1, (4, 6.7));

> val it = (1, (4, 6.7)) : t * (t * Real.real) - (* "#i" eh usado para acessar um elemento da tupla *) #1(t); > val it = 4 : t - #2(t); > val it = 5.0 : Real.real - #3(t); > val it = "seis" : strg - #4(t);! #4(t);! Type clash: expression of type! t * Real.real * strg! cannot have type! {1 : t, 2 : Real.real, 3 : strg, 4 : 'a,...}! because record label 4 is missg (* é possível até serir uma lista de teiros numa tupla *) - val T=([4,5,6],(8,"o"),"asddf",#"a"); > val T = ([4, 5, 6], (8, "o"), "asddf", #"a"): t list * (t * strg) * strg * char 3. Defições TYPE: é um tipo de macro para expressões defidas previamente, isto é, limita-se a defições de abreviações; type defe um novo tipo de uma maneira simples, como uma abreviação para outros tipos; a forma mais simples é type <identificador> = <expressão>; <identificador> é o nome para o novo tipo. - type signal = real list; > type signal = Real.real list - val v = [1.0, 2.0] : signal; > val v = [1.0, 2.0] : Real.real list - type pessoa = strg * t; > type pessoa = strg * t - ("joao", 20); > val it = ("joao", 20) : strg * t O nome dado ao tipo pode ser usado como substituto para o tipo strg * t, mas o sistema não usa o nome; mas é possível usar o nome para criar outros tipos. 4. Defições DATATYPE: são regras para construção de novos tipos com novos valores (defição de tipos estruturados e enumerados); a defição de um datatype envolve dois tipos de identificadores: I) um construtor que é o nome do datatype; II) um ou mais construtores de dados, que são identificadores usados como operadores para construir valores que pertencem a um novo datatype. - datatype fruta = maca pera uva; > datatype fruta con maca = maca : fruta con pera = pera : fruta con uva = uva : fruta - fun eh_uva (x) = x = uva; > val eh_uva = fn : fruta -> bool - eh_uva(maca); > val it = false : bool - eh_uva(uva); > val it = true : bool - eh_uva(morango);! eh_uva(morango); ^^^^^^

! Unbound value identifier: morango (* "of" dica que uma função construtora é troduzida-não é exatamente uma função, o resultado *) (* não é um valor, apenas um novo objeto de dado é criado *) (* "con" dica que o contrutor foi defido *) - datatype ponto = ponto of real * real; > datatype ponto con ponto = fn : Real.real * Real.real -> ponto - datatype peso = peso of real; > datatype peso con peso = fn : Real.real -> peso - datatype reg = reg of pessoa * peso * strg; > datatype reg con reg = fn : (strg * t) * peso * strg -> reg - val joao = reg(("joao",20), peso 60.5, "Av.Ipiranga 1200"); > val joao = reg(("joao", 20), peso 60.5, "Av.Ipiranga 1200") : reg - val maria = reg (("Maria", 30), peso 53.5, "Av. Ganzo 780/402"); > val maria = reg(("maria", 30), peso 53.5, "Av. Ganzo 780/402") : reg - datatype arq = file of reg list; > datatype arq con file = fn : reg list -> arq - val cadcli = file[joao, maria]; > val cadcli = file [reg(("joao", 20), peso 60.5, "Av.Ipiranga 1200"), reg(("maria", 30), peso 53.5, "Av. Ganzo 780/402")]: arq - datatype direction = norte sul leste oeste; > datatype direction con norte = norte : direction con sul = sul : direction con leste = leste : direction con oeste = oeste : direction (* ML vê esta declaração como a criação de um padrão que deve ser matched=correspondido *) (* Pattern-Matchg é usado para criar funções do tipo abaixo *) (* Se não colocarmos todos os casos, ML envia a mensagem "pattern matchg is not exhaustive *) (* ML vai pegar o primeiro pattern que corresponder *) - fun headg norte = 0.0 headg sul = 180.0 headg leste = 90.0 headg oeste = 270.0; > val headg = fn : direction -> Real.real - datatype LOGICO = Verdadeiro Falso Indefido; > datatype LOGICO con Verdadeiro = Verdadeiro : LOGICO con Falso = Falso : LOGICO con Indefido = Indefido : LOGICO - fun AND (Verdadeiro, Verdadeiro) = Verdadeiro AND (Falso,_) = Falso AND (_,Falso) = Falso AND (_,_) = Indefido; > val AND = fn : LOGICO * LOGICO -> LOGICO - AND(Falso,Verdadeiro); > val it = Falso : LOGICO - AND(Verdadeiro, Verdadeiro); > val it = Verdadeiro : LOGICO