Se una variabile contenente una funzione ha restituito la funzione anziché un riferimento alla funzione, cosa restituisce una matrice di funzioni? [chiuso]

0

Sto creando un linguaggio di scripting prototipo simile a qualcosa di simile a Javascript. Nella mia lingua, ogni singolo riferimento a una variabile è in realtà una chiamata di funzione (una funzione getter), che abbia parentesi o meno. Ad esempio, se fai questo:

var foo = 3;
var bar = foo;

Ciò che realmente accade è che foo.set () viene chiamato sulla prima riga, che crea una nuova funzione getter. Nella seconda riga, viene chiamata la funzione getter appena creata per foo, che assomiglia a questo:

foo.get()
{
    return 3;
}

Posso anche assegnare una funzione a una variabile, nel qual caso quella funzione DIVENTA la funzione getter.

var foo = 
{
    return 4+5;
}
var bar = foo; // bar is now equal to the number 9, NOT the function that foo contains

Quindi quello su cui sto lavorando ora è quello che dovrebbe restituire una serie di funzioni. Ad esempio:

function func1
{
    return 1;
}
function func2
{
    return 2;
}

var foo = new array();
foo.push(func1);
foo.push(func2);

var bar = foo; //what does bar contain? [func1, func2] or [1, 2]?

Un riferimento a una singola funzione esegue quella funzione e restituisce la funzione. Quindi sto cercando di decidere se un riferimento a una serie di funzioni dovrebbe anche eseguire quelle funzioni, o se sarebbe più vantaggioso restituire semplicemente l'array di funzioni.

In altre parole, la funzione getter per foo dovrebbe essere simile a questa:

foo.get()
{
    return [func1.reference, func2.reference]; //would return [func1, func2]
}

O come questo:

foo.get()
{
    return [func1(), func2()]; //would return [1, 2]
}

In particolare, sto chiedendo se qualcuno sa se ci sono problemi o soluzioni che un metodo o l'altro creerebbe? Esistono regole stabilite per una buona progettazione del linguaggio di programmazione che si applicano qui?

    
posta dallin 22.02.2014 - 00:29
fonte

1 risposta

2

Utilizza il primo approccio. A meno che la tua lingua sia puramente funzionale, il secondo approccio può avere risultati strani. Ad esempio:

var x = 0;
function func
{
    return x;
}
var arr = new array();
arr.push(func);
var arr2 = arr;
x = 1;
print(arr[0]()); // prints "1"
print(arr2[0]()); // prints "0"

o

function func
{
    print("hello");
}
var arr = new array();
arr.push(func);
var arr2 = arr; // prints "hello"

PS: sei sicuro di voler costruire un nuovo array ogni volta che leggi una variabile di matrice?

    
risposta data 22.02.2014 - 01:51
fonte