Hallo,
ich versuche mich gerade mit Squeak 4.2 an einem einfachen Beispiel, übernommen aus VisualWorks:
| fak |
fak := [ :n | n = 1 ifTrue: [1] ifFalse: [n * (fak value: n - 1)]].
fak value: 6.
Dabei bekomme ich eine Warnung bzgl. der Verwendung von "fak" innerhalb des Blocks: "fak appears to be undefined at this point. Proceed anyway?" Nach Bestätigung funktioniert das Beispiel wie erwartet (abgesehen davon, dass die Ausgabe von PrintIt an die Stelle erfolgt, wo das Problem bemängelt wurde).
Kann mir bitte jemand sagen, wie eine korrekte Umsetzung des Beispiels in Squeak aussehen würde oder mich an die Stelle schubsen, die ich lesen muss, um selbst drauf zu kommen?
Gruß, Michael
-- View this message in context: http://forum.world.st/Warnung-bei-rekursiver-Ausfuhrung-eines-Blocks-tp38975... Sent from the Deutsch (German) mailing list archive at Nabble.com.
Ist nur eine Warnung, kannst du getrost ignorieren :)
Um die zu vermeiden, kann man vorher ausdrücklich fak auf nil setzen.
- Bert -
On 12.10.2011, at 12:42, Michael Paap mprivat@mpaap.de wrote:
Hallo,
ich versuche mich gerade mit Squeak 4.2 an einem einfachen Beispiel, übernommen aus VisualWorks:
| fak |
fak := [ :n | n = 1 ifTrue: [1] ifFalse: [n * (fak value: n - 1)]].
fak value: 6.
Dabei bekomme ich eine Warnung bzgl. der Verwendung von "fak" innerhalb des Blocks: "fak appears to be undefined at this point. Proceed anyway?" Nach Bestätigung funktioniert das Beispiel wie erwartet (abgesehen davon, dass die Ausgabe von PrintIt an die Stelle erfolgt, wo das Problem bemängelt wurde).
Kann mir bitte jemand sagen, wie eine korrekte Umsetzung des Beispiels in Squeak aussehen würde oder mich an die Stelle schubsen, die ich lesen muss, um selbst drauf zu kommen?
Gruß, Michael
-- View this message in context: http://forum.world.st/Warnung-bei-rekursiver-Ausfuhrung-eines-Blocks-tp38975... Sent from the Deutsch (German) mailing list archive at Nabble.com.
Eigentlich logisch... da hätte ich auch selbst drauf kommen müssen.
Also:
| fak | fak := nil. fak := [ :n | n = 1 ifTrue: [1] ifFalse: [n * (fak value: n - 1)]].
fak value: 6
Besten Dank, Michael
-- View this message in context: http://forum.world.st/Warnung-bei-rekursiver-Ausfuhrung-eines-Blocks-tp38975... Sent from the Deutsch (German) mailing list archive at Nabble.com.
Die "Warnung" kommt nur, wenn der Block deklariert wird: |fak|. Das ist aber im Workspace nicht nötig.
R. Baumann
-- View this message in context: http://forum.world.st/Warnung-bei-rekursiver-Ausfuhrung-eines-Blocks-tp38975... Sent from the Deutsch (German) mailing list archive at Nabble.com.
Am 17.10.2011 12:33, schrieb R. Baumann:
Die "Warnung" kommt nur, wenn der Block deklariert wird: |fak|. Das ist aber im Workspace nicht nötig.
Ah, ok. Ein einfaches
fak := [:n | n = 1 ifTrue: [1] ifFalse: [n * (fak value: n-1)]].
tut es ohen Warnung. Kannst du mir eventuell auch erklären, welche Logi dahinter steckt?
Gruß, Michael
On 17.10.2011, at 12:57, Michael Paap wrote:
Am 17.10.2011 12:33, schrieb R. Baumann:
Die "Warnung" kommt nur, wenn der Block deklariert wird: |fak|. Das ist aber im Workspace nicht nötig.
Ah, ok. Ein einfaches
fak := [:n | n = 1 ifTrue: [1] ifFalse: [n * (fak value: n-1)]].
tut es ohen Warnung. Kannst du mir eventuell auch erklären, welche Logi dahinter steckt?
Der Workspace deklariert Variablen automatisch bei der ersten Verwendung, ohne Warnung. Zumindest wenn "automatically create variable declaration" im Fenstermenü nicht ausgeschaltet ist. Vom selben Menü aus kann man auch die Workspace-Variablen inspizieren. Die behalten ja praktischerweise ihren Wert über mehrere Ausführungen hinweg bei.
- Bert -
Am 17.10.2011 13:02, schrieb Bert Freudenberg:
Der Workspace deklariert Variablen automatisch bei der ersten Verwendung, ohne Warnung.
Ja, das ist prinzipiell schon klar.
Ich bin auch nur auf die Warnung gestoßen, weil wir dasselbe Beispiel für mehrere Smalltalk-Systeme verwenden wollten, und beispielsweise Smalltalk Express die explizite Deklaration verlangt.
Mir erscheint es nur ein wenig seltsam, dass mich Squeak /nicht/ warnt, wenn ich die Variable weder deklariere noch initialisiere, aber meint, mich warnen zu müssen, wenn ich sie explizit deklariere, aber nicht initialisiere.
Falls der dahinterstehende Gedankengang sein sollte
"Wenn der User die Variable schon unnötigerweise explizit deklariert, wollte er sie sicher auch initialisieren und hat das wohl vergessen."
dann kann ich das nicht so ganz nachvollziehen. ;-)
Gruß, Michael
On 17.10.2011, at 13:15, Michael Paap wrote:
Am 17.10.2011 13:02, schrieb Bert Freudenberg:
Der Workspace deklariert Variablen automatisch bei der ersten Verwendung, ohne Warnung.
Ja, das ist prinzipiell schon klar.
Ich bin auch nur auf die Warnung gestoßen, weil wir dasselbe Beispiel für mehrere Smalltalk-Systeme verwenden wollten, und beispielsweise Smalltalk Express die explizite Deklaration verlangt.
Mir erscheint es nur ein wenig seltsam, dass mich Squeak /nicht/ warnt, wenn ich die Variable weder deklariere noch initialisiere, aber meint, mich warnen zu müssen, wenn ich sie explizit deklariere, aber nicht initialisiere.
Falls der dahinterstehende Gedankengang sein sollte
"Wenn der User die Variable schon unnötigerweise explizit deklariert, wollte er sie sicher auch initialisieren und hat das wohl vergessen."
dann kann ich das nicht so ganz nachvollziehen. ;-)
Aus Sicht des Compilers sind die Workspace-Variablen global. Somit brauchen sie weder deklariert noch initialisiert werden.
Die per senkrechter Striche deklarierten Variablen sind temporär. Diese sollten vor Verwendung initialisiert werden, deswegen die Warnung.
- Bert -
squeak-ev@lists.squeakfoundation.org