Character: size et comparaison string

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

Character: size et comparaison string

vicnet
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
Reply | Threaded
Open this post in threaded view
|

Re: Character: size et comparaison string

stephane ducasse-2

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

Reply | Threaded
Open this post in threaded view
|

Re: Character: size et comparaison string

PAndré
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
Reply | Threaded
Open this post in threaded view
|

Re: Character: size et comparaison string

vicnet
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
Reply | Threaded
Open this post in threaded view
|

Re: Character: size et comparaison string

Jean-François LEFEVRE-2
Bonjour,

Le 4 février 2011 15:37, vicnet <[hidden email]> a écrit :
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.
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
et la ca ne me viendrait pas à l'idée de faire comme cela mais je
rajouterais naturellement asString :-)

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+
Vicnet