Le code ci-dessous ne fonctionne pas, b/c JSL évalue emptyVar lorsque vous essayez de le transmettre à la fonction au lieu de l'évaluer au moment de l'exécution avec la fonction.
isEmptyTest = Function({var},
return(isempty(var));
);
isEmptyTest(emptyVar);
Ce serait génial si cela était changé.
Ouais, j'essayais de l'utiliser pour le cas 1. Je construisais un outil qui tirait parti d'un fichier de configuration utilisateur. Étant donné que les variables sont chargées à partir du fichier défini par l'utilisateur, elles peuvent exister ou non et peuvent ou non être définies sur vrai/faux. J'espérais simplement créer une fonction wrapper qui testerait cela jusqu'à ce que je réalise qu'elle pouvait faire une instruction "ou" puisqu'elle se termine une fois qu'elle atteint une vérité.
if(isempty(var) | !var,
//run code)
);
Cela ne génère pas d'erreur car si la variable n'a pas encore été déclarée, elle signalera un Truthy et passera à l'exécution du code dans l'instruction if sans vérifier les autres dépendances. Si la variable a été définie, je peux vérifier si elle est vraie ou non.
Une table de symboles garde la trace de toutes les variables qui ont déjà été ensemble à une valeur. Si une variable n'a jamais été définie, elle n'est pas initialisée et son utilisation est probablement une erreur.
Le intégré est vide() La fonction crée des cas particuliers à partir de plusieurs situations inhabituelles.
Cas 1 : variable jamais utilisée auparavant
Is Empty(neverSeenBefore) = 1;
print(neverSeenBefore)
/*:
Name Unresolved: neverSeenBefore in access or evaluation of 'neverSeenBefore' , neverSeenBefore/*###*/
Nom non résolu signifie que JMP a regardé dans la table des symboles et n'a pas pu localiser le nom.
Cas 2 (cas normal) : variable définie sur la valeur renvoyée par le module intégré vide() fonction, ou une autre fonction qui renvoie vide()
ev=empty(); show(isempty(ev),ev);
/*:
Is Empty(ev) = 1;
ev = Empty();
Si vous prévoyez de tester le vide, vous devez utiliser le vide() fonction pour initialiser vos variables.
Cas 3 : variable effacée par le module intégré effacer les globales() fonction
ev2=42; clear globals(ev2); show(isempty(ev2),ev2);
Is Empty(ev2) = 1;
ev2 = ev2;
En utilisant effacer les globales() n'est pas une bonne idée dans le code de production, mais peut être utile lors du développement du code. Il ne supprime PAS le symbole de la table des symboles mais supprime sa valeur, sans même laisser vide() pour la valeur. Il peut agir comme empty() ou comme manquant, selon la façon dont il est utilisé.
JSL transmet les arguments aux fonctions écrites par l'utilisateur par valeur, créant ainsi une copie que la fonction doit utiliser. Une future version de JMP pourrait permettre de transmettre des arguments par référence. Nous verrons ce qui se passe en passant des variables non initialisées par référence à ce stade.