Paradigmas de Lenguajes de Programación Smalltalk (Parte II) 1 er cuatrimestre de 2007.

Slides:



Advertisements
Presentaciones similares
IfTrue- ifFalse Sea el mensaje: ifTrue: bloque1 ifFalse: bloque2 enviado tanto para true como para false, donde las variables bloque1 y bloque2 son bloques.
Advertisements

Estructuras de control
En PHP, casi cualquier cosa que escribes es una expresión. La forma más simple y ajustada de definir una expresión es "cualquier cosa que tiene un valor".
Archivos de Texto. Introducción Los archivos son una secuencia de bits que se guarda en el disco duro. La ventaja de utilizar archivos es que los datos.
Programación Básica con NQC Pedro F. Toledo – Patricio Castillo 18/08/2006.
Unidad 1 DISEÑO DE ALGORITMOS ING. Nelwi Baez. MSC
Te presento a Python Qué es Python? Lenguaje interpretado
PHP-MYSQL OPERADORES EN PHP
DIAGRAMAS DE FLUJO Y PSEUDOCÓDIGO
Desarrollo de Aplicaciones para Internet
Presentación Asignatura POF030 Semana 1. Contenido En forma general, los conceptos que se estudiarán en la asignatura son: – Procedures – Functions –
DIAGRAMAS DE FLUJO Y PSEUDOCÓDIGO
Informática II Prof. Dr. Gustavo Patiño MJ
1.2 Sintaxis del lenguaje Java.
ALGORÍTMICA Dpto. Ingeniería de Sistemas y Automática
Preguntas tipo test (Tema I)
Una breve introducción
CI TEORIA semana 8 Subprogramas o funciones Definición de funciones.
Métodos Algoritmos y Desarrollo de Programas I. Cuando utilizar métodos  Los métodos se utilizan para romper un problema en pedazos de forma que este.
PL/SQL Francisco Moreno Universidad Nacional.
TRAMPAS EN EL DISEÑO DE LENGUAJES CON RELACIÓN A LOS NOMBRES - REGLAS DE ALCANCE - COMPILACIÓN POR SEPARADO CONTROL DE FLUJO - EVALUACIÓN DE EXPRESIONES.
Tema 6: Clases Antonio J. Sierra.
Al término de la clase, el alumno reconoce las ventajas de usar JAVASCRIPT para un proyecto web.
Tema 4: Sentencias de control
Ingeniero Anyelo Quintero
Operadores de comparación en PHP Programación en Internet II.
ESTRUCTURAS DE CONTROL
UNIVERSIDAD DE MANAGUA I CUATRIMESTRE INTRODUCCION A LA PROGRAMACION
Programación de Computadores
Semana 5 Subprogramas..
Clase de Repaso Resolución ejercicios de parcial Paradigma Lógico y Objetos.
Matrices Es una estructura homogénea, compuesta por varios elementos, todos del mismo tipo y almacenados consecutivamente en memoria A cada elemento se.
Conversión cadena a número
ESTRUCTURA DE DATOS EN JAVA
SENTENCIAS DE CONTROL Ing. José Antonio Poma G..
Sentencias de selección
Tablas de verdad en PHP Programación en Internet II.
Informática Ingeniería en Electrónica y Automática Industrial
Estructura de Control Repeticiones(Loops) Ejercicios
Estructuras de Control.
Programación Básica con “NQC” Pedro F. Toledo – Patricio Castillo 18/08/2006.
Objetivo Mostrar los fundamentos de la programación a través de ejemplos y prácticas utilizadas cotidianamente en el desarrollo de aplicaciones.
COMPUTO III Ing. Jimmy Ojeda Arnica.
ELEMENTOS DE COMPUTACIÓN Profesor: Guillermo Figueroa
Patricio A. Castillo José M. Galarce Agosto 23 de 2008 Segunda Clase.
© Mark E. Damon - All Rights Reserved Subject 1 Subject 2 Subject 3 Subject 4 Subject 5 Subject 6 $100 $200 $300 $400 $500 Round 2 Final Jeopardy Scores.
Programación Básica con NQC Patricio A. Castillo 12/04/2008.
Ing. Johanna Macias Algoritmo, Estructura y Programación III.
PHP el Lenguaje Ejercicios Básicos.
Se pueden incluir comentarios en cualquier parte de un programa pero deben delimitarse con llaves o con paréntesis y asterisco:
“variables , sentencia if y bucles”
Fundamentos de Programación
Práctica Profesional PHP.
Introducción al lenguaje PROCESSING para ARDUINO
Estructuras de Decisión
Programación de Computadores
Manual PHP Básico Camilo Cartagena.
Lenguaje de Programación LISP
 Las funciones son un conjunto de instrucciones que realizan una tarea específica. En general toman unos valores de entrada, llamados parámetros y proporcionan.
PROGRAMACIÓN Grupo de Modelamiento de Sistemas
Décimo Curso de Programación Básica con NQC “Segunda Clase” Cristián Arenas Ulloa Agosto 29 de 2009.
Ciclos en Visual Basic Yaimira Pérez. Los ciclos son estructuras de repetición que ejecutan una o varias instrucciones durante la cantidad de veces que.
Factorías e Iterables Introducción del concepto de patrón de diseño Construcción de tipos para recorridos con for extendido Fundamentos de Programación.
Estructuras de control selectivas Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión Práctica 3.
Prof. Jonathan Silva Ingeniería Civil – Informática I Ingeniería Civil Informática I Clase 5.
Las interfaces Predicate y Function Versión Unidad Didáctica 17 Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos.
Prof. Manuel B. Sánchez.  El origen del término polimorfismo es simple: proviene de las palabras griegas poly (muchos) y morphos (forma) multiforme.
U niversidad de G uadalajara Centro Universitario de Ciencias Exactas e Ingenierías Ponentes: Muñoz Guzmán Ramón Gallardo Olivares Mario Solís Flores José.
Tipos genéricos Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Unidad Didáctica 3.
Paradigmas de Lenguajes de Programación
Transcripción de la presentación:

Paradigmas de Lenguajes de Programación Smalltalk (Parte II) 1 er cuatrimestre de 2007

Anteayer nomás... Un objeto consta de una representación interna y un protocolo. En Smalltalk todo es un objeto. Por ejemplo el número 10. La cadena 'hola, soy una cadena'. El valor booleano true. El transcript donde se trabaja. El código del programa que escribo. O sea... ¿todo es un objeto? ¡Sí! Todo, todo.

Anteayer nomás... También tenemos variables, las cuales pueden referenciar objetos. Por ejemplo: unaFrase := 'Ser o no ser...' 'Ser o no ser...' String unaFrase

Anteayer nomás... Los objetos interactúan entre sí a través del envío de mensajes. Los mensajes pueden ser unarios, binarios o keyword. PersonaCafetera encender

Todo muy lindo, pero... ¿Cómo hago algo útil con todo esto? Empecemos por un ejercicio fácil. Escribir un fragmento de código que evalúa la variable x y si es igual a cero imprime ‘Cero’ en el transcript. Parecería que necesitamos algún tipo de estructura de control condicional if.

Condicionales en Smalltalk En los lenguajes de programación imperativos existen, como parte del lenguaje, estructuras de control de flujo: If (condición) { sentencias } ¿Pero cómo hacemos esto en Smalltalk donde todo es un objeto? ¿Ideas?

¿Qué tal esta alternativa? [codigo] executeIf: condicion No nos sirve. ¿Por qué? Porque el objeto que recibe el mensaje no tiene forma de verificar si el booleano que recibe es efectivamente true porque necesitaría un if… Y eso es precisamente lo que estamos intentando implementar.

¿Qué tal esta otra? condicion ifTrue: [codigo] Es lo mismo pero ahora el receptor del mensaje es el booleano. ¿Cambia algo? Sí, porque podemos utilizar el polimorfismo que nos provee este paradigma para desviar el flujo de control. ¿Y cómo hacemos esto?

Booleanos La condición es un objeto de la clase Boolean Tiene subclases True y False, cada una con una única constante, true y false respectivamente. Cada vez que evaluamos una expresión booleana en Smalltalk el resultado es una de estas dos constantes. Boolean TrueFalse

condicion ifTrue: [sentencias]. ¿Cuál es el parámetro? Un bloque de código, perteneciente a la clase BlockClosure. (Recordar: ¡Todo es un objeto!) Los bloques pueden tener parámetros o no: [Transcript show: ‘Hola’.] [:x :y | x == 10 + y.] Se ejecutan enviándoles el mensaje value, que puede ser unario para el caso de bloques sin parámetros o keyword con tantos parámetros como el bloque tiene.

Bloques Ejecutando (evaluando) bloques: [Transcript show: ‘Hola’.] value. Imprime la cadena ‘Hola’ en el transcript. [:x :y | x == 10 + y.] value: 21 value: 11. Devuelve true. Los bloques pueden tener variables locales: miBloque := [:i | |z| z := i. z := z * z. z + 1.] Devuelven el resultado de la última sentencia: miBloque value: 2. devuelve 5

¿Cómo está implementado el if? Recordar, Boolean tiene dos subclases. Clase True, método ifTrue: unBloque Ejecuto el bloque: unBloque value. Clase False, método ifTrue: unBloque No hago nada.

¿Entoces el ejercicio…? Escribir un fragmento de código que evalúa la variable x y si es igual a cero imprime ‘Cero’ en el transcript. x == 0 ifTrue: [Transcript show: ‘Cero‘.].

Más de boolean condicion ifFalse: [sentencias] condicion ifTrue: [sentencias 1 ] ifFalse: [sentencias 2 ] booleano 1 & booleano 2 booleano 1 | booleano 2 booleano and: [sentencias] Evalua el bloque y al resultado le aplica and con el booleano. booleano or: [sentencias] Evalua el bloque y al resultado le aplica or con el booleano.

Otro ejercicio Escribir un bloque de código que tome un parámetro y al ser evaluado (en un entero positivo) imprima en el transcript todos los números desde el 0 hasta el que recibió. Parece que ahora necesitamos algún tipo de estructura de control que nos permita iterar.

m to: n do: [:actual | sentencias] La clase Integer acepta un mensaje to:do: Espera otro entero y un bloque con un parámetro. Evalúa el bloque usando como parámetro cada entero entre m y n. ¿Entonces el ejercicio…? [:limite | 0 to: limite do: [:actual | Transcript show: actual displayString ; cr. ]. ]

Otras formas de iterar m to: n by: step do: [:actual | sentencias] Igual pero incrementando de a step en cada paso. m timesRepeat: [sentencias] Repite m veces el bloque sentencias. [condicion] whileTrue: [sentencias] Ejecuta sentencias mientras la evaluación de condicion sea true. ¿Por qué no usar un Boolean? [condicion] whileFalse: [sentencias] Análoga a la anterior.

Igualdad Smalltalk puede verificar dos tipos de igualdades entre objetos. Igualdad estricta: a = b es true si a y b son la misma instancia. Igualdad semántica (o equivalencia): a == b es true si a y b son equivalentes según alguna relación que debe ser implementada para cada clase. a ~= b sería (a = b) not a ~~ b sería (a == b) not

Colecciones en Smalltalk Smalltalk ofrece una amplia variedad de tipos de colecciones que podemos usar según la necesidad del caso: ¿Elementos ordenados? ¿Se admiten duplicados? Etc. Tener en cuenta que las colecciones son heterogéneas, siempre se admiten elementos de tipos diversos.

Colecciones, colecciones, …

Algunas operaciones básicas (I) Array at: at:put: size a := #( ) copy. a at: 1. a at: 2 put: ‘dos’. a size Set add: size includes: s := Set new. s add: 1; add: 1; add: 2. s size. s includes: 4. Bag add: size includes: occurrencesOf: b := Bag new. b add: 1; add: 1; add: 2. b size. b includes: 1. b occurrencesOf: 1. Dictionary at:put: at: includes: (contiene valor) includesKey: (contiene clave) size keys d := Dictionary new. d at: 'hola' put: 'hello'. d at: ‘hola'. d includesKey: 'loro'.

Algunas operaciones básicas (II) Interval includes: in := Interval from: 3 to: 30 by: 5. in includes: 4. in includes: 8. Ordered Collection add: at: at:put: first last addFirst: addLast: removeFirst: removeLast: indexOf: oC := OrderedCollection new. oC add: 3; add: 2; add: 5. oC add: 4 after: 2. Sorted Collection add: sortBlock: x := SortedCollection new. x add: 3; add: 2; add: 5. x sortBlock: [:a :b | a >= b].

Operaciones para todas las collections (I) do: [:actual | sentencias] Evalúa el bloque en cada uno de los elementos de la colección. select: [:actual | sentencias] El bloque debe retornar un valor booleano. Se devuelve otra colección (del mismo tipo de la receptora) conteniendo únicamente los elementos para los cuales la ejecución del bloque da true. reject: [:actual | sentencias] Análoga a la anterior pero guardando los elementos que hacen al bloque false. collect: [:actual | sentencias] Se devuelve otra colección (del mismo tipo de la receptora) conteniendo los resultados de la aplicación del bloque a cada elemento de la colección receptora.

Operaciones para todas las collections (II) detect: [:actual | sentencias] El bloque debe retornar un valor booleano. Se devuelve el primer elemento de la colección que hace al bloque evaluar en true. En caso de que todos evalúen el bloque en false se genera un error en tiempo de ejecución. detect: [:actual | sentencias 1 ] ifNone: [sentencias 2 ] Igual a la anterior, pero en caso de no encontrar ningún elemento que haga al bloque ser verdadero, se evalúa el segundo bloque y no se genera un error. inject: casoBase into: [:resParcial :elemActual | sentencias] El primer parámetro del bloque es el resultado parcial de la operación, comenzando por casoBase. El segundo parámetro es el elemento actual de la colección receptora. Se devuelve el resultado de la última evaluación

Ejercicio de colecciones Agregarle a la clase Collection un método: selectAnyTwoOf: bloque 1 or: bloque 2 or: bloque 3 Donde los tres bloques tienen un parámetro y evaúan a Boolean. Debe devolver una nueva colección (del mismo tipo de la receptora) cuyos elementos son aquellos de la colección original tales que hacen valer true a exactamente dos de los bloques.

Ejercicio de colecciones: solución selectAnyTwoOf: bloque 1 or: bloque 2 or: bloque 3 ^self select: [:elem | |n| n := 0. (bloque 1 value: elem) ifTrue: [n := n + 1.]. (bloque 2 value: elem) ifTrue: [n := n + 1.]. (bloque 3 value: elem) ifTrue: [n := n + 1.]. n == 2. ].

Ejercicio de parcial Agregar en Smalltalk a la clase Collection el siguiente método: generateBlock: aBlockList Este método recibe una lista de bloques de un parámetro que evalúan a Boolean. Se debe devolver un nuevo bloque b de un parámetro que evalúa a Boolean tal que: b value:n es verdadero si y sólo si: b 1 value:n es True b 2 value:n es False b 3 value:n es True b 4 value:n es False … (valores de verdad intercalados) donde son todos los bloques de aBlockList que son satisfechos por al menos un elemento de la colección receptora.

Ejercicio parcial: solución generateBlock: aBlockSecuence |secuenciaFiltrada alter| secuenciaFiltrada := aBlockSecuence select: [:b | (self select: [:e | b value:e] ) size > 0]. alter := false. ^ secuenciaFiltrada inject: [:p | true] into: [:b :m | (alter := (alter not)). alter ifTrue: [ [:p | (b value: p) & ((m value: p) == true)] ] ifFalse: [ [:p | (b value: p) & ((m value: p) == false)] ] ].

¡Eso es todo! ¿? clase avisar: ‘eso es todo por hoy’