Études-Mathématique/Référence à l'objet entier dans lui-même

From Lazi wiki
Jump to: navigation, search

Question

Préambule

Utilisation actuelle des objets

  • Un objet est une fonction retournant un dictionnaire.
  • On transforme un objet x en dictionnaire par "recurse x", et un dictionnaire en objet par "constantF x"

Le problème

Dans un objet, on peut vouloir accéder à l'objet entier pour le modifier. Par exemple je voudrais définir le contexte mathématique M, et qu'une règle de déduction utilisant M puisse le modifier (par exemple la règle d'induction a besoin de modifier M). Mais le "this" d'un objet est un dictionnaire.

La question

Est-il possible d'accéder à l'objet à l'intérieur de l'objet ? Tout en pouvant aussi traduire l'objet en dictionnaire ?

Étude

On ne peut pas à la fois utiliser "this" en tant que dictionnaire et en tant qu'objet.

Si on l'utilise en tant qu'objet

Si obj est l'objet, l'accès au dictionnaire doit se faire par "obj obj". À partir d'un dictionnaire d on peut construire un objet de ce type par "constantF d".

Traduction des notations

Objet en varexp, this et dictionnaire

Question

Quand on a un objet en argument d'une fonction, on peut vouloir accéder à trois parties:

  • l'objet lui-même,
  • le dictionnaire dérivé (par "this this"),
  • les entrées du dictinnaire.

Actuellement le format des varExp pour les objet prévoit juste this et les entrées, comment ajouter le dictionnaire dérivé ?

Étude

Le dictionnaire dérivé peut être lourd à calculer, il serait dommage de dédoubler le calcul en ne fournissant pas une variable pour le dictionnaire.

♦♦♦♦♦♦♦♦♦♦

Il serait possible d'utiliser pour le dictionnaire un nom dérivé du nom pour l'objet global, par exemple si c'est "this" pour l'objet global, ce serait "this_dict".

♦♦♦♦♦♦♦♦♦♦

Remarquons que l'auto-référence que l'on trouve pour les objets pourrait se trouver éventuellement pour d'autres structures. Il serait possible de définir une varexp un peut comme VAssign, avec deux variable: VAssign2 v1 v2 ve , on traduirait $F v1@@v2@ve -> body par $F v1 -> ($F v2 -> ($F ve -> body) v2 ) (v1 v1)

Rappelons que la traduction de $F v@ve -> body est $F v -> ($F ve -> body) v.

Pour les objets, il y aurait des noms par défaut: "this" et "thisD"

♦♦♦♦♦♦♦♦♦♦

Ou alors une version de VAssign2 où le deuxième nom est automatique: On traduirait $F v@@ve -> body par $F v -> ($F v_v -> $F ve -> body) (v v)

Pour les objets, les noms par défaut serait this et this_this

♦♦♦♦♦♦♦♦♦♦

On peut simplifier : VAssign2 v ve , on traduirait $F v@@ve -> body par $F v -> ($F ve -> body) (v v)

Le varexp dans la définition d'un objet pourrait être :

  • this
  • this@$O[...]
  • this@@thisD
  • this@@$D[...]
  • this@@thisD@$D[...]

Réponse

On ajoute la notation @@ et VAssign2, on ajoute une variable dans les objets pour représenter le dictionnaire correspondant.

Traduire $O[x = vx, y = vy]

$F this@$O[x,y] → $D[x = vx, y = vy]


Traduire $F $O[x,y] → body

Si on a un objet en argument, pour extraire les entrées il faut d'abord le transformer en dictionnaire en l'appliquant à lui-même.

$F $O[x,y] → body = selfx $F $D[x,y] -> body

Traduire $F v@$O[x,y] → body

x et y font référence à des valeurs du dictionnaire calculable à partir de l'objet, il faut donc appliquer l'objet à lui-même (par self) pour y accéder. Par contre v fait référence à l'objet lui-même, il ne faut donc pas l'appliquer à lui-même.

On traduit donc par:

$F v → (selfx $F $D[x,y] → body) v

Réponse

À la place d'utiliser "recurse obj" pour récupérer le dictionnaire à partir de l'objet, on utilise "obj obj".