web-dev-qa-db-fra.com

Comment WhileTetrue: Fonctionne dans SmallTalk?

Je veux savoir comment whileTrue: travaux. J'ai cherché à la mise en œuvre qui est dans BlockClosure:

whileTrue: aBlock 
    ^ [self value] whileTrue: [aBlock value]

Et une autre mise en œuvre sans paramètre:

whileTrue
    ^ [self value] whileTrue: []

Mais je ne sais pas comment cela fonctionne, c'est une méthode récursive, mais cela m'a amené à poser plusieurs questions:

  1. Comment cet appel récursif est-il terminé?
  2. Si [self value] retourne un objet Boolean, pourquoi est whileTrue: Non implémenté dans le type Boolean?
  3. Pourquoi existe-t-il une autre mise en œuvre nommée whileTrue qui ne reçoit tout simplement pas de bloc et évalue self?
5

Mon smalltalk est un peu rouillé, et je n'ai pas de smalltalk installé pour le moment, il pourrait donc y avoir des erreurs de syntaxe ici, mais vous obtenez l'idée:

whileTrue: aBlock
    ↑ self value ifTrue: [aBlock value. self whileTrue: aBlock]

Voici une version in Ruby== que j'ai réellement testé, dont ce qui précède (j'espère) est une traduction:

class Proc
  def vhile(block)
    self.().iff(thn: -> {block.(); vhile(block)})
  end
end

Vous avez besoin des sockeyPatches suivantes pour que les contenus de style SmallTalk soient au travail:

class TrueClass
  def iff(thn:, els: ->{})
    thn.()
  end
end

class FalseClass
  def iff(thn:, els: ->{})
    els.()
  end
end
3
Jörg W Mittag