Domanda su type() di variabile dichiarata con expr()Ciao
Sto usando 'expr()' e ho alcune domande.
Farò domande in base al numero scritto nei commenti.
1) Si può considerare che eval() viene applicato quando c viene eseguito così com'è?
2) -
3) Perché Number appare quando viene selezionato il tipo di variabile c dichiarata come expr()?
Se type() esegue l'argomento, riconosce il tipo e visualizza il risultato, mi chiedo perché sia Expression in caso di 4).
4) -
a = 1;
b = 2;
c = expr(a + b);
c; // 1) Result : 3
print(c); // 2) Result : a + b
type(c); // 3) Result : Number
type(expr(a + b)); // 4) Result : Expression
Grazie 
SceneggiaturaRi: Domanda su type() della variabile dichiarata con expr()La cosa principale da tenere a mente è che Stampa() , Scrivere() e Spettacolo() trattano i loro argomenti in modo leggermente diverso rispetto alla maggior parte delle funzioni: decomprimono ma non valutano. così Stampa( c ) stamperà la cosa che c è -- è un'espressione. Tipo() decomprimerà quindi valuterà il suo argomento, quindi restituirà il suo tipo. Se vuoi Tipo() comportarsi più come Stampa() , quindi utilizzare Nome Espr() , come Tipo( Nome Espr( c ) )
Ri: Domanda su type() della variabile dichiarata con expr()Grazie @ErraticAttach
Capisco chiaramente quello che stai spiegando.
Tuttavia, ho una domanda per te.
Se Tipo () viene decompresso e valutato, quindi espr (a + b) viene valutato nel caso 4, se Number non deve essere restituito come valore di ritorno di Tipo () come nel caso 3?Nel processo di valutazione del tipo dopo la decompressione, l'elaborazione differisce a seconda che l'argomento sia specificato come variabile o funzione?
Ri: Domanda su type() della variabile dichiarata con expr()a = 1;
b = 2;
type( a + b );
"Numero"
Internamente, digitare ha ricevuto un albero delle espressioni che assomiglia ad add( a, b ). L'albero viene valutato in base a un numero.
a = 1;
b = 2;
type( expr( a + b ) );
"Espressione"
Internamente, digitare ha ricevuto un albero delle espressioni che assomiglia a expr( add( a, b ) ). Anche in questo caso, l'albero viene valutato; il nodo expr() nell'albero restituisce il suo argomento come espressione.
a = 1;
b = 2;
c = expr( a + b );
type( c );
"Numero"
Internamente, il tipo ha ricevuto un albero delle espressioni simile a c. Ancora una volta, viene valutato. c è un'espressione, add(a,b), che utilizzerà i valori correnti di aeb ogni volta che c viene valutato.c NON ha un nodo expr() nel suo albero.
"spacchettare" non è un'idea ben definita in JSL. Ogni funzione incorporata inizialmente vede i suoi argomenti come alberi delle espressioni. Alcune funzioni valutano i loro argomenti senza prima esaminarli. Altre funzioni non le valutano mai. Alcune funzioni cercano di vedere se il nodo radice dell'espressione è eval() o expr() o send() e fanno qualcosa di diverso. (send() è l'operatore <<. C'è un uso unario negli elenchi di argomenti per identificare argomenti speciali, spesso messaggi effettivi inviati a una casella di visualizzazione che viene creata.) L'aggiunta di un'espressione di formula a una colonna è un esempio che a volte mi fa inciampare; presuppone che l'argomento non debba essere valutato. L'aggiunta di eval() attorno alla formula fa sì che eval, perché formula(...) dà una sbirciatina all'argomento. L'alternativa sarebbe stata quella di valutare sempre l'argomento e quindi il caso d'uso normale richiederebbe expr() attorno alla formula (perché la valutazione di expr(...) restituisce semplicemente il suo argomento.)
Ri: Domanda su type() della variabile dichiarata con expr()Linguaggi come C e C++ valutano gli argomenti per le chiamate di funzione prima della chiamata. C e C++ non hanno un tipo di dati Expression perché le espressioni vengono compilate nel codice in fase di compilazione. Esecuzione più rapida, ma limita alcuni dei modi in cui puoi pensare di risolvere un problema.
JSL ha una funzione parse() che prende una stringa e la trasforma in un albero delle espressioni. La funzione eval() valuta l'albero. L'albero viene valutato automaticamente quando si accede come lato destro di un compito, a meno che non venga prestata particolare attenzione a sbirciare.Esiste una funzione nameExpr() che dovrebbe essere utilizzata solo se è necessario dare un'occhiata all'espressione memorizzata in una variabile senza valutarla accidentalmente. Per qualche motivo, perso nel tempo e forse troppo tardi per risolverlo ora, print/show/write sono stati scritti senza la chiamata per valutare i loro argomenti se l'argomento sembra essere una semplice variabile. Ok, all'epoca probabilmente sembrava un aumento di velocità perché c'è un po' di sovraccarico per eval(c) rispetto a ottenere il valore di c. Ma print(c+0) valuterà l'argomento, così come print(eval(c)), perché l'argomento non è una semplice variabile.
Ri: Domanda su type() della variabile dichiarata con expr()@Craige_Hales ha certamente ragione -- spacchettare non è un buon termine, ci scusiamo per la confusione!Il comportamento che stavo cercando di descrivere è tuttavia documentato: controlla questo link: https://www.jmp.com/support/help/en/15.2/index.shtml#page/jmp/expressions.shtml
Ecco il bit rilevante:
