Bonjour,
C'est tout bete, mais pourquoi '$a size' ne renvoie pas 1 ? Ca renvoi errorNotIndexable. Je comprends que cela ne soit pas indexable mais ca parait 'humain' (c'est à dire 'petite discussion' ou 'small talk') de renvoyer 1 non ? De même, $a = 'a' renvoi faux. Ok ce sont deux types différents, mais: - 1 = 1.0 renvoi vrai - il me semblait que le langage était non typé fort Vous trouvez cela normal ? a+ Vicnet |
On Feb 2, 2011, at 8:48 AM, vicnet wrote: > Bonjour, > > C'est tout bete, mais pourquoi '$a size' ne renvoie pas 1 ? > Ca renvoi errorNotIndexable. size "Primitive. Answer the number of indexable variables in the receiver." maintenant oui cela pourrait renvoyer 1 > Je comprends que cela ne soit pas indexable mais ca parait > 'humain' (c'est à dire 'petite discussion' ou 'small talk') de > renvoyer 1 non ? > > > De même, $a = 'a' renvoi faux. c'est pas la meme chose. $a est un element 'a' un containeur d'elements. > Ok ce sont deux types différents, mais: > - 1 = 1.0 renvoi vrai > - il me semblait que le langage était non typé fort cela n'a rien a voir ;) 1 = 1.0 cela compare des nombres pas un nombre et un tableau de nombres. > > Vous trouvez cela normal ? > > a+ > Vicnet |
In reply to this post by vicnet
bonjour,
On 2 fév, 02:48, vicnet <[hidden email]> wrote: > Bonjour, > > C'est tout bete, mais pourquoi '$a size' ne renvoie pas 1 ? > Ca renvoi errorNotIndexable. > Je comprends que cela ne soit pas indexable mais ca parait > 'humain' (c'est à dire 'petite discussion' ou 'small talk') de > renvoyer 1 non ? > > De même, $a = 'a' renvoi faux. > Ok ce sont deux types différents, mais: > - 1 = 1.0 renvoi vrai > - il me semblait que le langage était non typé fort non typé fort ne veut pas dire "non typé" ou "typé avec cast implicite" la cas entier/réel vient du fait que de nombreux opérateurs sont surchargés (+,-,*,/...) alors que qu'un caractère ne partage que peu d'opération avec les chaînes de caractères rien n'empêche le 'cast' explicite (asString) pour appliquer > Vous trouvez cela normal ? a priori oui car les opérations (le type) sont éloignés un caractère n'est pas défini comme une chaine avec contrainte de taille = 1 (caractère n'hérite pas de string et vice-versa) > a+ > Vicnet a+ PA |
Après réflexion, je suis d'accord.
Il m'avais juste semblé 'naturel' de tester ma chaine directement avec un caractère. Je suis tombé sur un autre cas plus bizarre du point de vue humain: 'test', $e donne une exception. Il faut 'caster' avec asString Ceci dit, c'est la même chose pour 'test', 123 et la ca ne me viendrait pas à l'idée de faire comme cela mais je rajouterais naturellement asString :-) a+ Vicnet |
Bonjour, Le 4 février 2011 15:37, vicnet <[hidden email]> a écrit : Après réflexion, je suis d'accord.
C'est effectivement pas complètement intuitif sur ce genre de chose. Pour comprendre le problème de la comparaison, il faut comprendre que les deux objets sont de natures différentes (ce qui a été très expliqué, je vais pas y revenir) Pour comprendre la virgule, c'est un peu le même problème. Le message #, s'adresse à une collection (séquentielle en plus) pour concaténer une autre collection. Il ne prend donc pas un unique élément en argument mais une collection d'éléments. C'est important parce que si on acceptait un 'test', $e on serait assez sceptique sur ce que doit faire un #( 'test' $e) , #( 'paf' ) Est-ce que ça doit faire : #( 'test' $e 'paf' ) ou bien : #( 'test' $e #( 'paf' ) ) Le message recherché doit être différent pour concaténer un seul élément (il s'agit de #copyWith:) Il faut 'caster' avec asString Je ne suis pas trop d'accord avec le terme 'caster' (j'aime bien chipoter :-) ) Un 'cast', ça ne change pas la nature d'un objet alors alors que le #asString, ça va en général créer un autre objet Ceci dit, c'est la même chose pour 'test', 123 C'est vrai que c'est un peu une des difficultés de Smalltalk. On aimerait que ce soit intuitif (et ça l'est en général) mais parfois il y a des choix contre intuitifs ou historiques. Par exemple, on peut s'étonner de voir que la concaténation n'est pas gérée par un message #+ mais #, Je suppose que c'est historique et que le #+ c'est pour l'arithmétique (+ ça va avec -, * et /). Il serait possible (je pense que ça a déjà été fait) d'ajouter un message sur Object (et quelques classes de base) permettant de faire une concaténation textuelle et 'intuitive'. Par exemple : 'test' ++ $a ++ 123 ++ 'paf' qui donnerait 'testa123paf' Sans tester, une implémentation brutale devait être un truc du genre : Object>>#++ anObject "concaténer textuellement deux objets 'test' ++ $a ++ 123 ++ 'paf' " ^self asString, anObject asString Avec quelques redéfinitions dans les classes Character, CharacterArray et peut être Collection. Après il reste le problème que c'est généralement pas efficace de concaténer plusieurs éléments de cette manière (trop d'allocation mémoire). Mes dix cents, Jean-François a+ |
Free forum by Nabble | Edit this page |