Hat Squeak 4.1 wirklich "full closures"?

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Hat Squeak 4.1 wirklich "full closures"?

R. Baumann
Im "Welcome workspace" von Squeak 4.1 lesen wir:

"Squeak 4.1 includes the closure implementation from Cog as a prerequisite for full Cog adoption later. With this implementation Squeak finally has 'full' closures, allowing classic recursive examples ...".

Betrachten wir folgendes Beispiel (Summe der echten Teiler einer Zahl):

teilersumme := [:zahl | |p g s |
        p := 2. g := zahl // 2. s := 1.
        [p < g] whileTrue: [
                p * g = zahl ifTrue: [s := s + p + g].
                p := p + 1. g := zahl // p.
                ]. "Ende whileTrue"
         p * p = zahl ifTrue: [s := s + p].
   ^s]. "Ende Teilersumme"

ts := teilersumme value: 1024.
ts (Strg-P) liefert 1023 (korrekt!)

Aber Transcript show: ts (Strg-D) liefert nichts (das Transcriptfester bleibt leer) - nicht mal eine Fehlermeldung!

Was soll man davon halten? Wer ist hier zuständig?
wen (von der internationalen Entwicklergemeinschaft) kann man diesbezüglich ansprechen?

Ratlos

R. Baumann
Reply | Threaded
Open this post in threaded view
|

Re: Hat Squeak 4.1 wirklich "full closures"?

Bert Freudenberg
On 25.07.2010, at 04:21, R. Baumann wrote:

> Im "Welcome workspace" von Squeak 4.1 lesen wir:
>
> "Squeak 4.1 includes the closure implementation from Cog as a prerequisite
> for full Cog adoption later. With this implementation Squeak finally has
> 'full' closures, allowing classic recursive examples ...".
>
> Betrachten wir folgendes Beispiel (Summe der echten Teiler einer Zahl):

Dieses Beispiel funktioniert auch ohne "full closures", da der Block nicht mehrfach ausgewertet wird.

> teilersumme := [:zahl | |p g s |
> p := 2. g := zahl // 2. s := 1.
> [p < g] whileTrue: [
> p * g = zahl ifTrue: [s := s + p + g].
> p := p + 1. g := zahl // p.
> ]. "Ende whileTrue"
> p * p = zahl ifTrue: [s := s + p].
>   ^s]. "Ende Teilersumme"
>
> ts := teilersumme value: 1024.
> ts (Strg-P) liefert 1023 (korrekt!)
>
> Aber Transcript show: ts (Strg-D) liefert nichts (das Transcriptfester
> bleibt leer) - nicht mal eine Fehlermeldung!
>
> Was soll man davon halten? Wer ist hier zuständig?

Der Autor des Bespiels - überflüssigerweise wurde ein "non-local return" in den Block eingefügt. Korrekt wäre "s" statt "^s". Das return bewirkt, dass das DoIt an der Stelle abgebrochen wird.

> wen (von der internationalen Entwicklergemeinschaft) kann man diesbezüglich ansprechen?

Alle:

http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/squeak-dev

- Bert -


Reply | Threaded
Open this post in threaded view
|

Re: Hat Squeak 4.1 wirklich "full closures"?

R. Baumann
Vielen Dank für den Rat - es funktioniert jetzt (auch in Squeak 3.9).

R. B.