Programación imperativa (2)
Table of Contents
Igualdad de valor y referencia en Scheme
- La igualdad de referencia se comprueba con la función
eq?:(eq? x y)devuelve#tcuandoxeyapuntan al mismo dato - La igualdad de contenido se comprueba con la función
equal?:(equal? x y)devuelve#tcuandoxeycontienen el mismo valor
Si dos variables son eq? también son equal?.
(define a (cons 1 2)) (define b (cons 1 2)) (define c a) (equal? a b) (equal? a c) (eq? a b) (eq? a c)
Ejemplos de mayor eficiencia con los datos mutables en Scheme
- Inserción en una lista ordenada:
(define (make-olist) (list '*list*)) (define (insert! n olist) (cond ((null? (cdr olist)) (set-cdr! olist (cons n '()))) ((< n (cadr olist)) (set-cdr! olist (cons n (cdr olist)))) ((= n (cadr olist)) #f) ; el valor devuelto no importa (else (insert! n (cdr olist))))) - Otro ejemplo: tabla hash
(define (make-table) (list '*table*)) (define (get key table) (let ((record (assq key (cdr table)))) (if (not record) #f (cdr record)))) (define (put key value table) (let ((record (assq key (cdr table)))) (if (not record) (set-cdr! table (cons (cons key value) (cdr table))) (set-cdr! record value))))
Datos mutables en Scala
- Objetos
- Colecciones mutables
- List Buffer
Ejemplo de ListBuffer
import scala.collection.mutable.ListBuffer val buf = new ListBuffer[Int] buf += 1 buf += 2 3 +: buf
- Un
ListBufferes un tipo de referencia:val buf = new ListBuffer[Int] val buf2 = buf buf2 += 4
Operaciones importantes de ListBuffer
- Añadiendo list buffers:
val buf = new ListBuffer[Int] buf += 1 val buf2 = new ListBuffer[Int] buf2 ++= List(2,3,4) buf ++= buf2
- Eliminando elementos:
val buf = new ListBuffer[String] buf ++= List("Paris","Madrid","Londres") buf -= "Paris" - Función
indexOf:val buf = new ListBuffer[String] buf ++= List("Paris","Madrid","Londres") buf.indexOf("Madrid") - Función
update:val buf = new ListBuffer[String] buf ++= List("Paris","Madrid","Londres") buf.update(1,"Barcelona")
Estructuras de control
- Secuencia
- Selección
- Iteración
Veremos principalmente Scala, aunque añadiremos algún ejemplo de Scheme
Secuencia
- Scheme
(define x 3) (define y 5) (define (cambia-vars a b) (set! x a) (set! y (+ a b x)) (+ x y))
- Scala
var x=3 var y=5 def cambiaVars(a: Int, b: Int) = { x=a y=a+b+x x+y }
Selección if
- La sentencia
ifde Scala devuelve el resultado de la última expresión evaluadaval filename = if (!args.isEmpty) args(0) else "default.txt" println(filename)
Sentencia match
- Con efectos laterales
def pruebaMatch(str: String) = { str match { case "salt" => println("pepper") case "chips" => println("salsa") case "eggs" => println("bacon") case _ => println("huh?") } } - Devolviendo un valor
def pruebaMatch2(str: String): String = { str match { case "salt" => "pepper" case "chips" => "salsa" case "eggs" => "bacon" case _ => "huh?" } }
Lenguajes y Paradigmas de Programación
Curso 2010-2011
Departamento de Ciencia de la Computación e Inteligencia Artificial
Universidad de Alicante
Sitio web realizado con org-mode y el estilo CSS del proyecto Worg