Thanks!

> On Dec 6, 2014, at 4:47 PM, Bill Allen <[email protected]> wrote:
> 
> By the way, I'm sure I won't be the first to have told you what an awesome 
> language system you've cooked up. 
> 
>> On Saturday, December 6, 2014 4:20:17 PM UTC-5, Bill Allen wrote:
>> Ahh. I see. Thanks.
>> 
>> With the sum function, and by extension any function that deals with 
>> iterables, is it safe to assume they work without allocating storage for the 
>> results of the iterable? Maybe a better question would be, are functions 
>> like filter and sum behaving in a lazy fashion?
>> 
>>> On Saturday, December 6, 2014 12:37:44 PM UTC-5, Stefan Karpinski wrote:
>>> The issue is that comprehensions pre-allocate their storage and therefore 
>>> only work when the thing being iterated over has a length method that can 
>>> tell it how big an array to allocate. You can use the collect function 
>>> instead:
>>> 
>>> julia> collect(@task fib(4000000))
>>> 34-element Array{Any,1}:
>>>        0
>>>        1
>>>        1
>>>        2
>>>        3
>>>        5
>>>        8
>>>       13
>>>       21
>>>       34
>>>       55
>>>       89
>>>      144
>>>      233
>>>      377
>>>      610
>>>      987
>>>     1597
>>>     2584
>>>     4181
>>>     6765
>>>    10946
>>>    17711
>>>    28657
>>>    46368
>>>    75025
>>>   121393
>>>   196418
>>>   317811
>>>   514229
>>>   832040
>>>  1346269
>>>  2178309
>>>  3524578
>>> 
>>> julia> filter(iseven, ans)
>>> 12-element Array{Any,1}:
>>>        0
>>>        2
>>>        8
>>>       34
>>>      144
>>>      610
>>>     2584
>>>    10946
>>>    46368
>>>   196418
>>>   832040
>>>  3524578
>>> 
>>> julia> sum(ans)
>>> 4613732
>>> 
>>> But you can also just use the sum function, which will operate on anything 
>>> iterable:
>>> 
>>> julia> sum(filter(iseven, @task fib(4000000)))
>>> 4613732
>>> 
>>> A while ago I added a bunch of fairly efficient solutions to Project Euler 
>>> problems to the test suite, including #2, but don't click if you don't want 
>>> spoilers:
>>> 
>>> https://github.com/JuliaLang/julia/blob/7dd805feb0/test/euler.jl#L9-L20
>>> 
>>> 
>>>> On Sat, Dec 6, 2014 at 12:04 PM, Bill Allen <[email protected]> wrote:
>>>> To learn julia, I'm working my way through Project Euler. For question #2, 
>>>> I ran into an issue that I haven't found a solution to.
>>>> 
>>>> Given a function that computes fibonacci numbers:
>>>> 
>>>> function fib(n)
>>>>        a,b = 0,1
>>>>        while(a < n)
>>>>            produce(a)
>>>>            a,b=b,a+b
>>>>        end
>>>> end
>>>> 
>>>> I can write a loop that computes the value:
>>>> 
>>>> function fibsum(n)
>>>>            s = 0
>>>>            for x in Task(() -> fib(n))
>>>>                if x % 2 == 0 
>>>>                    s = s + x 
>>>>                end
>>>>            end
>>>>            s
>>>> end
>>>> 
>>>> fibsum(4000000)
>>>> 4613732
>>>> 
>>>> Analogously, one can write:
>>>> 
>>>> s = 0
>>>> for x in [1,2,3] 
>>>>     s = s + x
>>>> end
>>>> println(s)
>>>> 6
>>>> 
>>>> or more succinctly,
>>>> 
>>>> sum([x for x in [1,2,3]])
>>>> 
>>>> But, when I try that with the fib Task:
>>>> 
>>>> sum([x for x in Task(()->fib(10))])
>>>> 
>>>> I get 
>>>> 
>>>> ERROR: `length` has no method matching length(::Task)
>>>>  in anonymous at no file
>>>> 
>>>> Which confuses me sense the task works nicely in an explicit loop.
>>>> 
>>>> Regards,
>>>> Bill
>>> 

Reply via email to