[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