Cette dernière difficulté se présente selon deux aspects :
On peut se placer dans une situation où beaucoup de paramètres sont définis et peu d'entre eux sont instanciés. Ceci ne révélera pas toujours une situation d'erreur : on peut définir un cas très général dont chaque instance ne s'intéresse qu'à une faible partie. Ce serait le cas par exemple d'un outil de gestion de base de données : chaque élément de la base de données ne définit qu'un nombre restreint de champs.
La solution en l'état se présente sous la forme :
(lsp
(if (egal (use txt) "{txt}")
(rep ...indéfini...)
(rep ...défini...)))
qui répond à la question, parce qu'on a la connaissance de la forme évaluée d'une utilisation indéfinie (ici : "{txt}"). Pour une expression plus concise, on peut alors introduire un nouvel opérateur.
opérateur : opt
ATM ::= ATM opt
opt -> NOM ENV REP REP
opt est défini sur le phylum ATM : il recherche le nom NOM dans l'environnement local ENV :
- s'il le trouve il évalue la première représentation REP,
- sinon il évalue la seconde.
En annexe on donne, avec l'utilisation de l'opérateur optionnel, le schéma de décompilation d'un champ complexe d'une base de données.