1 / 23

Agenda Clase 11

Agenda Clase 11. Parametrización. Pasaje de parámetros (modos). Razones de escogencia entre modos. Clausuras como parámetros. Etiquetas, Conformat Arrays, Parámetros por Default, Parámetros Nombrados. Número Variable de Argumentos. Retorno de Funciones. Módulos y Subrutinas Genéricas.

kiley
Download Presentation

Agenda Clase 11

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Agenda Clase 11 • Parametrización. • Pasaje de parámetros (modos). • Razones de escogencia entre modos. • Clausuras como parámetros. • Etiquetas, Conformat Arrays, Parámetros por Default, Parámetros Nombrados. • Número Variable de Argumentos. • Retorno de Funciones. • Módulos y Subrutinas Genéricas. • Casos de Estudio.

  2. Parametrización • Subrutinas parametrizadas  toman argumentos que controlan aspectos de su comportamiento o especifican los datos sobre los que operan. • Parámetros Formales: aparecen en la declaración de la subrutina. • Parámetros Actuales: variables y expresiones que son pasadas a la subrutina en el momento de la invocación.

  3. Pasaje de Parámetros (Modos) • Por Valor: cada parámetro actual es asignado en el parámetro formal correspondiente cuando una subrutina es llamada. • Por Referencia: cada parámetro formal es un alias del parámetro actual correspondiente.

  4. Razones para escoger un modo • Si la subrutina invocada debe cambiar el valor del parámetro actual  pasaje por referencia. Por valor en caso contrario. • Nivel extra de indireccionamiento que requiere el pasaje por referencia suele ser menos costoso que copiar el valor cuando los parámetros son grandes.

  5. El Modo READONLY de Modula 3 • Combina la eficiencia del pasaje por referencia y la seguridad del pasaje por valor. • Impide que los parámetros formales sean alterados por la rutina invocada.

  6. Modos de Parámetros en Ada • IN: pasan información de la subrutina invocadora a la invocada que puede ser leída por ésta pero no modificada. • OUT: pasan información del invocador al invocado. Ada 83 permite escribir pero no leer, Ada 95 permite escribir y leer. • IN-OUT: pasan información en ambas direcciones que puede ser leída y escrita.

  7. Referencias en C++ • Introduce una noción explícita de referencia. • Los parámetros referenciados se especifican precediendo su nombre con un ampersand (&) en la declaración de la función. void swap (int &a, int &b) {int t=a; a=b;b=t;}

  8. Referencias en C++ • Cualquier variable puede ser declarada para ser una referencia. int i int &j=i j es un alias de i i=2 j=3 cout << i imprime 3

  9. Clausuras (clousures) pasadas como parámetros • Clausura: referencia a una subrutina + su contexto. • Se utiliza para pasar subrutinas como parámetros, como en el siguiente ejemplo en Pascal. procedure apply_to_A(function f(n:integer): integer, var A array [low..high:integer] of integer) var i integer; begin for i:=low to high do A[i]:=f(A[i]); end;

  10. Llamada por nombre en Algol 60 • Es el caso por default para este lenguaje, aunque también admite por valor. • Se implementa a través de una subrutina oculta que evalúa el parámetro actual en el ambiente de referencia del invocador (denominada thunk). • Algol 68 eliminó este tipo de llamada por el costo que implica la invocación de un procedimiento thunk por cada parámetro formal.

  11. Etiquetas como parámetros • Algol 60 y 68 permiten que una etiqueta sea pasada como parámetro. • Pej: permite saber a dónde debe saltarse cuando se produce el escape de la rutina que se está ejecutando a través de una sentencia go to.

  12. Parámetros de propósito especial: Arreglos Abiertos (Conformant Array) • Arreglo que es un parámetro formal y cuyo tamaño es determinado a tiempo de ejecución (en un lenguaje que habitualmente determina la forma a tiempo de compilación). • Se pueden definir arreglos de este tipo en Pascal, Modula-2 y C.

  13. Parámetros por Default • Parámetros que no necesariamente deben ser provistos por el invocador ya que al no poseerse se utiliza un valor preestablecido. • Uso común: rutinas de librerías I/O. • Utilizado por Ada, C++, Common Lisp y Fortran 90.

  14. Parámetros Nombrados (Named Parameters) • Parámetros posicionales  los parámetros actuales en una posición determinada corresponden a los parámetros formales definidos en la misma posición. • Parámetros nombrados (parámetro acompañado por su nombre formal) pueden ser utilizados en cualquier posición. put (item => 37, base =>8) put (base=>8, item=>37)

  15. Número variable de argumentos • C, C++ y Lisp permiten definir rutinas con número variable de argumentos. int printf(char * format, ...) • En C y C++ los argumentos no especificados son accedidos a través de macros estándar. Indica que hay parámetros adicionales en número y tipo desconocido.

  16. Ejemplo en C con número variable de argumentos. #include <stdarg.h>inclusión de librería (macro) para poder acceder a los argumentos no especificados. int printf(char * format, ...) { va_list args; va_start(args, format); ... char cp=va_arg(args, char); ... double dp=va_arg(args, double); ... va_end(args); } printf(%c, “hola”)  va_args(args, char)

  17. Retorno de Funciones • En Algol 60 y Fortran deben retornar un escalar. • Pascal y primeras versiones de Modula-2 - escalar o apuntador. • Algol 68, Ada, C y algunas implementaciones de Pascal  permiten retorno de valores de tipo compuesto. • Lisp, ML, Modula 3 y Ada 95  permiten retorno de una subrutina implementada como clausura. • C permite retornar un apuntador a subrutina (no posee clausura ya que no permite anidamiento)

  18. Retorno de Funciones type int_array is array (integer range <>) of integer; function A_max (A:int_array) return integer is rtn: integer; begin rtn:=integer'first; for i in A'first..A'last loop if A(i) > rtn then rtn:=A(i); enf if; end loop; return rtn; end A_max;

  19. Retorno de Funciones • En SR: procedure A_max(ref A[1:*]:int) returns rtn:int rtn :=low(int) fa i:= 1 to ub(A) -> if A[i]>rtn -> rtn:=A[i] fi af end fa indica “for all” bu indica “upper bound” -> indica “do then”

  20. Módulos y Subrutinas Genéricas • Polimorfismo  permite declarar subrutinas en la que los tipos de los argumentos no se encuentran completamente especificados  se ahorra el trabajo de escribir varias veces el mismo programa dependiendo de los argumentos que reciba...pero posee algunas desventajas. • Alternativa  crear facilidades genéricas.

  21. Módulos y Subrutinas Genéricas • Útiles para la creación de containers. • Los lenguajes que proveen estas facilidades son Clu, Ada (Generic Program Units), C++ (templates) y Modula-3. • Siguen un mecanismo estático ya que todo lo que requieren puede ser resuelto a tiempo de compilación.

  22. Módulos y Subrutinas Genéricas • Pueden producir un efecto similar al pasaje de subrutinas en lenguajes donde no esté permitido (como Ada). generic type item is private; type item_array is array (integer range <>) of item; with function F (it: in item) return item; procedure apply_to_array(A: in out item_array); procedure apply_to_array((A: in out item_array) is begin for i in A'first..A'last loop A(i) := F(A(i)); end apply_to_array;

  23. Módulos y Subrutinas Genéricas • Dado que una unidad de programa genérico es una abstracción, es importante que su interfaz (cabecera de la declaración) provea toda la información que debe ser conocida por el usuario de la misma. • Clu y Ada refuerzan la regla anterior obligando que las funciones sean explícitamente declaradas. • En C++ y Modula-3 por el contrario se pueden aplicar operaciones de forma arbitraria aunque esto producirá error semántico estático.

More Related