Reputation: 2364
I am trying to create a method for the existing BlockClosure class. This is a method we wrote on the board in class, but it is not behaving exactly as I'd want it to. This is the code:
BlockClosure extend[
times: count[
count = 0
ifTrue:
[^self value.]
ifFalse:
[self value. self times: count - 1.].
]
].
I tried testing it out by inputting this into the gst interpreter:
st> x:= 5
5
st> y := [x-1] times: 4.
a BlockClosure
But I want y to equal 1 in this case. Why is y's value becoming "a BlockClosure"?
EDIT: The correct times method.
BlockClosure extend[
times: count[
count = 0
ifFalse:
[self value. ^self times: count - 1.].
]
].
Upvotes: 1
Views: 222
Reputation: 24478
First of all, you're missing the ^
in the ifFalse:
branch of the conditional statement, which is preventing the return value from propagating back from the recursive call:
ifFalse:
[self value. ^self times: count - 1]
Secondly, this will actually set y
to 4
instead, because you're computing x - 1
with the same x
value each time. What you probably mean to do is reassign back to x
each time:
y := [x := x - 1] times: 4
Upvotes: 2