2010-07-25 18 views
8

Nei miei principi di programmazione, stiamo parlando di diversi metodi di chiamata. Alcune abbiamo discusso erano:Esempio di chiamata per nome

  • chiamata per valore
  • chiamata per riferimento
  • chiamata per valore/risultato
  • e chiamata per nome

non riesco a trovare un esempio di come funziona la chiamata per nome. Qualcuno vuole darmi un esempio? Penso che quando si prende un file xml come input questo è simile a da chiamare per nome. Qualcuno potrebbe darmi un esempio più tradizionale?

+0

non so di eventuali esempi moderni di chiamata per nome. È stata una pessima idea in ALGOL 60 e dubito che sia cambiato. –

+0

Che tipo di esempio stai cercando? Un esempio di un linguaggio che utilizza la denominazione per nome o un esempio di cosa sarebbe la valutazione di un'espressione utilizzando la denominazione per nome? – sepp2k

+1

@ sepp2k, entrambi potrebbero essere utili. Non ne sono sicuro, ma da quello che ho capito finora sembra un'idea quasi morta (correggimi se sbaglio) ma è inclusa nel materiale del corso (forse solo per ragioni storiche?) – sixtyfootersdude

risposta

9

Lavorerò in un ipotetico linguaggio di programmazione. Supponiamo di avere una funzione p(x) che stampa x e quindi la restituisce. Ora definiamo una funzione:

function foo(x, y) { return y+1; } 

ora chiamiamolo con alcuni argomenti:

foo(p(123),p(456)) 

x e y stanno per essere sostituiti per i parametri, quindi la chiamata a foo sopra sta per tradursi in:

return p(456)+1; 

Quindi stiamo andando a stampare 456 alla schermata e tornare 457. in un'altra strategia di valutazione, avremmo condotta in base prima i parametri della funzione (stampando 123 e 456 sullo schermo nel processo) e poi sostituisci 456 per nel corpo della funzione, restituendo alla fine 457.

È idea, ma spero che tu abbia l'idea. Si tratta di sostituzione.

+0

quindi chiamerei per il nome chiama anche la chiamata per riferimento? valore? Qualcosa di specifico? – sixtyfootersdude

+0

@sixtyfootersdude, quella frase mi ha fatto male al cervello. Cura di ri-dichiararlo? – Gian

+0

Sicuro. Diciamo che hai questo (** Call by name **): 'int x = 0; foo (t (x)); print (x); 'se fosse * anche *" call by value "questo verrebbe stampato 0. Se fosse * anche *" call by reference "potrebbe * stampare qualcos'altro. – sixtyfootersdude

2

http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_name

In chiamata per valore, si valutano gli argomenti, il recupero di valori che vengono poi passati alla funzione. foo(bar()) viene valutata come arg = bar();, allora foo (arg) è chiamato, e nel corpo della funzione, questa variabile arg appena allocata è accessibile, modificabile, ...

In chiamata per nome, si succedanei nel corpo della funzione qualsiasi riferimento a argomenti dal loro codice utilizzato durante la chiamata. Quindi, valutando il corpo, valuterete gli argomenti. foo(bar()) con foo(arg) { return arg; } sarà valutata come foo(arg) { return bar(); }

1

Chiamata nominale lavoro chiamata per riferimento quando il parametro effettivo essere ablatore, ma essere diversa quando il parametro attuale è espressione o matrice parametro allora effettivo è re -valutato su ogni accesso.

qui è semplice esempio

begin 
    integer n; 
    procedure p(k: integer); 
     begin 
     print(k); 
     n := n+1; 
     print(k); 
     end; 
    n := 0; 
    p(n+10); 
    end; 
  • chiamata in uscita value => 10 10
  • chiamata in uscita name => 10 11
+0

ho visto questo esempio altrove, dovresti citare –