Il codice seguente non funziona, b/c JSL valuta emptyVar quando provi a passarlo alla funzione invece di valutarlo in fase di esecuzione nella funzione.
isEmptyTest = Function({var},
return(isempty(var));
);
isEmptyTest(emptyVar);
Sarebbe fantastico se questo fosse cambiato.
Sì, stavo cercando di usarlo per il caso 1. Stavo costruendo uno strumento che sfruttasse un file di configurazione utente. Poiché le variabili vengono caricate dal file definito dall'utente, potrebbero esistere o meno e potrebbero essere impostate o meno su vero/falso. Speravo di creare semplicemente una funzione wrapper che lo testasse finché non mi sono reso conto che poteva fare un'istruzione "o" poiché esce una volta raggiunta una verità.
if(isempty(var) | !var,
//run code)
);
Questo non genera errori b/c se la variabile non è stata ancora dichiarata, segnalerà una verità e passerà all'esecuzione del codice nell'istruzione if senza controllare le altre dipendenze. Se la variabile è stata definita, posso verificare se è vera o no.
Una tabella dei simboli tiene traccia di tutte le variabili che siano mai esistite impostato ad un valore. Se una variabile non è mai stata impostata, non è inizializzata e il suo utilizzo costituisce probabilmente un errore.
L'incasso è vuoto() la funzione crea casi speciali da diverse situazioni insolite.
Caso 1 : variabile mai utilizzata prima
Is Empty(neverSeenBefore) = 1;
print(neverSeenBefore)
/*:
Name Unresolved: neverSeenBefore in access or evaluation of 'neverSeenBefore' , neverSeenBefore/*###*/
Nome irrisolto significa che JMP ha esaminato la tabella dei simboli e non è riuscito a individuare il nome.
Caso 2 (caso normale): variabile impostata sul valore restituito dall'integrato vuoto() funzione o un'altra funzione che ha restituito vuoto()
ev=empty(); show(isempty(ev),ev);
/*:
Is Empty(ev) = 1;
ev = Empty();
Se prevedi di eseguire il test per vuoto, dovresti utilizzare il file vuoto() funzione per inizializzare le variabili.
Caso 3 : variabile cancellata dal built-in cancella globali() funzione
ev2=42; clear globals(ev2); show(isempty(ev2),ev2);
Is Empty(ev2) = 1;
ev2 = ev2;
Utilizzando cancella globali() non è una buona idea nel codice di produzione, ma può essere utile durante lo sviluppo del codice. NON rimuove il simbolo dalla tabella dei simboli ma ne rimuove il valore, senza nemmeno lasciare vuoto() per il valore. Potrebbe comportarsi come vuoto() o mancante, a seconda di come viene utilizzato.
JSL passa gli argomenti alle funzioni scritte dall'utente in base al valore, creando una copia affinché la funzione possa utilizzarla. Una versione futura di JMP potrebbe consentire il passaggio di argomenti per riferimento. A quel punto vedremo cosa succede passando variabili non inizializzate per riferimento.