[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

return in iterator in lambda

Benjamin Ter kuile

6/2/2009 8:07:00 PM

I want to create a conditional mathematical function as a lambda
structure. Therefore it may be the case that inside an iterative loop,
the result of the function is known and should be returned. By
implementing this it causes trouble. The test code I created looks like:


func = lambda do
for z in [1,2,3]
return 2
end
"something"
end
puts func.call
puts "after call"

This results in a LocalJumpError (Ruby 1.8.6 and 1.8.7). In ruby 1.9 it
works as expected. Is there a proper way of creating a function like
this in ruby < 1.9?

Regards,

Benjamin
--
Posted via http://www.ruby-....

5 Answers

Robert Dober

6/2/2009 8:53:00 PM

0

On Tue, Jun 2, 2009 at 10:06 PM, Benjamin Ter kuile <bterkuile@gmail.com> w=
rote:
> I want to create a conditional mathematical function as a lambda
> structure. Therefore it may be the case that inside an iterative loop,
> the result of the function is known and should be returned. By
> implementing this it causes trouble. The test code I created looks like:
>
>
> func =3D lambda do
> =A0for z in [1,2,3]
> =A0 =A0return 2
> =A0end
> =A0"something"
> end
> puts func.call
> puts "after call"
>
> This results in a LocalJumpError (Ruby 1.8.6 and 1.8.7). In ruby 1.9 it
> works as expected. Is there a proper way of creating a function like
> this in ruby < 1.9?
Yes there is!
Strange you did not ask how though ;)
Well I'll tell you anyway...

s/return/break/

HTH
Robert
>
> Regards,
>
> Benjamin
> --
> Posted via http://www.ruby-....
>
>



--=20
Toutes les grandes personnes ont d=92abord =E9t=E9 des enfants, mais peu
d=92entre elles s=92en souviennent.

All adults have been children first, but not many remember.

[Antoine de Saint-Exup=E9ry]

Robert Dober

6/2/2009 8:55:00 PM

0

On Tue, Jun 2, 2009 at 10:53 PM, Robert Dober <robert.dober@gmail.com> wrot=
e:
> On Tue, Jun 2, 2009 at 10:06 PM, Benjamin Ter kuile <bterkuile@gmail.com>=
wrote:
>> I want to create a conditional mathematical function as a lambda
>> structure. Therefore it may be the case that inside an iterative loop,
>> the result of the function is known and should be returned. By
>> implementing this it causes trouble. The test code I created looks like:
>>
>>
>> func =3D lambda do
>> =A0for z in [1,2,3]
>> =A0 =A0return 2
>> =A0end
>> =A0"something"
>> end
>> puts func.call
>> puts "after call"
>>
>> This results in a LocalJumpError (Ruby 1.8.6 and 1.8.7). In ruby 1.9 it
>> works as expected. Is there a proper way of creating a function like
>> this in ruby < 1.9?
> Yes there is!
> Strange you did not ask how though ;)
> Well I'll tell you anyway...
>
> s/return/break/
>
But why did you put something there, now it does not work anymore :(
Sorry did not see

lambda f do
...each do
break 2
end ||
something
end


> HTH
> Robert
>>
>> Regards,
>>
>> Benjamin
>> --
>> Posted via http://www.ruby-....
>>
>>
>
>
>
> --
> Toutes les grandes personnes ont d=92abord =E9t=E9 des enfants, mais peu
> d=92entre elles s=92en souviennent.
>
> All adults have been children first, but not many remember.
>
> [Antoine de Saint-Exup=E9ry]
>



--=20
Toutes les grandes personnes ont d=92abord =E9t=E9 des enfants, mais peu
d=92entre elles s=92en souviennent.

All adults have been children first, but not many remember.

[Antoine de Saint-Exup=E9ry]

Benjamin Ter kuile

6/2/2009 9:53:00 PM

0

Robert Dober wrote:
> On Tue, Jun 2, 2009 at 10:53 PM, Robert Dober <robert.dober@gmail.com>
> wrote:
>>> �end
>> Well I'll tell you anyway...
>>
>> s/return/break/
>>
> But why did you put something there, now it does not work anymore :(
> Sorry did not see
>
> lambda f do
> ...each do
> break 2
> end ||
> something
> end
>
This will not work for structures like:

data = Array(1..12)
func = lambda do |par|
answer = 0.0
for z in data
answer += Math.log(z)
return 2e22 if answer > 19
end
answer -= data.size*Math.log10(answer)
answer
end
puts func.call 0.2
puts "after call"

I am converting from fortran, which makes it harder to see the easy
elegant solution :)
The function presented is not the real one, but is more like the one I
am trying to implement.
--
Posted via http://www.ruby-....

Joel VanderWerf

6/2/2009 10:11:00 PM

0

Benjamin Ter kuile wrote:
> I want to create a conditional mathematical function as a lambda
> structure. Therefore it may be the case that inside an iterative loop,
> the result of the function is known and should be returned. By
> implementing this it causes trouble. The test code I created looks like:
>
>
> func = lambda do
> for z in [1,2,3]
> return 2
> end
> "something"
> end
> puts func.call
> puts "after call"
>
> This results in a LocalJumpError (Ruby 1.8.6 and 1.8.7). In ruby 1.9 it
> works as expected. Is there a proper way of creating a function like
> this in ruby < 1.9?

Enumerable#find may be more appropriate than #each. This avoids the
issue of how to break out of nested blocks.

func = lambda do |a|
a.find do |z|
z if z >= 1.5
end or "not found"
end

puts func.call([1,2,3])
puts func.call([0,0.2,0.4])

--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

Robert Dober

6/3/2009 6:18:00 PM

0

I am not sure what you want to do?

Do you want to return, than I think the above might work with some
tweaking for the non break case, sorry I was lazy.
Or do you just want to break, but than it will not work in Ruby1.9?

Please avoid "for" it confuses me, please use each for my poor brain ;).
Anyway what about this

catch( x ) do
values.each do
throw your_value if some_condition
end
some more code
end

Nahh, I guess if you refactor this into methods it will just be
simpler ;) or use Joel's #find if you can, that might give some clean
code too :)

Cheers
Robert

--=20
Toutes les grandes personnes ont d=92abord =E9t=E9 des enfants, mais peu
d=92entre elles s=92en souviennent.

All adults have been children first, but not many remember.

[Antoine de Saint-Exup=E9ry]