जबकि ट्रेस: & जबकि गलत: हमेशा शून्य वापस आते हैं। उदा। अगर वहाँ एक सामान्य पुनरावर्ती परिभाषा है:
whileTrue: aBlock
^self value ifTrue: [self whileTrue: aBlock]
ifTrue: अगर आत्म मूल्य गलत है शून्य वापस आ जाएगी और इतने मूल्य हमेशा नहीं के बराबर होना चाहिए। यह संकलक के अनुकूलन में परिलक्षित होता है। मूल नीले पुस्तक स्मालटाक-80 V2 परिभाषा
है
whileTrue: aBlock
"Evaluate the argument, aBlock, as long as the value
of the receiver is true. Ordinarily compiled in-line.
But could also be done in Smalltalk as follows"
^self value
ifTrue:
[aBlock value.
self whileTrue: aBlock]
तो बस
BlockContext>>myWhileTrue: aBlock
| start |
start := thisContext pc.
self value ifFalse: [^nil ].
aBlock value.
thisContext pc: start
या करने के लिए अपने के बदलने ??
BlockContext>>myWhileTrue: aBlock
| start |
start := thisContext pc.
^self value ifTrue:
[aBlock value.
thisContext pc: start]
लेकिन इन दुर्घटना वी एम के दोनों अफसोस कुछ समय दूसरी यात्रा क्योंकि thisContext पीसी अगले चरण पर पीसी का उत्तर न मिले, लेकिन इसके बजाय जो कुछ भी ढेर के शीर्ष है :)
हालांकि बाद निम्नलिखित कार्य करता है:
ContextPart methods for controlling
label
^{ pc. stackp }
goto: aLabel
"N.B. we *must* answer label so that the
top of stack is aLabel as it is when we send label"
pc := aLabel at: 1.
self stackp: (aLabel at: 2).
^aLabel
BlockContext>>myWhileTrue: aBlock
| label |
label := thisContext label.
self value ifFalse: [^nil].
aBlock value.
thisContext goto: label
BlockClosure>>myWhileTrue: aBlock
| label |
label := thisContext label.
^self value ifTrue:
[aBlock value.
thisContext goto: label]
स्रोत
2010-08-18 17:48:03
तुम हमेशा एक मदद कर रहे हैं, धन्यवाद लुकास :) –
इस मामले संदर्भ बहाल करने में मूल रूप से अनंत प्रत्यावर्तन के बिना गोटो –
के बराबर है, बयान की एक अनंत संख्या के बिना और बिना एक संदर्भ फिर से शुरू करने की क्षमता असंभव प्रतीत होता है। –