Alexandre Mota Scala: breve introdução.

Slides:



Advertisements
Apresentações semelhantes
Estruturação de Linguagens (Pascal e C++)
Advertisements

Python: Funções Claudio Esperança.
Programação em Java Prof. Maurício Braga
Programação Orientada a Objetos*
C/C++ para Sistemas Operacionais Professor: André Luis Meneses Silva /msn: Página:
Estruturas de Repetição
Paulo Marques Hernâni Pedroso
Prof. Thiago Pereira Rique
Shell Script Professor: João Paulo
Programando com Alice Tim Margush Department of Computer Science University of Akron © 2006.
Padrão de Projeto Interpreter
Linguagens de Programação Orientadas a Objetos
Programação Básica em Java
Rafael Pinto Frederico Corrêa
9 Controle de fluxo Seqüenciadores. Jumps. Escapes. Exceções.
Documentando con Javadoc
Estrutura de Dados em Java
Prof. Natalia Castro Fernandes Mestrado em Telecomunicações – UFF 2º semestre/2012.
Análise Semântica e Representação Intermédia
JAVA: Conceitos Iniciais
Introdução a linguagem Python
Unidade I: “Dê um mergulho rápido”
Python: Exceções, Iteradores e Geradores
Prof. Natalia Castro Fernandes Engenharia de Telecomunicações – UFF 2º semestre/2012.
Prof. Natalia Castro Fernandes Mestrado em Telecomunicações – UFF 2º semestre/2012.
PHP Tipos de dados Constantes.
Curso básico de PHP 1 Vantagens: Gratuito Multiplataforma Estável Rapidez Comunicação.
Programação I Aula 2 (Métodos)
Entendendo as definições de classe
OPERADORESOPERADORES SCJP – Otimize-TI. Operadores Java Resultado: Maioria das operações é um booleano ou numérico. Não podem ser sobrecarregados (Existem.
Linguagem de Programação JAVA
Prof. Daniel Aula 03.  Criar Projeto  Criar Pacote  Criando classes  Meu primeiro programa  Compilar  Comentários  Variáveis.
Introdução à Programação Orientada a Objetos com Java
Expressões e Instrução de Atribuição
Linguagem Funcional 2 Linguagem Funcional 2 - LF2 Estende LF1 com funções de alta ordem Uma função passa a ser um valor O contexto inclui um único componente:
Classes, Objetos, Atributos e Métodos JAVA
Operadores e Atribuições Capítulo 3
DESIGN E COMUNICAÇÃO MULTIMÉDIA 2011 / 2012 DESIGN E COMUNICAÇÃO MULTIMÉDIA 2011 / 2012 FORMADOR Gonçalo Miguel MÓDULO 25. Introdução ao ActionScript 3.0.
Pilhas Profa. Nádia Félix.
PROGRAMAÇÃO PARA INTERNET Prof.: Jean Carlo Mendes
Aulas 2 e 3 – Java – Prof. Marcelo Heitor # O método main e argumentos na linha de comando; # Fluxo padrão de entrada e saída; # A classe JOptionPane;
Programação Orientada a Objetos - Java
Programação I Aula 3 (Entrada de Dados) Prof. Gilberto Irajá Müller Última atualização 11/3/2009.
Aula prática 2 Operadores e Expressões Comandos de Decisão Comentários
Java Kickstart, day 2 Semelhanças com linguagem C.
Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota (com material da Qualiti Software Process)
Programação I Aula 4 (Expressões Booleanas e Expressões de Seleção) Prof. Gilberto Irajá Müller Última atualização 17/3/2009.
JAVA Sintaxe.
Certificação Marco Antonio. Introdução A compreensão desse capítulo é muito importante pois trata de um assunto essencial em qualquer linguagem de programação,
Aula Prática 1 Monitoria IP/CC (~if669) (A partir do slide elaborado por Luís Gabriel)
Aula Prática 5 Monitoria IP/CC (~if669). Roteiro 1. 1.Recursão 2. 2.Escopo de Variáveis 3. 3.Arrays 4. 4.Strings.
Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor. Variáveis e métodos estáticos, Passagem de.
Semântica de Linguagens de Programação
CES-10 INTRODUÇÃO À COMPUTAÇÃO
Copyright 2000, Departamento de Informática, UFPE. Todos os direitos reservados sob a legislação em vigor. Orientação a Objetos e Java.
Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota
Programação Funcional 4a. Seção de Slides Tuplas e Definição de Funções Locais em Haskell.
Shell Script Parte 2.
Laboratório de Programação II Método main Dados e Métodos de Classes.
PROGRAMAÇÃO PARA INTERNET Prof.: Jean Carlo Mendes
Array e ArrayList LPOO – 01/09/14.
VARIÁVEIS Desenvolvido pelo Mestrando Rodrigo Moreira Barreto – VHLab (Virtual Humans Simulation Laboratory – PUCRS) 1 Desenvolvido por: Rodrigo Moreira.
Aula Prática 1 Monitoria IP/CC (~if669) (A partir do slide elaborado por Luís Gabriel)
Linguagem Java Programação II.
Java Básico Lab Ruddá Beltrão | Cristian Costa.
Funções Recursivas Leonardo Lucena – IFRN, 2011 Adaptação das Transparências de Graham Hutton (
Variáveis, expressões e comandos Dilvan Moreira. Lembrando …  Instalação normal (para utilizar no PC com Windows) 
Clique para editar o título Linguagem C Para programadores Python PMR
Laboratório de Computação Aula 06 e 07 – Implementação de classes Prof. Fábio Dias
FUNÇÕES Dilvan Moreira (baseado em material de Z. Liang)
Transcrição da apresentação:

Alexandre Mota Scala: breve introdução

Sobre Scala Criada em 2001 por Martin Odersky Criada em 2001 por Martin Odersky Scala (Scalable language) é uma linguagem de programação de propósito geral (multiparadigma), projetada para expressar padrões de programação comuns de uma forma concisa, elegante e type- safe Scala (Scalable language) é uma linguagem de programação de propósito geral (multiparadigma), projetada para expressar padrões de programação comuns de uma forma concisa, elegante e type- safe Incorpora recursos de linguagens orientadas a objetos e funcionais Incorpora recursos de linguagens orientadas a objetos e funcionais É plenamente interoperável com Java É plenamente interoperável com Java Apesar de recente, conseguiu ser adotada pela Twitter e Foursquare Apesar de recente, conseguiu ser adotada pela Twitter e Foursquare

Instalação Tradicionalmente, Scala pode ser obtida aqui Tradicionalmente, Scala pode ser obtida aqui – Mas para o propósito da disciplina, usaremos uma instalação em Eclipse já embutindo o CSO que encontra-se aqui Mas para o propósito da disciplina, usaremos uma instalação em Eclipse já embutindo o CSO que encontra-se aqui –

SCALA POR EXEMPLOS SIMPLES

Hello World /** O 1o programa padrão */ object HelloWorld { def main(args: Array[String]) { println("Hello, World!") } } /** O 1o programa padrão */ object HelloWorld { def main(args: Array[String]) { println("Hello, World!") } } Armazene em arquivo chamado HelloWorld.scala Armazene em arquivo chamado HelloWorld.scala Compile usando scalac HelloWorld.scala (ou de uma IDE) Compile usando scalac HelloWorld.scala (ou de uma IDE) Execute com scala HelloWorld (ou de uma IDE) Execute com scala HelloWorld (ou de uma IDE) O código acima cria um único objeto O código acima cria um único objeto –Tudo no objeto é semelhante ao static de Java –Apesar de Scala não ter static Scala tem classes (Veremos adiante) Scala tem classes (Veremos adiante) 5

Comentários // e /*...*/ como em Java e C // e /*...*/ como em Java e C /** Scaladoc comments are similar to Javadoc * comments. As in Javadoc, the first sentence * is a summary sentence, and additional * sentences give more detail. However, the * formatting convention is slightly different, * and wiki markup is used in preference to * HTML markup. Most of the same flags * etc.) are used. */ def doNothing = () /** Scaladoc comments are similar to Javadoc * comments. As in Javadoc, the first sentence * is a summary sentence, and additional * sentences give more detail. However, the * formatting convention is slightly different, * and wiki markup is used in preference to * HTML markup. Most of the same flags * etc.) are used. */ def doNothing = ()

Scala e Java import java.util.{Date, Locale} import java.text.DateFormat import java.text.DateFormat._ object FrenchDate { def main(args: Array[String]) { val now = new Date val df = getDateInstance(LONG, Locale.FRANCE) println(df format now) } df.format(now)

Tudo é um objeto… A expressão A expressão –1 + 2 * 3 / x Pode ser descrita assim Pode ser descrita assim –1.+(2.*(3./(x)))

Funções são objetos object Timer { def oncePerSecond(callback: () => Unit) { while (true) { callback(); Thread sleep 1000 } } def timeFlies() { println("o tempo corre como um raio...") } def main(args: Array[String]) { oncePerSecond(timeFlies) } Para passar função

Funções anônimas object TimerAnonymous { def oncePerSecond(callback: () => Unit) { while (true) { callback(); Thread sleep 1000 } } def main(args: Array[String]) { oncePerSecond(() => println("o tempo corre como um raio...")) }

Definição recursiva do while def whileLoop(condition: => Boolean)(command: => Unit) { if (condition) { command; whileLoop(condition)(command) } else () }

Classes class Complex(real: Double, imaginary: Double) { def re() = real def im() = imaginary } new Complex(1.5, 2.3)

Classes class Person(private var _name: String) { def name = _name // accessor def name_=(aName: String) { _name = aName } // mutator } val p = new Person("Jonathan") p.name = "Jony" // setter println(p.name) // getter

Herança e polimorfismo class Complex(real: Double, imaginary: Double) { def re = real def im = imaginary override def toString() = "" + re + (if (im < 0) "" else "+") + im + "i" }

ALGUNS DETALHES TÉCNICOS

Tipos A hierarquia de tipos é um reticulado (não uma árvore) A hierarquia de tipos é um reticulado (não uma árvore) –Isto é, tem um elemento “bottom” e um “top” Any Any –AnyVal  Boolean, Char, Byte, Short, Int, Long, Float, Double –Scala não tem primitivos—todos criam objetos  Unit (tem apenas um único valor: () ) –Unit é o valor padrão de funções que “não têm retorno” (ex. Println) 16

Tipos Any Any –AnyRef (corresponde a Object de Java)  Todos os tipos de referência Java, por exemplo, String  ScalaObject –Todos os tipos de referências Scala, incluindo Array e List –Null (bottom de todos os objetos AnyRef) Nothing (bottom de Any) Nothing (bottom de Any) 17

Declaração de variáveis e valores A sintaxe é var name: type = value // declara uma variável val name: type = value // declara um valor A sintaxe é var name: type = value // declara uma variável val name: type = value // declara um valor Valores são imutáveis: eles não podem ser alterados (paradigma funcional) Valores são imutáveis: eles não podem ser alterados (paradigma funcional) O fragmento : type em geral pode ficar ausente—o tipo é inferido do valor O fragmento : type em geral pode ficar ausente—o tipo é inferido do valor O fragmento = value sempre deve ser fornecido (para a inferência funcionar) O fragmento = value sempre deve ser fornecido (para a inferência funcionar) Isto também funciona: var x: Double = 5 Isto também funciona: var x: Double = 5 18

Declaração de variáveis e valores Identificadores são como em Java, da mesma forma como as regras de escopo Identificadores são como em Java, da mesma forma como as regras de escopo Operadores aritméticos, de comparação, e lógicos também acompanham os de Java Operadores aritméticos, de comparação, e lógicos também acompanham os de Java Indentação é feita com 2 espaços em branco (Comandos não usam ; como terminação e a indentação serve como escopo- --os {} de Java ) Indentação é feita com 2 espaços em branco (Comandos não usam ; como terminação e a indentação serve como escopo- --os {} de Java ) 19

“Comandos” “Comandos” em Scala na verdade agem como “expressões” porque sempre possuem valor associado “Comandos” em Scala na verdade agem como “expressões” porque sempre possuem valor associado –Por exemplo, o valor de a = 5 é 5 O valor de muitos comandos é simplesmente () O valor de muitos comandos é simplesmente ()  () é um valor do tipo Unit  () é o único valor do tipo Unit O valor de um bloco, {…}, é o último valor computado no bloco O valor de um bloco, {…}, é o último valor computado no bloco Um comando termina com o fim de linha (e não com ;) exceto se estiver de fato incompleto Um comando termina com o fim de linha (e não com ;) exceto se estiver de fato incompleto –Por exemplo, x = 3 * (2 * y + está obviamente incompleto –Uma vez que Scala permite ausência de muita terminação desnecessária, as vezes uma linha que se pode pensar estar completa, está incompleta (e vice versa) Você pode terminar comandos com ;, mas não é boa prática em Scala Você pode terminar comandos com ;, mas não é boa prática em Scala 20

Tipos de comandos frequentes Os mais comuns são: Os mais comuns são: –variável = expressão // também +=, *=, etc.  O valor do comando é o valor da variável –while (condição) { comandos }  O valor do comando é () –do { comandos } while (condição)  O valor é () –if (condição) { comandos }  O valor é o do último comando executado –if (condição) { comandos1 } else { comandos2 }  Se else omitido e a condição for false, o valor do if será ()

O comando for O comando for de Scala é mais poderoso que o de Java O comando for de Scala é mais poderoso que o de Java –Assim, ele é usado com mais frequência que outros tipos de laços Alguns exemplos abaixo… Alguns exemplos abaixo… for (i <- 1 to 10) { println(i) } for (i <- 1 to 10) { println(i) } –Mostra os números de 1 a 10 for (i <- 1 until 10) { println(i) } for (i <- 1 until 10) { println(i) } –Mostra os números de 1 a 9 for (x <- 0 until myArray.length) { println(myArray(x)) } for (x <- 0 until myArray.length) { println(myArray(x)) } –Mostra todos os valores de myArray

O comando for for (x <- myArray) { println(x) } for (x <- myArray) { println(x) } –Mostra todos os valores de myArray for (x <- myArray if x % 2 == 0) { println(x) } for (x <- myArray if x % 2 == 0) { println(x) } –Mostra todos os números pares existentes em myArray

Arrays Arrays em Scala são tipos parametrizados Arrays em Scala são tipos parametrizados –Array[String] é um Array de Strings, onde String é um parâmetro de tipo –Em Java chamaríamos isto de “tipo genérico” Quando valores iniciais não são dados, new é requerido, bem como um tipo explícito: Quando valores iniciais não são dados, new é requerido, bem como um tipo explícito: –val ary = new Array[Int](5) Quando valores iniciais são dados, new não é permitido: Quando valores iniciais são dados, new não é permitido: –val ary2 = Array(3, 1, 4, 1, 6)

Arrays Arrays em Scala são apenas um outro tipo de objeto; eles não têm sintaxe especial Arrays em Scala são apenas um outro tipo de objeto; eles não têm sintaxe especial Listas em Scala são mais úteis e usadas que Arrays Listas em Scala são mais úteis e usadas que Arrays –val list1 = List(3, 1, 4, 1, 6) –val list2 = List[Int]() // Uma lista vazia deve ter um tipo explícito

Operações simples sobre List Por padrão, Lists, como Strings, são imutáveis Por padrão, Lists, como Strings, são imutáveis –Operações sobre uma List imutável retorna uma nova List Operações básicas: Operações básicas: –lista.head (ou lista head) retorna o primeiro elemento da lista –lista.tail (ou lista tail) retorna uma lista sem o primeiro elemento –lista(i) retorna o i ésimo elemento (iniciando em 0) da lista –lista(i) = valor é ilégal (imutável, lembra?) –valor :: lista retorna uma lista com valor adicionado à frente –lista1 ::: lista2 concatena duas listas –lista.contains(valor) (ou lista contains valor) testa se valor existe em lista

Operações simples sobre List Uma operação sobre uma List pode retornar uma List de um tipo diferente Uma operação sobre uma List pode retornar uma List de um tipo diferente –scala> "abc" :: List(1, 2, 3) res22: List[Any] = List(abc, 1, 2, 3) Há mais de 150 operações pré-def sobre Lists--use a API! Há mais de 150 operações pré-def sobre Lists--use a API!

T-uplas Scala tem t-uplas (t no máximo 22) Scala tem t-uplas (t no máximo 22) –scala> val t = Tuple3(3, "abc", 5.5) t: (Int, java.lang.String, Double) = (3,abc,5.5) –scala> val tt = (3, "abc", 5.5) tt: (Int, java.lang.String, Double) = (3,abc,5.5) T-uplas são referenciadas iniciando em 1, usando _1, _2,... T-uplas são referenciadas iniciando em 1, usando _1, _2,... –scala> t._1 res28: Int = 3 –t _1 também funciona (o. é opcional) T-uplas, como listas, são imutáveis T-uplas, como listas, são imutáveis T-uplas são alternativa para retornar mais de um valor T-uplas são alternativa para retornar mais de um valor

Mapas scala> val m = Map("apple" -> "red", "banana" -> "yellow") m: scala.collection.immutable.Map[java.lang.String,java.lang.Str ing] = Map((apple,red), (banana,yellow)) scala> val m = Map("apple" -> "red", "banana" -> "yellow") m: scala.collection.immutable.Map[java.lang.String,java.lang.Str ing] = Map((apple,red), (banana,yellow)) –Note que um Map é de fato uma lista de t-uplas –O -> é usado como uma sintaxe mais legível scala> m("banana") res2: java.lang.String = yellow scala> m("banana") res2: java.lang.String = yellow scala> m contains "apple" res3: Boolean = true scala> m contains "apple" res3: Boolean = true scala> m("cherry") java.util.NoSuchElementException: key not found: cherry scala> m("cherry") java.util.NoSuchElementException: key not found: cherry

Simples definições de funções def isEven(n: Int) = { val m = n % 2 m == 0 } def isEven(n: Int) = { val m = n % 2 m == 0 } –O resultado é o último valor (neste caso, um Booleano) def isEven(n: Int) = n % 2 == 0 def isEven(n: Int) = n % 2 == 0 –O resultado é expressão simples e então não precisa das chaves def countTo(n: Int) { for (i <- 1 to 10) { println(i) } } def countTo(n: Int) { for (i <- 1 to 10) { println(i) } } –Não é bom estilo omitir o = quando o resultado for () –Se o = for omitido, o resultado será () def half(n: Int): Double = n / 2 def half(n: Int): Double = n / 2 –O tipo de retorno pode ser dado explicitamente –Neste exemplo, half(7) retornará 3.5 (!) def half(n: Int): Int = return n / 2 def half(n: Int): Int = return n / 2 –Se return for usado, deve-se colocar o tipo explicitamente

Funções = objetos de 1a classe Funções são valores (como inteiros, etc.) e podem ser atribuídos a variáveis, passados a e retornados de funções Funções são valores (como inteiros, etc.) e podem ser atribuídos a variáveis, passados a e retornados de funções Toda vez que o símbolo => surgir, trata-se de função Toda vez que o símbolo => surgir, trata-se de função Exemplo (atribuição de função a variável foo): Exemplo (atribuição de função a variável foo): –scala> val foo = (x: Int) => if (x % 2 == 0) x / 2 else 3 * x + 1 foo: (Int) => Int = scala> foo(7) res28: Int = 22 A sintaxe básica de uma função é lista_de_parâmetros => corpo_da_função A sintaxe básica de uma função é lista_de_parâmetros => corpo_da_função Neste exemplo, foreach é uma função que usa função como parâmetro: Neste exemplo, foreach é uma função que usa função como parâmetro: –myList.foreach(i => println(2 * i))

Funções como parâmetros Ao definir função, deve-se especificar os tipos de cada um de seus parâmetros Ao definir função, deve-se especificar os tipos de cada um de seus parâmetros Então, tem-se as opções: Então, tem-se as opções: –(tipo1, tipo2,..., tipoN) => tipo_de_returno –tipo => tipo_de_retorno // Apenas um parâmetro Exemplo: Exemplo: –scala> def doTwice(f: Int => Int, n: Int) = f(f(n)) doTwice: (f: (Int) => Int,n: Int)Int scala> def collatz(n: Int) = if (n % 2 == 0) n / 2 else 3 * n + 1 collatz: (n: Int)Int scala> doTwice(collatz, 7) res2: Int = 11 scala> doTwice(a => 101 * a, 3) res4: Int = 30603

Métodos de alta-ordem sobre listas map aplica função de 1-parâmetro a todo elemento de lista, retornando nova lista map aplica função de 1-parâmetro a todo elemento de lista, retornando nova lista –scala> def double(n: Int) = 2 * n double: (n: Int)Int –scala> val ll = List(2, 3, 5, 7, 11) ll: List[Int] = List(2, 3, 5, 7, 11) –scala> ll map double res5: List[Int] = List(4, 6, 10, 14, 22) –scala> ll map (n => 3 * n) res6: List[Int] = List(6, 9, 15, 21, 33) –scala> ll map (n => n > 5) res8: List[Boolean] = List(false, false, false, true, true) filter aplica teste de 1-parâmetro a todo elemento de lista, retornando uma lista dos elementos que passam no teste filter aplica teste de 1-parâmetro a todo elemento de lista, retornando uma lista dos elementos que passam no teste –scala> ll filter(n => n ll filter(n => n < 5) res10: List[Int] = List(2, 3) –scala> ll filter (_ ll filter (_ < 5) // função abreviada onde parâmetro simples é usado 1-vez res11: List[Int] = List(2, 3)

Casamento de padrão Casamento de padrão sobre valores: Casamento de padrão sobre valores: –today match { case "Saturday" => println("Party! Party! Party!") case "Sunday" => println("Pray....") case day => println(day + " is a workday. :( ") } Casamento de padrões sobre tipos: Casamento de padrões sobre tipos: –something match { case x: Int => println("I'm the integer " + x) case x: String => println("I'm the String \"" + x + "\"") println("My length is " + x.length) case _ => println("I don't know what I am! :( ") }

O tipo Option Scala tem null devido ao intercâmbio com Java; não precisa ser usado em outros momentos Scala tem null devido ao intercâmbio com Java; não precisa ser usado em outros momentos No lugar, usa o tipo Option, com valores Some(valor) and None No lugar, usa o tipo Option, com valores Some(valor) and None –def max(list: List[Int]) = { if (list.length > 0) { val biggest = (list(0) /: list) { (a, b) => if (a > b) a else b } Some(biggest) } else { None } –max(myList) match { case Some(x) => println(”Maior número é " + x) case None => println(”Não há números aqui!!!") }

Os métodos require e assert require e assert são métodos que levantam exceção quando seus argumentos são false require e assert são métodos que levantam exceção quando seus argumentos são false Require é usados para documentar que algo deve ser válido para o código funcionar corretamente Require é usados para documentar que algo deve ser válido para o código funcionar corretamente –def sqrt(x: Double) = { require(x >= 0);... } –Require é frequentemente usado no início de um método Assert é usado para documentar que algo “conhecido” deve ser válido Assert é usado para documentar que algo “conhecido” deve ser válido –takeCis700course assert(languagesIKnow contains "Scala") –Assert é frequentemente usado ao final de um bloco de código, para informar o que o código alcançou

Exceções A criação e lançamento de exceções em Scala é como em Java: A criação e lançamento de exceções em Scala é como em Java: –class RottenEggException extends Exception –throw new RottenEggException Capturar uma exceção levantada usa casamento de padrão: Capturar uma exceção levantada usa casamento de padrão: –try { makeAnOmlet } catch { case ex: RottenEggException => case ex: Exception => println("What went wrong?") }

Alexandre Mota Scala: breve introdução