Fwd: Call a block inside same block for recursive requirements
gerard wrote
Hi.
Excuse me for my poor english.
I need, for recursive requirements, call a block inside the same block. That's possible on Smalltalk?
For example:
"fibonacci function" [:fnc :n1 :n2 :limit :numbers | numbers add: n1. (n2 < limit) ifTrue: [ fnc valueWithArguments: {fnc . n2 . (n1 + n2) . limit . numbers}. numbers ]].
The objetive is use that block without the :fnc parameter.
Regards
-- View this message in context: http://forum.world.st/Fwd-Call-a-block-inside-same-block-for-recursive-requi... Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.
On 19 January 2013 03:38, Sean P. DeNigris <sean@clipperadams.com> wrote:
gerard wrote
Hi.
Excuse me for my poor english.
I need, for recursive requirements, call a block inside the same block. That's possible on Smalltalk?
Integer>>benchFib
For example:
"fibonacci function" [:fnc :n1 :n2 :limit :numbers | numbers add: n1. (n2 < limit) ifTrue: [ fnc valueWithArguments: {fnc . n2 . (n1 + n2) . limit . numbers}. numbers ]].
The objetive is use that block without the :fnc parameter.
[:param | param >0 ifTrue: [ thisContext closure value: param - 1 ] ] value: 5 but this will be much slower than just use recursion with methods because of thiscontext.
Regards
-- Best regards, Igor Stasenko.
Writing this block := [:val | val >0 ifTrue: [ self logCr: val. block value: val -1 ] ifFalse: [ 'foo' ]]. block value: 3 works in a workspace :) Ben On Jan 19, 2013, at 8:56 PM, Igor Stasenko wrote:
On 19 January 2013 03:38, Sean P. DeNigris <sean@clipperadams.com> wrote:
gerard wrote
Hi.
Excuse me for my poor english.
I need, for recursive requirements, call a block inside the same block. That's possible on Smalltalk?
Integer>>benchFib
For example:
"fibonacci function" [:fnc :n1 :n2 :limit :numbers | numbers add: n1. (n2 < limit) ifTrue: [ fnc valueWithArguments: {fnc . n2 . (n1 + n2) . limit . numbers}. numbers ]].
The objetive is use that block without the :fnc parameter.
[:param | param >0 ifTrue: [ thisContext closure value: param - 1 ]
] value: 5
but this will be much slower than just use recursion with methods because of thiscontext.
Regards
-- Best regards, Igor Stasenko.
On 19 January 2013 21:04, Benjamin <benjamin.vanryseghem.pharo@gmail.com> wrote:
Writing this
block := [:val | val >0 ifTrue: [ self logCr: val. block value: val -1 ] ifFalse: [ 'foo' ]].
block value: 3
works in a workspace :)
well, this is the most trivial example. :) (frankly i didn't even thought about it as a case, because one of the requirements is to not refer to the block via variable).. in this case, you still referring to it, but just moved variable declaration outside of the block scope. But of course, this is most usable form (apart from just using method).
Ben
On Jan 19, 2013, at 8:56 PM, Igor Stasenko wrote:
On 19 January 2013 03:38, Sean P. DeNigris <sean@clipperadams.com> wrote:
gerard wrote
Hi.
Excuse me for my poor english.
I need, for recursive requirements, call a block inside the same block. That's possible on Smalltalk?
Integer>>benchFib
For example:
"fibonacci function" [:fnc :n1 :n2 :limit :numbers | numbers add: n1. (n2 < limit) ifTrue: [ fnc valueWithArguments: {fnc . n2 . (n1 + n2) . limit . numbers}. numbers ]].
The objetive is use that block without the :fnc parameter.
[:param | param >0 ifTrue: [ thisContext closure value: param - 1 ]
] value: 5
but this will be much slower than just use recursion with methods because of thiscontext.
Regards
-- Best regards, Igor Stasenko.
-- Best regards, Igor Stasenko.
On 19 Jan 2013, at 20:56, Igor Stasenko <siguctua@gmail.com> wrote:
[:param | param >0 ifTrue: [ thisContext closure value: param - 1 ]
] value: 5
but this will be much slower than just use recursion with methods because of this context.
This is so cool, Igor. I didn't know about this trick. All in all, writing factorial like this is pretty elegant: [ :n | n < 2 ifTrue: [ 1 ] ifFalse: [ n * (thisContext closure value: n - 1) ] ] value: 5 AFAIK, this is impossible in Lisp like languages. Thanks for teaching us ! Sven -- Sven Van Caekenberghe http://stfx.eu Smalltalk is the Red Pill
participants (4)
-
Benjamin -
Igor Stasenko -
Sean P. DeNigris -
Sven Van Caekenberghe