2010-06-26 10 views
4

de syntaxe Smalltalk (et caractéristiques) peuvent être trouvés assez exotiques (et même dérangeant) quand vous venez d'un monde de syntaxe plus comme C. Je me suis trouvé perdre du temps avec certains
Je serais intéressé à apprendre en sachant ce que vous avez trouvé vraiment exotique par rapport aux langues plus classiques/mainstream et que vous pensez aider à comprendre la langue.Smalltalk caractéristiques exotiques

Par exemple, l'évaluation avec les opérateurs logiques:

  • (object1 = object2) & (object3 = object4): ce évaluera l'expression entière, même si la partie gauche est fausse, le reste sera évalué.
  • (object1 = object2) and: [object3 = object4]: ce évaluera la partie gauche, et n'évaluera la partie droite si le premier est vrai.
+1

Comment est-ce que l'un de ces exotiques? Pensez en termes d'envoi de messages. Vous êtes dans une pièce pleine de monde, moi aussi; Je veux vous poser une question, alors j'ouvre la bouche et commence à dire des mots. Vous recevez ces mots et réagissez en conséquence. Soit en les ignorant, en leur répondant ou en effectuant une expression corporelle pour communiquer une réponse. C'est en fait plus fondamental que l'exotisme quand vous arrêtez et réfléchissez à la façon dont c'est prévu. – jer

+0

Comme je l'ai dit, quand je dis «exotique», cela signifie «exotique comparé au langage classique/courant C/Java». Je suis d'accord que l'envoi de messages rend SmallTalk plus proche de la pensée humaine que d'autres langues, mais nous (les programmeurs, ou au moins moi) sommes formatés pour penser dans un monde C. C'était juste mon point. –

+0

Venant d'un arrière-plan Delphi, je suis habitué à des expressions booléennes qui pourraient ou ne pourraient pas être évaluées d'une façon ou d'une autre, en fonction d'un changement de compilateur! –

Répondre

4

Primitves

someMethod 
    <primitive 14122 wtf> 
    "fail and execute the following" 
    [self] inlineCopyInject: [:t1 | self]. 
10

Tout est un objet, et tout ce qui précède disponible pour l'inspection et la modification de la machine virtuelle. (Les primitives font partie de la VM, conceptuellement au moins.) Même votre pile d'appels est disponible (thisContext) - Seaside a implémenté des continuations dans la journée en faisant simplement basculer la pile d'appels dans un flux et en la restaurant (retour à la suite) il suffit de lire les cadres d'activation de ce flux!

Vous pouvez construire un sélecteur à partir d'une chaîne et le transformer en Symbol et l'envoyer sous forme de message: self perform: 'this', 'That' fera la même chose que self thisThat. (Mais ne faites pas cela, pour les mêmes raisons que vous devriez éviter eval dans les deux Lisps et PHP: très difficile à déboguer!)

Message passant: c'est not method invocation!

#become: est probablement un peu un choc pour quelqu'un qui n'a pas vu auparavant. (tl; dr un échange en gros de deux pointeurs d'objet - toutes les références à B maintenant pointent vers A, et toutes les références à A maintenant pointent vers B)

4

Ma première session de lutte avec Smalltalk était l'implémentation de la métaclasse.

Considérez ceci:

Quelle est la classe de 'This is a string'? Eh bien, quelque chose comme String.

Quelle est la classe de String? String class. Note: c'est une classe, mais elle n'a pas de nom, elle s'imprime simplement en tant que 'String class'.

Quelle est la classe de String class? Metaclass. Note: ceci est une classe nommée.

Quelle est la classe de Metaclass? Comme vous pouvez vous attendre (ou non) c'est Metaclass class. Dont, comme vous pouvez vous y attendre, la classe est de nouveau Metaclass.

Ceci est la première circularité. Un autre que j'ai trouvé plutôt ésotérique au début (bien sûr, maintenant je mange des métaclasses pour le petit déjeuner) est le suivant:

Quelle est la superclasse de String? Object (éventuellement, différentes implémentations de Smalltalk ont ​​différentes hiérarchies de classe de ces classes de base).Quelle est la superclasse de Object? nil. Maintenant, c'est une réponse intéressante dans Smalltalk, parce que c'est un objet! nil class répond UndefinedObject. Dont la superclasse est ... Object.

Navigation dans la superclasse et par exemple des relations était un vrai tour de rollercoster pour moi dans ces jours ...

+0

Dans Squeak, les sous-classes 'Object'' ProtoObject', qui sous-classe 'nil'. 'nil' est un' UndefinedObject', sous-classe 'Object'. Votre point reste cependant :) –

+0

Il y a un autre endroit à regarder: quelle est la superclasse de la classe d'objet ... – blabla999

3

J'ai toujours aimé la Quine Smalltalk:

quine 
    ^thisContext method getSource 

(Version Pharo .)

4

que diriez-vous breakpointing sélective (que j'utilise en fait parfois):

foo 
    thisContext sender selector == #bar ifTrue:[ self halt ]. 
    ... 

va se déboguer, mais seulement s'il est appelé depuis la barre. Utile, si foo est appelé à partir de zillion d'autres endroits et un point d'arrêt régulier frappe trop souvent.