2010-12-08 16 views
11

Técnicas de paso de parámetros:Diferencia entre llamada por nombre y llamada por referencia

Por lo que puedo deducir de estas dos técnicas.

la llamada por referencia:

La ubicación de la dirección de la variable se pasa a la función, tanto en el ámbito local de la función, cualquier cambio en el valor de la variable local va a cambiar el valor del original variable, ya que apuntan al mismo lugar.

llamar por su nombre:

La variable real se pasa a la función. Cualquier cambio en el valor de la variable dentro del alcance local de la función también se reflejará en el exterior de la función.

Me parece que estas dos técnicas de paso de parámetros logran lo mismo. Ambos actúan sobre los contenidos de las variables originales. ¿Tengo mis definiciones equivocadas? ¿Estoy pensando en esto de la manera incorrecta?

Respuesta

14

Llamar por nombre es ligeramente diferente de lo que usted describe. En pseudocódigo, imaginar:

function foo(index, value-increment) 
    sum = 0 
    loop index = 1 to 3 
     sum = sum + value-increment 
    return sum 

x = 3 
foo(x, 1/x) 

Si nuestra llamada foo es por referencia, el segundo argumento, 1/x, se evalúa sólo una vez que nos da de manera efectiva: 1/3 + 1/3 + 1/3. Es una evaluación estricta: cada argumento se evalúa por completo antes de aplicar la función.

Si llamamos por su nombre, 1/x no se evalúa estrictamente. En cambio, se evalúa en el ciclo según sea necesario. Efectivamente, el bucle se convierte en:

loop x = 1 to 3 
    sum = sum + 1/x 

o 1/1 + 1/2 + 1/3.

Eche un vistazo a thunks, aunque los thunk no siempre significan call-by-name. Haskell tiene la idea de thunks pero usa call-by-need donde 1/x no se evaluaría hasta que fuera necesario, pero luego se evaluaría solo una vez (sin mencionar que Haskell no tendría una variable de ciclo mutable).

Otros recursos:

+0

Esto es, con mucho, la mejor respuesta a esta pregunta (similar) que he encontrado. –

Cuestiones relacionadas