Object Layer
L'Object Layer implémente les prototypes des classes et des instances So-o et toutes les fonctions nécessaires à la classe Root.
Tout le code de l'Object Layer de So-o est dans le fichier OL.js.
Remarquez que seules les fonctions de l'interface de So-o et les méthodes de la classe Root accèdent à ce code.
- export function Definition(cname, sc, rev, cprops, iprops, cmsgs, imsgs) {
Le conteneur d'une classe est une fonction appelée Definition. Elle a 7 arguments.
cname
spécifie le nom de la classe, un nom de variable valide.
sc
est la référence globale de la superclasse de la nouvelle classe. Si sc
vaut null
, la nouvelle classe hérite par défaut de la classe Root définie par la variable globale Root
.
rev
est le numéro de révision de la classe, un entier > 0.
cprops
et iprops
listent les propriétés de la classe et des instances de la classe. Une propriété est une chaîne de caractères. Une liste de propriétés est un tableau ou vaut null
.
cmsgs
et imsgs
sont des listes associatives de messages et de méthodes de la classe et des instances de la classe. Un message est une chaîne de caractères. Une méthode est le code d'une fonction. Une liste de messages et de méthodes est un objet ou vaut null
.
- const varname= /^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/;
- if (! (typeof cname === 'string' && cname.match(varname)))
- throw new TypeError();
Vérifie si le nom de la classe est une chaîne de caractères et un nom de variable valide. Déclenche une exception TypeError en cas d'erreur.
- if (! (sc === null || (typeof sc === 'object' && sc.prototype instanceof Definition)))
- throw new TypeError();
Vérifie si la superclasse est null
ou une classe.
Déclenche une exception TypeError en cas d'erreur.
- if (!(Number.isInteger(rev) && rev > 0))
- throw new TypeError();
Vérifie si le numéro de révision est un entier > 0. Déclenche une exception TypeError en cas d'erreur.
- this.prototype = Object.create(Definition.prototype);
Initialise la nouvelle Definition.
- this.name = cname;
- this.revision = rev;
- this.superclass = 'Root' !== cname ? (sc ? sc : Root) : null;
- this.cproperties = cprops;
- this.iproperties = iprops;
- this.cmessages = cmsgs;
- this.imessages = imsgs;
Si sc
est null
, la superclasse de la classe vaut Root
excepté pour la classe Root qui est la seule classe sans superclasse.
- this.attributes = {};
- }
Un objet contient les valeurs des propriétés d'une classe.
NOTE : Seule la fonction defclass
de l'interface peut construire une Definition.
- Definition.prototype.toString = function() {
- return 'class(' + this.name + ')';
- };
La représentation textuelle d'une classe retourne le mot class
suivi par le nom de la classe entre parenthèses.
- Definition.prototype.sendself = function(msg, args) {
- return class_send_message(this, msg, args);
- }
sendself
envoie msg
avec args
en argument à la classe.
args
est un tableau.
sendself
retourne le résultat de l'appel de class_send_message
avec la classe, le message et les paramètres du message en argument.
NOTE : Seule la fonction sendmsg
de l'interface appelle la méthode sendself
d'une Definition.
- Definition.prototype.sendsuper = function(fc, msg, args) {
- return class_super_send_message(fc, this, msg, args);
- }
sendsuper
envoie msg
avec args
en argument à la classe, dans le contexte de la classe fc
.
args
est un tableau.
sendsuper
retourne le résultat de l'appel de class_super_send_message
avec la classe de la méthode de l'appel, la classe, le message et les paramètres du message en argument.
NOTE : Seule la fonction supersend
de l'interface appelle la méthode sendsuper
d'une Definition.
- export function Instance(c) {
Le conteneur d'une instance est une fonction appelée Instance. Elle a 1 argument.
c
est la référence globale de la classe de la nouvelle instance.
- if (! (typeof c === 'object' && c.prototype instanceof Definition))
- throw new TypeError();
Vérifie si la classe est une Definition. Déclenche une exception TypeError en cas d'erreur.
- this.prototype = Object.create(Instance.prototype);
Initialise la nouvelle Instance.
- this.class = c;
Lie l'instance à sa classe.
- this.attributes = {};
- }
Un objet contient les valeurs des propriétés d'une instance.
NOTE : Seule la fonction class_make
de l'Object Layer construits une Instance.
- Instance.prototype.toString = function() {
- return 'object(' + this.class.name + ')';
- };
La représentation textuelle d'une instance retourne le mot object
suivi par le nom de la classe de l'instance entre parenthèses.
- Instance.prototype.sendself = function(msg, args) {
- return object_send_message(this, msg, args);
- }
sendself
envoie msg
avec args
en argument à l'instance.
args
est un tableau.
sendself
retourne le résultat de l'appel de object_send_message
avec l'instance, le message et les paramètres du message en argument.
NOTE : Seule la fonction sendmsg
de l'interface appelle la méthode sendself
d'une Instance.
- Instance.prototype.sendsuper = function(fc, msg, args) {
- return object_super_send_message(fc, this, msg, args);
- }
sendsuper
envoie msg
avec args
en argument à l'instance, dans le contexte de la classe fc
.
sendsuper
retourne le résultat de l'appel de object_super_send_message
avec la classe de la méthode de l'appel, l'instance, le message et les paramètres du message en argument.
NOTE : Seule la fonction supersend
de l'interface appelle la méthode sendsuper
d'une Instance.
Le reste du code implémente toutes les fonctions de l'Object Layer dont la classe Root a besoin.
- class_class_method_symbol
- Retourne le nom d'une méthode de classe.
- class_instance_method_symbol
- Retourne le nom d'une méthode d'instance.
- class_name
- Retourne le nom d'une classe.
- class_revision
- Retourne le numéro de révision d'une classe.
- class_superclass
- Retourne la superclasse d'une classe.
- class_class_properties
- Retourne les propriétés de classe définies par une classe.
- class_instance_properties
- Retourne les propriétés d'instance définies par une classe.
- class_class_messages
- Retourne les messages de classe définis par une classe.
- class_instance_messages
- Retourne les messages d'instance définis par une classe.
- class_set_class_properties
- Initialise les propriétés de classe d'une classe.
- class_set_instance_properties
- Initialise les propriétés d'instance d'une classe.
- class_set_class_messages
- Initialise les messages de classe d'une classe.
- class_set_instance_messages
- Initialise les messages d'instance d'une classe.
- class_add_class_message
- Ajoute un message de classe à une classe.
- class_remove_class_message
- Retire un message de classe à une classe.
- class_add_instance_message
- Ajoute un message d'instance à une classe.
- class_remove_instance_message
- Retire un message d'instance à une classe.
- class_add_class_property
- Ajoute une propriété de classe à une classe.
- class_remove_class_property
- Retire une propriété de classe à une classe.
- class_add_instance_property
- Ajoute une propriété d'instance à une classe.
- class_remove_instance_property
- Retire une propriété d'instance à une classe.
- class_attributes
- Retourne les valeurs des propriétés d'une classe.
- class_set_attributes
- Initialise les valeurs des propriétés d'une classe.
- class_is_kind_of
- Vérifie si une classe est une sous-classe d'une autre classe.
- class_get
- Retourne la valeur d'une propriété d'une classe.
- class_set
- Modifie la valeur d'une propriété d'une classe.
- class_make
- Retourne une nouvelle instance d'une classe.
- object_class
- Retourne la classe d'une instance.
- object_superclass
- Retourne la superclasse d'une instance.
- object_assume
- Change la classe d'une instance.
- object_attributes
- Retourne les valeurs des propriétés d'une instance.
- object_set_attributes
- Initialise les valeurs des propriétés d'une instance.
- object_get
- Retourne la valeur d'une propriété d'une instance.
- object_set
- Modifie la valeur d'une propriété d'une instance.
- object_copy
- Retourne une copie d'une instance.
- class_find_class_property
- Vérifie si une propriété de classe d'une classe existe.
- class_find_instance_property
- Vérifie si une propriété d'instance d'une classe existe.
- class_find_class_method_class
- Retourne la classe qui implémente un message de classe.
- class_find_class_method
- Retourne la fonction qui implémente un message de classe.
- class_find_instance_method_class
- Retourne la classe qui implémente un message d'instance.
- class_find_instance_method
- Retourne la fonction qui implémente un message d'instance.
- class_apply_method
- Exécute une méthode de classe.
- class_send_message
- Exécute un message de classe.
- class_super_send_message
- Exécute un message de classe hérité d'une superclasse.
- object_apply_method
- Exécute une méthode d'instance.
- object_send_message
- Exécute un message d'instance.
- object_super_send_message
- Exécute un message d'instance hérité d'une superclasse.
Commentaires