[Newbies] Modify block (closure) parameters

Louis LaBrunda Lou at Keystone-Software.com
Tue Aug 6 21:14:12 UTC 2013


Hi Guys,

FWIW, VA Smalltalk doesn't allow changing block arguments.

Lou

On Tue, 6 Aug 2013 13:42:33 -0700, Casey Ransberger
<casey.obrien.r at gmail.com> wrote:

>I didn't read your post clearly enough. Yep, that would seem odd. You may
>have a bug there. I'm not sure why that happens. It looks like the outer
>context isn't taking the assignment, but hanging onto the initial value it
>receives from #value:.
>
>I'm not totally sure we should expect to be able to do what you're trying
>to do in modern Squeak. I haven't assigned to a block arg in a long time (I
>keep allow block assignments off unless I'm loading old code.) I don't know
>what the status is there. I run a relatively recent Cog VM on a 10.7.5 Mac
>and I'm seeing the same behavior in Squeak 4.4.
>
>When I switch to an old VM (3.8.18Beta3U) and run Squeak 3.0, your snippet
>works as expected. I'm not sure if this is in the image or the VM yet, or
>whether it's expected behavior or not with allowBlockArgumentAssignment
>(Again, I usually turn it off.)
>
>The main take away here is, don't do that:) as it's a back-compat feature
>and it really ought to have a big sign on it that says DEPRECATED. If
>you're trying to load some older code and running into this, it might be
>better to actually rewrite it not to assign to block arguments in my
>opinion (and maybe I'm nuts.)
>
>Can you tell me what VM you're using?
>
>Smalltalk vmVersion "this will tell us"
>
>And also which version of Squeak?
>
>SmalltalkImage current systemInformationString "ditto"
>
>Also, what's the OS of the host system?
>
>
>
>On Mon, Aug 5, 2013 at 1:44 AM, psea <denis.lukichev at gmail.com> wrote:
>
>> Hi Smalltalkers!
>>
>> Here is a question I can't find answer with google.
>> In short: Does block parameters and block local variables are the same
>> thing
>> (semantically) inside closure? It looks like it's not. Below the
>> explanation.
>>
>> ===================
>> Here is the accumulator function (first attempt):
>>
>> makeAcc := [ :acc |
>>         [:n | acc:=acc+n. acc]]
>>
>> It turns out it doesn't work as intended:
>>
>> a1 := makeAcc value: 10
>> a1 value: 1 => 11
>> a1 value: 1 => 11
>> a1 value: 2 => 12
>>
>> ====================
>> Here is the second attempt:
>>
>> makeAcc := [ :acc |
>>         | total |
>>         total:=acc.
>>         [:n | total:=total+n. total]]
>>
>> And it does work as intended:
>>
>> a1 := makeAcc value: 10
>> a1 value: 1 => 11
>> a1 value: 1 => 12
>> a1 value: 2 => 14
>>
>> So if we use the local variable to store accumulator it works as it should
>> and remembers the value between function (block) calls. But if we use block
>> parameter to store the value of accumulator it does not remembers the value
>> between calls.
>> Why is it so?
>>
>> P.S. Sorry for my English. I do all my best.
>>
>>
>>
>> --
>> View this message in context:
>> http://forum.world.st/Modify-block-closure-parameters-tp4702118.html
>> Sent from the Squeak - Beginners mailing list archive at Nabble.com.
>> _______________________________________________
>> Beginners mailing list
>> Beginners at lists.squeakfoundation.org
>> http://lists.squeakfoundation.org/mailman/listinfo/beginners
>>
-----------------------------------------------------------
Louis LaBrunda
Keystone Software Corp.
SkypeMe callto://PhotonDemon
mailto:Lou at Keystone-Software.com http://www.Keystone-Software.com



More information about the Beginners mailing list