Hola gente!

Gracias Guillermo por los enlaces, muy interesante.

Segun esa nomenclatura "instance Variable" es lo que se define en los
instanceVariableNames: en general.
Y lo que es "class instance variable" es lo que se define en los
classVariableNames: (y esto es lo que me confunde, lo que se llama "class
instance variable" aparece como classVariableNames:)

Entiendo instanceVariableNames, classVariableNames y toda la estructura
interna. No diria que una "class instance variable" o lo que define
classVariableNames: es algo similar a lo estatico en Java o en C++. Y me
sigue pareciendo que lo que los papers (y Valloud) llama "class variables"
(insisto, yo lo hubiera llamado shared variabels), tienen una
implementacion distinta.

PERO, aca viene la duda que persiste, y que en esos papers no esta
dilucidada, hasta donde vi.

En el
http://esug.org/data/Articles/Columns/EwingPapers/class_variables.pdf
pone "How to define Class Instance Variable" y eso lo entiendo desde
principios de los ochenta.

Pero en el
http://esug.org/data/Articles/Columns/EwingPapers/cvars&cinst_vars.pdf

Da como ejemplo de "class variable" a ListMenu. PERO NO DICE COMO SE DEFINE
(no vi en ningun lado un ejemplo que defina una subclase y en el
classVariableNames: venga ListMenu), simplemente la referencia en el metodo
de clase y con Mayuscula.

ListInterface class
initialize
“Create a menu. Create constants.”
ListMenu := Menu labels: #(‘add’ ‘remove’)
menu
“Return the list menu.”
^ListMenu
ListInterface
hasMenu
“Return true if a menu is defined.”
^self class menu notNil
performMenuActivity
“Perform the mouse-based activity for my view.”
self hasMenu
ifTrue: [^self class menu startUp].

Como sabe que ListMenu es una shared variable, en vez de algo que esta en
Smalltalk???

Valloud habla de Shared Variables, como de algo nuevo (ya en las secciones
anteriores menciono lo de que las clases tienen "instance variables"
definidas en la metaclass). Y que se accede NO POR class methods, sino como
variables compartidas, directamente accesibles desde cualquier lado de la
jerarquia de ESA CLASE.

Por ejemplo, escribe:

"In addition to instances variables on the instance and class sides of the
browser, there are hybrid entities calles class variables. Despite the
slight difference in their names, their scope is quite different: a class
variable is visible from the class the class that defines it and also from
all the instances of the class. Moreover, it is also visible by subclasses
of the class in which it is defined, and by instances of these subclasses
as well. This means it is a global variable whose scope begins at the class
that introduces it. In particular, class variables are accessible from
class instances as well as from emtaclass instances. Clearly, these are not
our everyday instance variables"

Es decir, no veo que sea las que se definen en classVariableNames:

No veo tampoco que sean las que esten definidas en una metaclase, de alguna
forma especial. Porque dice que se pueden ver desde las instances, la clase
original, y las subclases. No vi/no entendi que ninguna forma de
instanceVariableNames:, o classVariableNames:, aplicadas a la clase o la
metaclase, o a piruloclase ;-) CONSIGUIERA SEMEJANTE CONDUCTA de visibilidad
.

Como es?

(si existen como se describe en ese texto, yo las hubiera llamado
directamente Shared Variables, como creo recordar que estan en el libro
Smalltalk-80, pero que nunca son usadas o ejemplificadas en ese libro,
hasta donde recuerdo).

Nos leemos!

Angel "Java" Lopez
@ajlopez
gh:ajlopez

2012/12/17 Guillermo Schwarz <[email protected]>

> Qué enredo.
>
> - Eso estaba desde Smalltalk-80? Estaba explicado en el libro "clasico" de
> Smalltalk-80, The language? O solo nombrado?
>
> Sí. Existe desde 1980.
>
> - Como se declara que Beta es una class or shared variable? Por lo que
> entendi, simplemente se le asigna un valor en un metodo de una clase. Es
> asi?
>
> Cuando se declara una clase se pone la lista de instaceVariables y de
> classVariables.
>
>
> http://stephane.ducasse.free.fr/FreeBooks/ByExample/31%20-%20Chapter%2029%20-%20Meta-Programm.pdf
>
> - Necesita estar en primera letra mayuscula? Me imagino:
> -- Si, el compilador de metodos asi determina que es Shared
> -- No, el compilador de metodos determina que es Shared si no es Instance,
> Local, Argument, etc....
>
> En Smalltalk 80 el lugar para definir las instaceVariables no es el mismo
> que para definir las classVariables:
>
> http://esug.org/data/Articles/Columns/EwingPapers/class_variables.pdf
> http://esug.org/data/Articles/Columns/EwingPapers/cvars&cinst_vars.pdf
>
> Smalltalk es una instancia de SystemDictionary y es donde están definidas
> las constantes de la aplicación, en particular las clases están definidas
> en Smalltalk como "nombre" -> la clase propiamente tal, con la salvedad de
> que en el lenguaje Smalltalk no hay diferencia entre tiempo de edición,
> compilación y ejecución, y por lo tanto tan constantes no son, o si
> quieres, son constantes hasta que las cambias y por lo tanto son variables
> globales (podrías guardarlo en cualquier otro dictionary, pero el
> compilador de Smalltalk tiene la tendencia a usar Smalltalk como su
> dictionary).
>
> La única diferencia entre instanceVariables y classVariables es que unas
> están asociadas a las intancias (son un dictionary que están asociado a
> cada instancia), mientras que classVariables están asociadas a la clase
> propiamente tal y como tal, todas las instancias pueden acceder a ellas (si
> utilizan un classMethod en vez de un instanceMethod para acceder a ellas).
> Para invocar un class method debes hacer self class <<métdodo>>. ¿Se
> entiende?
>
> De todas maneras es una trivialidad porque las clases son objetos. En
> particular son instancias de la clase "class", de modo que self class class
> debiera ser siempre Class (o MetaClass dependiendo de la variante de
> Smalltalk que uses), pero no es así exactamente. Porque las
> instanceVariables de Class son las classVariables de la clase en cuestión
> (entonces todas las clases tendrían las mismas classVariables) y por eso
> Smalltalk crea una metaclase heredada de Class o MetaClass para cada clase
> que se crea, y esa clase si no me equivoco no está en Smalltalk (el
> SystemDictionary) ya que de todas maneras está en MetaClass subclasses y en
> cada self class class.
>
> Si conoces C++ o Java, el instanceVariable y el classVariable es lo mismo
> que la diferencia entre atributo normal y atributo estático, uno es propio
> de la instancia y el otro es propio de la clase y por eso se considera
> "compartido" (shared). Bueno y si no los conoces, es cosa de ver la
> implementación que tiene SystemDictionary y Compiler si al fin y al cabo en
> Smalltalk se puede ver todo el código.
>
> "Alpha dosomething..." => Integer doesNotUnderstand: #doSomething
>
> El compilador busca Alpha en Smalltalk y lo reemplaza por 1 (un Integer),
> luego le envía el mensaje dosomething y si no lo entiende... no sé cómo
> ser más claro...
>
> Juanita Ewing dice que existen 3 casos:
>
> 1. instance variables.
> 2. Class variables.
> 3. Class instance variables.
>
> La diferencia entre 2 y 3 es que en el caso 2, se comparten con las
> subclases y en el caso 3 no, por lo tanto argumenta Juanita que es mejor 3.
>
> Saludos,
> Guillermo.
>
>
> 2012/12/17 Angel Java Lopez <[email protected]>
>
>> Hola gente!
>>
>> No recuerdo si ya lo pregunte en la lista... bueno, encuentro en el libro
>> Fundamentals of Smalltalk Programming Technique (que adquiri en Smalltalks
>> 2010), del bueno de Andres Valloud, la seccion 4.2.6, el titulo
>>
>> Class (or shared) variables
>>
>> con la aclaracion al pie, de Note that in some Smalltalks (e.g:
>> VisualWorks) class variables are referred to as shared variables instead.
>>
>> Preguntas:
>>
>> - Eso estaba desde Smalltalk-80? Estaba explicado en el libro "clasico"
>> de Smalltalk-80, The language? O solo nombrado?
>> - Como se declara que Beta es una class or shared variable? Por lo que
>> entendi, simplemente se le asigna un valor en un metodo de una clase. Es
>> asi?
>> - Necesita estar en primera letra mayuscula? Me imagino:
>> -- Si, el compilador de metodos asi determina que es Shared
>> -- No, el compilador de metodos determina que es Shared si no es
>> Instance, Local, Argument, etc....
>> - Por lo que vi, no puedo hacer en el workspace
>>
>> Alpha := 1
>>
>> pero puedo hacer
>>
>> Smalltalk at: #Alpha put: 1
>>
>> y de ahi en mas referenciar a Alpha
>>
>> Como se llama a Alpha? Una global variable?
>>
>> - Como sabe el compilador de metodos, que si encuentra algo como
>>
>> Alpha dosomething...
>>
>>  se refiere a una global variable definida en Smalltalk, vs. una Shared
>> variable de la clase actual donde va el metodo que se va a compilar?
>>
>>
>> Nos leemos!
>>
>> Angel "Java" Lopez
>> @ajlopez
>> gh:ajlopez
>>
>>  --
>> To post to this group, send email to [email protected]
>> To unsubscribe from this group, send email to
>> [email protected]
>>
>> http://www.clubSmalltalk.org
>
>
>
>
> --
> Saludos cordiales,
>
> Guillermo Schwarz
> Sun Certified Enterprise Architect
>
> --
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> [email protected]
>
> http://www.clubSmalltalk.org

-- 
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]

http://www.clubSmalltalk.org

Responder a