You are on page 1of 13

Mecanismo de Pasaje de

Parametros
Por

referencia
Por value
Por valor-resultado
Por nombre
Por necesidad

Llamada por referencia


La

identidad (direccin, si es una variable) de una


entidad del lenguaje se pasa al procedimiento
Este mtodo se usa en Oz
Si es especifico a variables, se suele llamar
Llamada por variable
Llamada por direccion
Llamada por posicion

Cambion

en el parametro forma afectan a la variabe

afuera
Aliasing: puede que sea dificil de razonar sobre
programas, cuando el modelo no es declarativo

Aliasing tambien puede ocurrir con punteros.

Problema con Alias


Ejemplo:

Procedimiento Swap

void swap(int& x, y){


x = x + y;
y = x - y; // y now holds the original value of x
x = x - y; // x now holds the original value of y
}
swap(x,y)
swap(x,x)

No

es un problem en el modelo declarativo --Por que?

Llamada por Valor


El

valor de la entidad en el lenguaje se pasa al


procedimiento
Se implementa
Copiando el valor
Pasando una referencia, perosin permitir que el
procedimiento la cambie.

El

mecanismo en C++, Java, Pascal


El unico mecanismo en C y Scheme
Copias superficiales en estructuras compuestas
Asociado con evaluacin estricta

Pro y Contras de
por-referencia vs por-valor
Modularidad
Eficiencia

Llamada por valor-resultado


Intenta

tener los beneficios de llamada por referencia


(efectos secundarios en los argumentos) sin los
problemas de aliasing.
Hace una copia en los argumentos al principio, copia
las variables locales a los argumentos actuales al
final del procedimiento. Asi los argumentos son
modificados.
Se comporta como llamada por referencia sin la
presencia de aliasing
Cuidado: el comportamiento depende del orden en
que las variables locales se copian.
Usado por BBC BASIC V.

Llamada por valor-resultado


local A={NewCell 3}
proc {P X Y}
Y:=5
X:=4
end
in {P A A}
{Browse A}
end
El

El cdigo no es valido en Oz,


estamos suponiendo un lenguaje
que soporte este pasaje de
parmetros.

resultado depende del orden en que las variables


auxiliares se copian en los parametros.

Llamada por nombre


Los

parametros formales son ligados a los


argumentos actuales sin evaluar.

La expresion se usa como los parametros.


Con el ambiente del que llama (para evitar problemas de
scoping)

Los

argumentos son evaluados cada vez que el


paremetro formal se usa.

declare A = 3
proc {P X} X:=4 end
in {P A}
A end

declare
A=3
B=4
proc {P X}
A:= 4
X end
in {P A+B}

Call by name (3)


Example

using cells

declare
proc {Sqr A}
{A}:=@{A} * @{A}
end
local C={NewCell 5}
{Sqr fun {$} C end}
{Browse @C}
end

Call by need
Variation

on call-by-name where evaluation of formal


parameter is memoized after the first usage
Same result as call-by-name (and more efficient!) if
there are no side-effects
Same concept as lazy evaluation in declarative model
declare
A=3
B=4
proc {Cube X} X*X*X
in {Cube A+B}

declare
A=3
B=4
fun {P X}
A:= X
X end
in {P A+B}

Discussion
Is

there one parameter passing mechanism that is


right or best?
Call-by-value is most common
Oz uses call-by-reference because its goal is to
factorize programming languages into a small set of
programmer-relevant concepts
Call-by-reference underlies the other mechanisms
Does not require cells or procedure values
Simple formal semantics
Efficient to implement
Other behaviors can be achieved manually

Challenge: What is the output?


declare A=3 B=4 C=1
proc {P X Y Z}
C=5
X=Z
C=4
Y=Z+A
end
in {P A B A+C}
{Browse B}

Call by value?
Call by reference?
Call by valueresult?
Call by name?
Call by need?

2
4
6
7
8
10
12
16
20

Challenge: What is the output?


declare A=3 B=4 C=1
proc {P X Y Z}
C=5
X=Z
C=4
Y=Z+A
end
in {P A B A+C}
{Browse B}

Call by value? 4
Call by reference? 8
Call by value-result? 7
Call by name? 20
Call by need? 16

You might also like