[Newbies] Teaching Smalltalk

laurent laffont laurent.laffont at gmail.com
Tue May 4 16:23:27 UTC 2010


Cool. I've just understood the 100 doors problem looking at your code. I was
too lazy to try to understand the original one on
http://programming.dojo.net.nz/languages/smalltalk/index :)

Laurent Laffont


On Tue, May 4, 2010 at 5:55 PM, John McKeon <p3anoman at gmail.com> wrote:

> Looking at rosettacode <http://rosettacode.org/wiki/100_doors> most
> languages look nearly identical (or, at the very least, ugly/crappy) when
> written out procedurely so that one might end up deciding to just stick with
> C.
>
> I know I am going off the deep end a bit, but the whole answer to "why
> Smalltalk?" lies in the fact that problems should/would be approached in a
> completely different manner. As I am sure they would in most of the other
> languages if one were not restricted to 20 or so lines of code.
>
> Since it is example code, at least in the case of Smalltalk, an object
> oriented solution would be in order - i.e. show how it would be solved using
> "everything is an object". Unfortunately, it doesn't really fit into "a few
> lines of code" to display on a page (even though the classes/objects and
> code required to implement them is little more than a few lines). And you
> also don't get any feel for the great tools. Perhaps, some insight into how
> one would run the code in Java/Eclipse, or Visual C <chuckle> with all the
> includes and project setup, etc might be a useful addition to the
> comparisons...
>
> Object subclass: #Corridor
>     instanceVariableNames: 'doors count'
>     classVariableNames: ''
>     poolDictionaries: ''
>     category: '100Doors'
>
> initialize: anInteger
>     "initialize the receiver with the given number of doors"
>     count := anInteger.
>     doors := OrderedCollection new.
>     anInteger timesRepeat: [ doors add: Door new ]
>
> pass
>     "iterate over the doors"
>     1 to: count do: [ :i | self passBy: i ]
>
> passBy: anInteger
>     "if the nth door is open close it otherwise open it"
>     doors by: anInteger do: [ :door | door toggle ]
>
> printOn: aStream
>     "print  the open doors"
>     aStream cr.
>     doors withIndexDo: [ :door :i | door isOpen ifTrue: [ aStream
> nextPutAll: i asString, ' is open'; cr ]]
>
> Corridor class
>
> pass: anInteger
>     "return a new Corridor with the given number of doors that has been
> passed thru"
>     ^self new
>         initialize: anInteger;
>         pass
>
>
> ==================================================================
>
> Object subclass: #Door
>     instanceVariableNames: 'isOpen'
>     classVariableNames: ''
>     poolDictionaries: ''
>     category: '100Doors'
>
> isOpen
>     "Answer the value of isOpen"
>     ^ isOpen
>
> toggle
>     "if the receiver is open close it else open it"
>     isOpen := isOpen not
>
> initialize
>     "initialize the receiver to be closed"
>     super initialize.
>     isOpen := false
>
> ===========================================================
> Patch to iterate over a collection by each nth item
>
> OrderedCollection>>by: anInteger do: aBlock
>     | index |
>     index := anInteger.
>     [index <= lastIndex]
>         whileTrue:
>             [aBlock value: (array at: index).
>             index := index + anInteger]
>
>
> Probably silly for the problem given but just my 2 cents
> John
>
>
> --
> http://john-mckeon.us/seaside
>
> _______________________________________________
> Beginners mailing list
> Beginners at lists.squeakfoundation.org
> http://lists.squeakfoundation.org/mailman/listinfo/beginners
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/beginners/attachments/20100504/c5ba1a66/attachment.htm


More information about the Beginners mailing list