Salut,
En regardant le code de la methode factorial de la class Integer, je ne comprend pas pourquoi les calculs sur la valeur entiere se font sur self.
Est-ce que self n' est pas sens'ee etre une r'ef'erence sur un objet Integer (et non pas sur la valeur elle m^eme) ? C'est du moins de cette facon que les choses seraient vues en C++, je n'arrive pas a faire la transposition avec Smalltalk.
Merci de m'eclairer.
Hilaire
factorial self = 0 ifTrue: [^ 1]. self > 0 ifTrue: [^ self * (self - 1) factorial]. self error: 'Not valid for negative integers'
Hilaire Fernandes a écrit :
Salut,
En regardant le code de la methode factorial de la class Integer, je ne comprend pas pourquoi les calculs sur la valeur entiere se font sur self.
Est-ce que self n' est pas sens'ee etre une r'ef'erence sur un objet Integer (et non pas sur la valeur elle m^eme) ? C'est du moins de cette facon que les choses seraient vues en C++, je n'arrive pas a faire la transposition avec Smalltalk.
Merci de m'eclairer.
Hilaire
factorial self = 0 ifTrue: [^ 1]. self > 0 ifTrue: [^ self * (self - 1) factorial]. self error: 'Not valid for negative integers'
Salut,
pour commencer, il faut que tu saches que tout est objet en Smalltalk. Self représente une instance de la classe Integer. Les opérateurs de comparaisons = > <... sont tous définis sur la classe Integer. Il est impossible d'écrire le code en fonction de la valeur de l'objet car cette valeur devrait être un entier et comme tout est objet, ça serait un objet Integer, donc on tournerait en rond.
Je ne sais pas si je suis bien clair...
Damien
Salut
Il n'y a pas de "calcul" sur la "valeur" mais des messages (*, +, >, = etc) qui sont envoyés à un objet (ici de classe Integer). Regardes la méthode '*'.
Par analogie au C++ , self = this et * serait redéfini par une méthode 'operator *'
"Hilaire Fernandes" hilaire@ext.cri74.org a écrit dans le message de news:20040905120550.11e3495c.hilaire@ext.cri74.org...
Salut,
En regardant le code de la methode factorial de la class Integer, je ne comprend pas pourquoi les calculs sur la valeur entiere se font sur self.
Est-ce que self n' est pas sens'ee etre une r'ef'erence sur un objet Integer (et non pas sur la valeur elle m^eme) ? C'est du moins de cette facon que les choses seraient vues en C++, je n'arrive pas a faire la transposition avec Smalltalk.
Merci de m'eclairer.
Hilaire
factorial self = 0 ifTrue: [^ 1]. self > 0 ifTrue: [^ self * (self - 1) factorial]. self error: 'Not valid for negative integers'
---------------------------------------------------------------------------- ----
_______________________________________________ Squeak-fr mailing list Squeak-fr@lists.squeakfoundation.org http://lists.squeakfoundation.org/listinfo/squeak-fr
On Sun, 5 Sep 2004 17:10:49 +0200 "alr" alr.dev@free.fr wrote:
Il n'y a pas de "calcul" sur la "valeur" mais des messages (*, +, >, = etc) qui sont envoyés à un objet (ici de classe Integer). Regardes la méthode '*'.
Par analogie au C++ , self = this et * serait redéfini par une méthode 'operator *'
J'entends bien, mais je ne parviens toujours pas à comprendre comme et où est représenté l'information concernant un eniter en question (sa valeur).
Hilaire
Bonjour, Je ne suis pas sous Squeak mais sous VW, donc je ne peux pas vérifier le code. Néanmoins il me semble que dans cette méthode récursive, il manque une paire de parenthèse : [^ (self * (self - 1)) factorial] (self * (self - 1)) renvoie une nouvelle instance d'Integer qui comprend alors le message #factorial. Est-ce que ça aide... ?
Pierre
Hilaire Fernandes a écrit :
On Sun, 5 Sep 2004 17:10:49 +0200 "alr" alr.dev@free.fr wrote:
Il n'y a pas de "calcul" sur la "valeur" mais des messages (*, +, >, = etc) qui sont envoyés à un objet (ici de classe Integer). Regardes la méthode '*'.
Par analogie au C++ , self = this et * serait redéfini par une méthode 'operator *'
J'entends bien, mais je ne parviens toujours pas à comprendre comme et où est représenté l'information concernant un eniter en question (sa valeur).
Hilaire
Squeak-fr mailing list Squeak-fr@lists.squeakfoundation.org http://lists.squeakfoundation.org/listinfo/squeak-fr
-- *********************************** Pierre Bommel CIRAD TA 60/15 73, rue Jean-François Breton 34398 Montpellier cedex 5 France Phone: +33 (0)4 67 59 38 53 Fax: +33 (0)4 67 59 38 27 http://cormas.cirad.fr ***********************************
On 5 sept. 04, at 17:30, Hilaire Fernandes wrote:
On Sun, 5 Sep 2004 17:10:49 +0200 "alr" alr.dev@free.fr wrote:
Il n'y a pas de "calcul" sur la "valeur" mais des messages (*, +, >, = etc) qui sont envoyés à un objet (ici de classe Integer). Regardes la méthode '*'.
Par analogie au C++ , self = this et * serait redéfini par une méthode 'operator *'
J'entends bien, mais je ne parviens toujours pas à comprendre comme et où est représenté l'information concernant un eniter en question (sa valeur).
Dans la machine virtuelle. La machine virtuelle sait comment ces objets speciaux sont representes et comment ils sont executes. Regarde la method + sur SmallInteger cela doit etre une primitive (c'est a dire un acces direct dans la VM), certaines primitives ne peuvent pas etre emulee en Smalltalk comme bitShit, at:...+ - normallement tu as besoin de 32 operations essentielles.
Ensuite il y a des primitives qui sont pour rendre Smalltalk plus rapide comme la creation de points regarde la method @ sur SmallInteger (je crois je n'ai pas un Smalltalk )
Stef
Hilaire _______________________________________________ Squeak-fr mailing list Squeak-fr@lists.squeakfoundation.org http://lists.squeakfoundation.org/listinfo/squeak-fr
Salut
Il n'y a pas de variable d'isntance pour la valeur, ca relève de la cuisine interne de la VM prise en charge via des primitives. D'après les qques infos sur le swiki et les commentaires, les entiers SmallInteger (> 30 bits) sont stockés à la place du pointeur pour optimizer et les LargeInteger ds un byte array, des conversions sont faites automatiquement lors des calculs.
La classe String a l'air de bénéficier aussi d'un traitement de faveur (?), c'est probablement pas la seule.
Si tu veux vraiment savoir ca devient un peu hard: il y a un 'blue book' qui détaille le byte code et l'architecture mémoire d'un vm smalltalk (et squeak ?), tu peux voir aussi comment la vm est traduite du smalltalk en c (pour les parties smalltalk), et tt le code est public.
bon courage ;-)
"Hilaire Fernandes" hilaire@ext.cri74.org a écrit dans le message de news:20040905173039.45c6f7d5.hilaire@ext.cri74.org... On Sun, 5 Sep 2004 17:10:49 +0200 "alr" alr.dev@free.fr wrote:
Il n'y a pas de "calcul" sur la "valeur" mais des messages (*, +, >, =
etc)
qui sont envoyés à un objet (ici de classe Integer). Regardes la méthode '*'.
Par analogie au C++ , self = this et * serait redéfini par une méthode 'operator *'
J'entends bien, mais je ne parviens toujours pas à comprendre comme et où est représenté l'information concernant un eniter en question (sa valeur).
Hilaire
---------------------------------------------------------------------------- ----
_______________________________________________ Squeak-fr mailing list Squeak-fr@lists.squeakfoundation.org http://lists.squeakfoundation.org/listinfo/squeak-fr
oups les entiers SmallInteger < 30 bits et pas l'inverse bien sûr "alr" alr.dev@free.fr a écrit dans le message de news:chifts$g5l$1@sea.gmane.org...
Salut
Il n'y a pas de variable d'isntance pour la valeur, ca relève de la
cuisine
interne de la VM prise en charge via des primitives. D'après les qques infos sur le swiki et les commentaires, les entiers SmallInteger (> 30 bits) sont stockés à la place du pointeur pour optimizer et les LargeInteger ds un byte array, des conversions sont faites automatiquement lors des calculs.
La classe String a l'air de bénéficier aussi d'un traitement de faveur
(?),
c'est probablement pas la seule.
Si tu veux vraiment savoir ca devient un peu hard: il y a un 'blue book'
qui
détaille le byte code et l'architecture mémoire d'un vm smalltalk (et squeak ?), tu peux voir aussi comment la vm est traduite du smalltalk
en
c (pour les parties smalltalk), et tt le code est public.
bon courage ;-)
"Hilaire Fernandes" hilaire@ext.cri74.org a écrit dans le message de
news:20040905173039.45c6f7d5.hilaire@ext.cri74.org...
On Sun, 5 Sep 2004 17:10:49 +0200 "alr" alr.dev@free.fr wrote:
Il n'y a pas de "calcul" sur la "valeur" mais des messages (*, +, >, =
etc)
qui sont envoyés à un objet (ici de classe Integer). Regardes la méthode '*'.
Par analogie au C++ , self = this et * serait redéfini par une méthode 'operator *'
J'entends bien, mais je ne parviens toujours pas à comprendre comme et où est représenté l'information concernant un eniter en question (sa valeur).
Hilaire
--
Squeak-fr mailing list Squeak-fr@lists.squeakfoundation.org http://lists.squeakfoundation.org/listinfo/squeak-fr
---------------------------------------------------------------------------- ----
_______________________________________________ Squeak-fr mailing list Squeak-fr@lists.squeakfoundation.org http://lists.squeakfoundation.org/listinfo/squeak-fr
On Mon, 6 Sep 2004 22:05:04 +0200 "alr" alr.dev@free.fr wrote:
La classe String a l'air de bénéficier aussi d'un traitement de faveur (?), c'est probablement pas la seule.
Si tu veux vraiment savoir ca devient un peu hard: il y a un 'blue book' qui détaille le byte code et l'architecture mémoire d'un vm smalltalk (et squeak ?), tu peux voir aussi comment la vm est traduite du smalltalk en c (pour les parties smalltalk), et tt le code est public.
Non, cette réponse me satisfait. J'avais peur que quelque chose m'échappait dans le fonctionnement du language. Après la tambouille interne c'est effectivement une autre histoire :-)
Merci
Dans le new blue book sur ma page freebooks, il y a une description de la VM (une ancienne mais cela donne une bonne idee).
Stef On 6 sept. 04, at 23:06, Hilaire Fernandes wrote:
On Mon, 6 Sep 2004 22:05:04 +0200 "alr" alr.dev@free.fr wrote:
La classe String a l'air de bénéficier aussi d'un traitement de faveur (?), c'est probablement pas la seule.
Si tu veux vraiment savoir ca devient un peu hard: il y a un 'blue book' qui détaille le byte code et l'architecture mémoire d'un vm smalltalk (et squeak ?), tu peux voir aussi comment la vm est traduite du smalltalk en c (pour les parties smalltalk), et tt le code est public.
Non, cette réponse me satisfait. J'avais peur que quelque chose m'échappait dans le fonctionnement du language. Après la tambouille interne c'est effectivement une autre histoire :-)
Merci _______________________________________________ Squeak-fr mailing list Squeak-fr@lists.squeakfoundation.org http://lists.squeakfoundation.org/listinfo/squeak-fr
Le 5 sept. 04, à 12:05, Hilaire Fernandes a écrit :
Salut,
En regardant le code de la methode factorial de la class Integer, je ne comprend pas pourquoi les calculs sur la valeur entiere se font sur self.
Est-ce que self n' est pas sens'ee etre une r'ef'erence sur un objet Integer (et non pas sur la valeur elle m^eme) ? C'est du moins de cette facon que les choses seraient vues en C++, je n'arrive pas a faire la transposition avec Smalltalk.
En fait, l'objet est la valeur, c'est la même chose. Si tu fais 7 inspect, tu vois la valeur de l'objet 7 et c'est 7 !
-- oooo Serge Stinckwich OOOOOOOO Université de Caen>CNRS UMR 6072>GREYC>MAD OOESUGOO http://purl.org/net/SergeStinckwich oooooo Smalltalkers do: [:it | All with: Class, (And love: it)] \ / ##
Salut,
En regardant le code de la methode factorial de la class Integer, je ne comprend pas pourquoi les calculs sur la valeur entiere se font sur self.
Est-ce que self n' est pas sens'ee etre une r'ef'erence sur un objet Integer (et non pas sur la valeur elle m^eme) ?
En Smalltalk les entiers sont des objets (en fait c'est un peu plus complique au niveau de la machien virtuelle, les integers sont des objets speciaux qui n;ont pas les meme chamops que les objet comme personnes, la mchiane virtuelle optimise cela). Mais sinon tu as des objets partout, ensuite tu peux creer des classes qui ont des champs qui sont des Word, Byte, double, donc tu peux vraiment d'interfacer avec des tas de trucs en C.
Stef
En Smalltalk on a des references sur des objets mais on ne manipule pas les references. tout est un object = tout est une reference.
Stef
C'est du moins de cette facon que les choses seraient vues en C++, je n'arrive pas a faire la transposition avec Smalltalk.
Merci de m'eclairer.
Hilaire
factorial self = 0 ifTrue: [^ 1]. self > 0 ifTrue: [^ self * (self - 1) factorial]. self error: 'Not valid for negative integers' _______________________________________________ Squeak-fr mailing list Squeak-fr@lists.squeakfoundation.org http://lists.squeakfoundation.org/listinfo/squeak-fr
squeak-fr@lists.squeakfoundation.org