Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

Re^10: Next Language to Learn (Lazy Perl)

by LanX (Canon)
on Apr 01, 2010 at 17:58 UTC ( #832355=note: print w/ replies, xml ) Need Help??


in reply to Re^9: Next Language to Learn (Lazy Perl)
in thread Next Language to Learn

The lack of side effects is for you of interest for parallel computing or just for theoretical studies?

> Where you write in an imperative language something like $a->[$n]+=$k to update the array element at postition $n, you would in FP (conceptionally) return a copy of the array, which differs from the original one only in the element with index $n.

First of all I have to say that LISP doesn't normally use arrays, the normal approach are linked lists, replacing an element is simply done by manipulating the chain, so no big copies needed.

If you want linked lists and FP mechanisms I strongly recommend reading "Higher Order Perl"!

Then, the default for passing arrays in perl is by copy, so calling f(@$ar) will not effect the original array. And if you wanna pass arrayrefs you still can write f( [@$ar] ) if you - for whatever reason- don't wanna do the copy within the function.

The functionality of splice may be of further interest for you.

Cheers Rolf


Comment on Re^10: Next Language to Learn (Lazy Perl)
Select or Download Code
Re^11: Next Language to Learn (Lazy Perl)
by rovf (Priest) on Apr 06, 2010 at 07:09 UTC
    The lack of side effects is for you of interest for parallel computing or just for theoretical studies?
    Much more egoistic: It's for ease of debugging ;-) It is easier to analyze a program, and consequently to debug it, if you don't have to care about state.

    First of all I have to say that LISP doesn't normally use arrays, the normal approach are linked lists, replacing an element is simply done by manipulating the chain, so no big copies needed.
    It depends what you want to do. All LISPs I came accross so far provide arrays (for instance, using make-array in Common LISP), and whether I use an array or a linked list or a property list or what else, depends on what I want to do with it. This is not different from Perl (or Ruby, or nearly anything else).
    Then, the default for passing arrays in perl is by copy, so calling f(@$ar) will not effect the original array.
    Actually, Perl passes by reference, i.e. f *can* modify the original array; only that most people write their functions in a way that they just affect a copy - but the copying happens at the called side, not at the caller side.
    If you want linked lists and FP mechanisms I strongly recommend reading "Higher Order Perl"!
    Interesting reading indeed. Also has a small chapter about delayed evaluation.
    The functionality of splice may be of further interest for you.
    Not really. Although it does aggreagate update, it (naturally, since it uses eager evaluation) has to make a copy of the whole array....

    -- 
    Ronald Fischer <ynnor@mm.st>

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://832355]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (9)
As of 2014-08-29 10:14 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The best computer themed movie is:











    Results (277 votes), past polls