1

Je travaille sur un nouveau langage de programmation à typage dynamique basé sur une classe où les fonctions sont des objets de première classe. Les fonctions définies à l'intérieur d'une classe (aka méthodes) sont appelées comme comme premier paramètre alors que les fonctions définies globalement n'ont pas besoin du paramètre self.Comment le compilateur peut-il décider si le self doit être transmis?

Dans un code comme:

func foo(a) { 
    return a*2; 
} 

class c3 { 
    var p1 = 555; 
    func init() { 
     p1 = foo; 
    } 
} 

class c2 { 
    var p1 = 333; 
    func init() { 
     p1 = c3(); 
    } 
} 

class c1 { 
    var p1 = 111; 
    func init() { 
     p1 = c2(); 
    } 
} 

func main() { 
    return c1().p1.p1.p1(1234); 
} 

Comment le compilateur décider si auto doit être passé comme premier argument à p1 (1234) ou non? Dans ce cas, p1 pointe vers foo, qui est une fonction globale qui n'aurait pas besoin du paramètre self.

Répondre

0

En Python, il est géré à l'exécution par le protocole descripteur. Java gère cela en ne permettant pas d'appeler des objets avec(). Tout est appelé avec la syntaxe de la méthode, et le compilateur sait s'il s'agit d'une méthode statique ou virtuelle. L'équivalent Java des objets de fonction nécessite que vous appeliez une méthode spécifique sur l'objet (foo.call() au lieu de foo())

Je crois que C++ gère cela via le système de types. Si le nom est une méthode, c'est un appel de méthode. S'il s'agit d'une méthode statique, il s'agit d'un appel de méthode statique. Sinon, vous accédez à l'opérateur() sur un champ.

+0

Eh bien, ce n'est pas seulement la syntaxe de la méthode qui détermine le type d'invocation en Java. Si vous avez une expression comme 'abc (1234)', 'c (1234)' pourrait être une invocation d'une méthode 'static' déclarée dans un type' ab' ou une méthode d'instance invoquée sur l'objet trouvé dans le champ 'b 'qui pourrait être un champ' static' du type 'a' ou un champ d'instance de l'objet trouvé dans la variable' a'. Le point clé est le système de type statique permettant de rechercher les variables, les types et les méthodes au moment de la compilation et de prendre une décision. – Holger

+0

@Holger J'ai essayé d'y arriver en disant "le compilateur sait s'il s'agit d'une méthode statique ou virtuelle", mais je suppose que je n'étais pas assez explicite. Aussi, https://gist.github.com/Storyyeller/fd97cccc02287dd40e43 – Antimony

0

Simple: c3.p1 est une variable membre, pas une méthode de c3. Ainsi, lorsque vous appelez c3.p1, il n'obtient simplement pas un self pointant vers des instances de c3.

Vous pouvez soutenir les méthodes liées, bien que:

class c3 { 
    var p1 = 555; 
    func bar() { print "Hello, world"; } 
    func init() { 
     p1 = self.bar; // NOT self.bar() 
    } 
} 

Dans ce cas, le compilateur ne serait toujours pas passer un c3self référence à c3.p1() mais ce n'est pas nécessaire sur le site d'appel depuis self était déjà lié lorsque self.bar a été attribué à p1.