NOTE: use Perl; is on undef hiatus. You can read content, but you can't post it. More info will be forthcoming forthcomingly.
All the Perl that's Practical to Extract and Report
Stories, comments, journals, and other submissions on use Perl; are Copyright 1998-2006, their respective owners.
Ouch. Head hurt. Need beer. (Score:2)
Can you give an example of how this might make some code cleaner or more correct?
Re:Ouch. Head hurt. Need beer. (Score:1)
I had to chuckle at your subject. I certainly know the feeling. The upshot is that you can use this to write recursive anonymous closures (avoiding all side-effects).
I did this as an excercise. I am tiptoeing into the functional world proper lately, but my stance to it remains ambivalent. Perl isn’t quite the most beautiful language, but I find it a whoooole lot easier to read than any Lisp. I doubt that will ever change, irrespective of practice – I find your lack of syntax disturbing. This meant I understood the explanations, but couldn’t grok the code samples in enough to detail for more than a superficial grasp. Hence the decision that I would need to redo this in Perl for myself.
I don’t really have a good example on hand where you’d need to do this, or at least could use this to make something much easier. (Maybe I should page MJD here?) I assume that’s because we’re talking about Perl, where statements roam and side effects abound. A schemer could probably come up with a credible use case.
If side effects are not an issue, you can achieve the same much easier in Perl:
(I think: untested. Does weaken return the reference? If not, it gets a good bit more awkward.)
Reply to This
Parent
Re: (Score:1)
Re: (Score:1)
Ah yes, d’uh.
But didn’t you mean your do {} block to return $tmp rather than $f? $f is the weak reference used inside the function, while $tmp is the strong reference you pass back out to the surrounding expression, no?
Re: (Score:1)
Re: (Score:1)
Ah, when you copy a weak reference, the new reference is strong. Learn something new every day…
In any case, the necessary code is rather unwieldy – enough so that I’d rather just use a Y combinator…
Re: (Score:1)
Not precisely... Weaken works on the variable, not the value. This should work:
Re: (Score:1)