<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.microsoft.co.il/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">life = code + sleep</title><subtitle type="html" /><id>http://blogs.microsoft.co.il/blogs/dotan/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/dotan/" /><link rel="self" type="application/atom+xml" href="http://blogs.microsoft.co.il/blogs/dotan/atom.aspx" /><generator uri="http://communityserver.org" version="3.1.20917.1142">Community Server</generator><updated>2008-01-15T14:06:00Z</updated><entry><title>Git IS fast!</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/dotan/archive/2008/10/20/git-is-fast.aspx" /><id>http://blogs.microsoft.co.il/blogs/dotan/archive/2008/10/20/git-is-fast.aspx</id><published>2008-10-20T19:32:00Z</published><updated>2008-10-20T19:32:00Z</updated><content type="html">&lt;p&gt;If you happened to catch all of the fuss about &lt;a href="http://git.or.cz/"&gt;Git &lt;/a&gt;lately, you might also have heard Linus Torvalds bragging about it (literally bragging). And you might have, like me, dismissed it as another of those linux against the world moments (as a side note: nothing against linux, using ubuntu, freebsd, and osx myself atm.).&lt;/p&gt;  &lt;p&gt;Well the win32 native binaries went out not long ago, and i gave it a try, it didn’t take long until Linus Torvalds’ image in my mind jumped a few steps, everything he bragged about was true, Git IS THAT GOOD.&lt;/p&gt;  &lt;p&gt;I’m now considering doing what i always planned but never had the guts to do – version my entire /work area, which might include documents, media, _and_ code.&lt;/p&gt;  &lt;p&gt;Anyone unfamiliar with Git, its a new open-source distributed versioning system (like bazaar, mercurial), here are some links:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://git-scm.com/download"&gt;Get it&lt;/a&gt;, &lt;a href="http://www.spheredev.org/wiki/Git_for_the_lazy"&gt;understand&lt;/a&gt; it, &lt;a href="http://zrusin.blogspot.com/2007/09/git-cheat-sheet.html"&gt;remember&lt;/a&gt; it, try hosting it &lt;a href="http://gitorious.org/"&gt;here&lt;/a&gt; and &lt;a href="http://github.com/"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=155620" width="1" height="1"&gt;</content><author><name>dotan</name><uri>http://blogs.microsoft.co.il/members/dotan.aspx</uri></author><category term="TECH" scheme="http://blogs.microsoft.co.il/blogs/dotan/archive/tags/TECH/default.aspx" /><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/dotan/archive/tags/DEV/default.aspx" /></entry><entry><title>Browser History &amp; Bookmarking</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/dotan/archive/2008/10/20/browser-history-amp-bookmarking.aspx" /><id>http://blogs.microsoft.co.il/blogs/dotan/archive/2008/10/20/browser-history-amp-bookmarking.aspx</id><published>2008-10-20T19:08:00Z</published><updated>2008-10-20T19:08:00Z</updated><content type="html">&lt;p&gt;I’ve been wanting to implement a solution for this problem:   &lt;br /&gt;When i’m working on a problem, naturally i can go through gazillion of sites, when the problem is solved, there will be no record of traceback for references for that problem.    &lt;br /&gt;namely, if i ever want to solve it again, or re-check it, i will have to do the browser history traceback dance, will not find what i want, and do the research all over again from scratch.&lt;/p&gt;  &lt;p&gt;I needed either of these two solutions.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;one:&lt;/b&gt; add the option to group history entries by a &lt;i&gt;time radius&lt;/i&gt;, so that, the group of urls visited &amp;#39;”this afternoon” would be grouped together, maybe draggable to somewhere so i could save it in an email or text under “problem XYZ”.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;two:&lt;/b&gt; hook something ALOT more powerful than browser history between my browser and sites i visit. something like a subconscious del.icio.us.&lt;/p&gt;  &lt;p&gt;Well of the two options i found several solutions to the latter:&lt;/p&gt;  &lt;p&gt;1. &lt;a href="http://www.google.com/psearch"&gt;Google Web History&lt;/a&gt;    &lt;br /&gt;2. &lt;a href="http://www.hooeey.com/"&gt;hooeey&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Have fun!&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=155617" width="1" height="1"&gt;</content><author><name>dotan</name><uri>http://blogs.microsoft.co.il/members/dotan.aspx</uri></author><category term="TECH" scheme="http://blogs.microsoft.co.il/blogs/dotan/archive/tags/TECH/default.aspx" /></entry><entry><title>Book Review: Emotional Design</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/dotan/archive/2008/10/20/book-review-emotional-design.aspx" /><id>http://blogs.microsoft.co.il/blogs/dotan/archive/2008/10/20/book-review-emotional-design.aspx</id><published>2008-10-20T18:55:17Z</published><updated>2008-10-20T18:55:17Z</updated><content type="html">&lt;p&gt;I’ve decided to try and polish up aspects of my design knowledge. This included the long overdue read of &lt;a href="http://www.amazon.com/Emotional-Design-Love-Everyday-Things/dp/0465051367"&gt;Emotional Design: Why We Love Or Hate Everyday&lt;/a&gt; Things.&lt;/p&gt;  &lt;p&gt;Firstly it’s a lightweight book (272pgs), and its written lucidly so I finished reading it in an evening. &lt;a href="http://www.amazon.com/exec/obidos/search-handle-url/ref=ntt_athr_dp_sr_1?%5Fencoding=UTF8&amp;amp;search-type=ss&amp;amp;index=books&amp;amp;field-author=Donald%20A.%20Norman"&gt;The author&lt;/a&gt; have put out some very respectable ideas IMHO, and overall it is a slightly mind opening text, its worth the time so i’d grade it&lt;strong&gt; 4/5&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;spoiler alert&lt;/strong&gt;      &lt;br /&gt;One of the things that I liked about his ideas and i’d like to share with, is something that i’ve always known and used but could never tag with the correct title.       &lt;br /&gt;He claims good design is built upon visceral, behavioral and reflective attributes. While the first two are obvious (beauty and function) the last one isn’t.      &lt;br /&gt;      &lt;br /&gt; Reflection would be, for example, the ability of a person to socialize using the item you design – you should always put something in that will allow people to socialize with. There is a point designing a car that is both good looking and functional but why not overprice it? (ferrari), why not make it really cute? (mini, beatle), why not make it vulgar/manly (hummer). This is the value of reflective design.&lt;/p&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=155609" width="1" height="1"&gt;</content><author><name>dotan</name><uri>http://blogs.microsoft.co.il/members/dotan.aspx</uri></author></entry><entry><title>Reading Books</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/dotan/archive/2008/10/12/reading-books.aspx" /><id>http://blogs.microsoft.co.il/blogs/dotan/archive/2008/10/12/reading-books.aspx</id><published>2008-10-12T05:15:36Z</published><updated>2008-10-12T05:15:36Z</updated><content type="html">&lt;p&gt;Lately I’ve been managing to read a lot of books. In order to achieve more in less time I’ve tried speed reading, however that doesn’t really work well with technical texts where mostly you need to stop and think about connecting things you’ve learnt. &lt;/p&gt;  &lt;p&gt;However its been a long time that I’m using what I would call no-bullshit-reading. In this so called method, I’m&lt;em&gt; &lt;/em&gt;&lt;strong&gt;impatiently skipping the filler material in pages&lt;/strong&gt; and &lt;strong&gt;visually scan the page&lt;/strong&gt; for the actually knowledge bits. &lt;strong&gt;I never read a whole paragraph – start right in the middle, and if you need&amp;#160; - work back or forward&lt;/strong&gt;. You’d be amazed how much bullshit there is in even the highly respected technical works. I don’t think it is done intentionally. Think about it, when you discover something great, you _have_ to pad it with your own stuff.&lt;/p&gt;  &lt;p&gt;Now look at the bolds. This is what I would read in this entire blog post :).&lt;/p&gt;  &lt;p&gt;To sum up:&lt;/p&gt;  &lt;p&gt;* never start reading at the beginning, never finish at the end.   &lt;br /&gt;* always look for the point, skip filler material – there is no need to read about the author’s friend that used X and Y and that’s why I’m showing you Z. just skip to the showing you Z part.    &lt;br /&gt;* the key is learning to identify those parts.&lt;/p&gt;  &lt;p&gt;I was able to read 3 books in the span of 4 days, total pages well over 1000.   &lt;br /&gt;I’ll publish reviews once my opinion solidifies :)&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=152586" width="1" height="1"&gt;</content><author><name>dotan</name><uri>http://blogs.microsoft.co.il/members/dotan.aspx</uri></author></entry><entry><title>Book Reviews</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/dotan/archive/2008/09/14/book-reviews.aspx" /><id>http://blogs.microsoft.co.il/blogs/dotan/archive/2008/09/14/book-reviews.aspx</id><published>2008-09-14T09:47:00Z</published><updated>2008-09-14T09:47:00Z</updated><content type="html">&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Working Effectively with Legacy Code&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Misleading title. Should be called ‘Fowler’s Refactoring + Meyer’s OOP + Mumblings’. I wouldn’t like to say I don’t recommend this one, since a lot of people found it useful – which is why I picked it up. However, to me its a time waster, everything this guy says is either obvious, blurry, or an idea from another book.&lt;/p&gt;  &lt;p&gt;His ‘techniques’ are things that you already do subconsciously while refactoring code, and they’re really so straight forward they’re intuitive to do. example: how do you test a private method – his solution, is make it public, or &lt;b&gt;rethink your design&lt;/b&gt;. I just “love” the rethink your design answer.&lt;/p&gt;  &lt;p&gt;I’m not afraid stating that a book s#$%, books are the biggest time wasters when they don’t give you anything new or useful.&lt;/p&gt; &lt;br /&gt;&lt;p&gt;&lt;b&gt;Practices of an Agile Developer&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;This book however was great. Its a light read, very fluid, nice examples. What I liked about it is some of the agile practices it offered to consider, like CI and code ownership, as well as something I already did but didn’t know it was called that way – a ‘daylog’. A daylog is where engineers (in other, more materialistic forms of engineering) keep their problems and solutions log, things that they stumbled on through out the day. The author recommends keeping such in a wiki, available to the whole team.&lt;/p&gt;  &lt;p&gt;The author also isn’t afraid to cover awkward situations, like how do you behave when you join a new team? how do you fight the urge to point out mistakes in other’s code? how do you keep meetings short? how do you deal with management?&lt;/p&gt;  &lt;p&gt;This one covers so much, in such a summarized form that its able to be straight to the point and be a weekend read easily.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Release It!&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Seems to be a great continuation to Practices of an Agile Developer. The title here is misleading too, it should be called ‘Real world practices: the missing manual’. This book is priceless, finally someone went in there and covered real world applications pitfalls, and not only that, he went ahead and formalized a set of patterns and anti-patterns which we all engineers have grown to like. Among the pitfalls the author identifies common software ‘cracks’ – for example, in order to identify weak points in an massively consumed application, you would need to go over integration points – between systems. You would also need to take a better look at anything that involves resources. He shows real world failures, as well as a bearable analysis of them. The patterns are cataloged in a neat way too.&lt;/p&gt;  &lt;p&gt;I’m half way through and I’m fascinated, this book would be the best present a developer can get these days – so get it &lt;b&gt;NOW&lt;/b&gt;.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=139486" width="1" height="1"&gt;</content><author><name>dotan</name><uri>http://blogs.microsoft.co.il/members/dotan.aspx</uri></author><category term="languages" scheme="http://blogs.microsoft.co.il/blogs/dotan/archive/tags/languages/default.aspx" /><category term="programming" scheme="http://blogs.microsoft.co.il/blogs/dotan/archive/tags/programming/default.aspx" /><category term="OFFTOPIC" scheme="http://blogs.microsoft.co.il/blogs/dotan/archive/tags/OFFTOPIC/default.aspx" /></entry><entry><title>Embedding Boo, IronPython</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/dotan/archive/2008/09/07/embedding-boo-ironpython.aspx" /><id>http://blogs.microsoft.co.il/blogs/dotan/archive/2008/09/07/embedding-boo-ironpython.aspx</id><published>2008-09-07T06:54:00Z</published><updated>2008-09-07T06:54:00Z</updated><content type="html">&lt;p&gt;I sat today to take a look at &lt;a href="http://boo.codehaus.org"&gt;Boo&lt;/a&gt;, since &lt;a href="http://www.ayende.com/"&gt;Oren Eini&lt;/a&gt; is so fond of it. The concept was nice, and it took me several hours of comparisons to see in which situations using Boo is preferable to using &lt;a href="http://www.codeplex.com/IronPython"&gt;IronPython&lt;/a&gt;, and the other way around. It occurred to me that perhaps Boo was created when IronPython wasn’t mature enough – whatever the reason, I’m not sure.&lt;/p&gt;  &lt;p&gt;In short, I didn’t come to a conclusion.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;But I did have some fun. I played with the thought that using python’s native dictionary initialization syntax would be nice as a configuration file syntax (e.g. ini files).&lt;/p&gt;  &lt;p&gt;So I whipped a sample project that would embed both Boo and IronPython and looked at the differences with usage. So far I’m liking IronPython better.&lt;/p&gt;  &lt;p&gt;This example is ridiculously simple, but you can go ahead and tinker with the engines, its a good timekiller :).&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;here is &lt;a href="http://paracode.com/files/booproj.zip"&gt;a link to the project&lt;/a&gt;. you will need to update the references to your own local Boo and IronPython (1.x) binaries.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=135159" width="1" height="1"&gt;</content><author><name>dotan</name><uri>http://blogs.microsoft.co.il/members/dotan.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/dotan/archive/tags/DEV/default.aspx" /></entry><entry><title>RE:yield</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/dotan/archive/2008/06/06/re-yield.aspx" /><id>http://blogs.microsoft.co.il/blogs/dotan/archive/2008/06/06/re-yield.aspx</id><published>2008-06-06T17:36:03Z</published><updated>2008-06-06T17:36:03Z</updated><content type="html">&lt;p&gt;Replying to &lt;a href="http://blogs.microsoft.co.il/blogs/shayf/archive/2008/06/06/give-way-to-the-yield-keyword.aspx"&gt;this post&lt;/a&gt; about the use of &lt;strong&gt;yield&lt;/strong&gt;, here is an everyday practical example: split a string to lines of text (by newline).&lt;/p&gt;  &lt;p&gt; (I do like comparisons, so here’s the Python version too):&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;C#(xUnit)&lt;/font&gt;&lt;/p&gt;  &lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;max-height:200px;"&gt;   &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;     &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; IEnumerable&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt; SplitLines(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; input)&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;while&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; idx = input.IndexOf(Environment.NewLine); &lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (idx &amp;lt; 0)&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;         {&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;yield&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; input;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;break&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;         } &lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;yield&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; input.Substring(0, idx);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;         input = input.Substring(idx + Environment.NewLine.Length);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;font size="4"&gt;Python&lt;/font&gt;&lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;max-height:200px;"&gt;
  &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; def split(str):&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;while&lt;/span&gt; True:&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;         idx = str.find(&lt;span style="color:#006080;"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;(idx &amp;lt; 0):&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;yield&lt;/span&gt; str&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;break&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;         &lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;yield&lt;/span&gt; str[0:idx]&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;         str = str[idx+1 :]&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Sorry, &lt;strong&gt;Ruby&lt;/strong&gt;’s idiom of yielding is a bit twisted. It will not create a generator.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=100046" width="1" height="1"&gt;</content><author><name>dotan</name><uri>http://blogs.microsoft.co.il/members/dotan.aspx</uri></author></entry><entry><title>Back From The Dead</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/dotan/archive/2008/06/06/back-from-the-dead.aspx" /><id>http://blogs.microsoft.co.il/blogs/dotan/archive/2008/06/06/back-from-the-dead.aspx</id><published>2008-06-06T17:24:21Z</published><updated>2008-06-06T17:24:21Z</updated><content type="html">&lt;p&gt;Recovered from a major HDD crash and data loss.&lt;/p&gt;  &lt;p&gt;Anyway, here’s a quick fun snippet, looking at the idioms and code size of Python vs Ruby: Getting the histogram of an english text. You can try this on &lt;a href="http://www.gutenberg.org/etext/36"&gt;some text of your choice&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Python&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;max-height:200px;"&gt;   &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;     &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; import sys,re,collections&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; ct=0;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; expr = re.compile(&lt;span style="color:#006080;"&gt;&amp;#39;\w&amp;#39;&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; f_obj = open(sys.argv[1])&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt; dict = collections.defaultdict(&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; line &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; f_obj:&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; match &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; expr.finditer(line):&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;         ct +=1&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;         dict[match.group(0)] += 1&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt; from &lt;span style="color:#0000ff;"&gt;operator&lt;/span&gt; import itemgetter&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt; dict = sorted(dict.items(), key=itemgetter(1),reverse=True)&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (letter, &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;) &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; dict:&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt;     print &lt;span style="color:#006080;"&gt;&amp;quot;%s\t%f%%\t[%s/%d]&amp;quot;&lt;/span&gt; % (letter,&lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;*100.0/ct, &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;, ct)&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="4"&gt;&lt;strong&gt;Ruby&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;max-height:200px;"&gt;
  &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; dict = {}&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; dict.&lt;span style="color:#0000ff;"&gt;default&lt;/span&gt; = 0&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; ct = 0&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; open(ARGV[0]) &lt;span style="color:#0000ff;"&gt;do&lt;/span&gt; | f |&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;while&lt;/span&gt; c = f.read(1) &lt;span style="color:#0000ff;"&gt;do&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; c =~ /\w/&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;         ct += 1&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;         dict[c] += 1&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;     end&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;   end&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt; end&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt; dict.sort{|a,b| b[1]&amp;lt;=&amp;gt;a[1]}.each { &lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;    |key,&lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;| print &lt;span style="color:#006080;"&gt;&amp;quot;%s\t%f%%\t[%d/%d]\n&amp;quot;&lt;/span&gt; %&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;         [key, &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;*100.0/ct, &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;, ct]}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;font size="4"&gt;So who won?&lt;/font&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=100040" width="1" height="1"&gt;</content><author><name>dotan</name><uri>http://blogs.microsoft.co.il/members/dotan.aspx</uri></author></entry><entry><title>Functional Language Pit Part II: C# and Ruby</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/dotan/archive/2008/01/22/functional-language-pit-part-ii-c-and-ruby.aspx" /><id>http://blogs.microsoft.co.il/blogs/dotan/archive/2008/01/22/functional-language-pit-part-ii-c-and-ruby.aspx</id><published>2008-01-22T17:34:00Z</published><updated>2008-01-22T17:34:00Z</updated><content type="html">
&lt;p&gt;In the &lt;a href="http://blogs.microsoft.co.il/blogs/dotan/archive/2008/01/17/language-pit-part-i-f-ruby.aspx"&gt;first part of the series&lt;/a&gt;, I examined Newton-Lagrange interpolation, using functional language idioms. So far only F# have been put to the pit, but now &lt;a href="http://www.ruby-lang.org/"&gt;Ruby&lt;/a&gt; and C# have dropped in. &lt;b&gt;Geek alert&lt;/b&gt;: this post might become text-intensive and boring, however looking at the code itself should be enough to get the groove.&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Ruby&lt;/h3&gt;
&lt;p&gt;
This is everyone&amp;#39;s favorite &lt;i&gt;toy&lt;/i&gt;. And it has a good reason to be - it has most of the idioms functional languages use (and you&amp;#39;ll see that by comparing the F# code), it has a lot of syntactic sugar, advanced constructs like meta-programming and closures, and all of that with minimal requirements from the programmer, in short - it stands out of your way very effectively. It &lt;i&gt;flows&lt;/i&gt;. The first time I&amp;#39;ve tried Ruby was with the first &lt;a href="http://www.rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt; rush (several years ago).&lt;/p&gt;

&lt;p&gt;So, lets jump to the code and right after it I&amp;#39;ll briefly explain things.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Math&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;newton_lagrange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xdata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ydata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="n"&gt;divdif&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;proc&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;br /&gt;	&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;br /&gt;		&lt;span class="n"&gt;ydata&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;br /&gt;	&lt;span class="k"&gt;else&lt;/span&gt;&lt;br /&gt;		&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;divdif&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;divdif&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;       &lt;span class="p"&gt;         (&lt;/span&gt;&lt;span class="n"&gt;xdata&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;]-&lt;/span&gt;&lt;span class="n"&gt;xdata&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;	&lt;span class="k"&gt;end&lt;/span&gt;&lt;br /&gt; &lt;span class="k"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="n"&gt;divdifs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;.&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;xdata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;divdif&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;br /&gt; &lt;span class="n"&gt;xdata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;divdifs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;px&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="n"&gt;xdata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;upto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;xdata&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt; &lt;br /&gt;&lt;span class="n"&gt;ydata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;xdata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;br /&gt;&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;newton_lagrange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xdata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ydata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
So there are several constructs here, that compensate and fill up for F#&amp;#39;s capabilities with functional programming. Firstly and most importantly are &lt;i&gt;Ruby Blocks.&lt;/i&gt; In ruby (and Scala, as we will see later) you can attach closures to code sections.&lt;/p&gt;

&lt;p&gt; This means, that the code, internally, can access its attached codeblock and execute it at will. A codeblock can also define an anonymous function/lambda/closure for you, which leads us to the first section of the code.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;pre&gt;&lt;b&gt;&lt;span class="n"&gt;divdif&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;proc&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;&amp;lt;params&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;/b&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;b&gt;....&amp;lt;codeblock&amp;gt;&lt;/b&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;b&gt;end&lt;/b&gt;&amp;nbsp;&lt;/pre&gt;
divdif is our familiar divided differences procedure from earlier on. Over here we&amp;#39;re defining it as a closure, and we&amp;#39;re explicitly calling it inside, since this is how we would imitate a letrec.&amp;nbsp;

&lt;p&gt;
The second portion of the code is nifty and easy. &lt;/p&gt;

&lt;p&gt;We activate our closure by &lt;i&gt;map&lt;/i&gt;ping 0..K where K is some integer of our range, then we&amp;#39;ll take each value and execute divdiv(0, val) just like we did in F# by currying.
Next comes the part thats supposed to compensate for F#&amp;#39;s advanced folding abilities. &lt;/p&gt;

&lt;p&gt;We essentially take two lists, zip ((1 2), (3 4) =&amp;gt; ((1 3) (2 &amp;nbsp;4)) them together, and do a regular one-list fold (called &lt;i&gt;inject &lt;/i&gt;in Ruby).&lt;/p&gt;

&lt;p&gt;
Last but not least is Ruby&amp;#39;s range-generation syntax: num.upto(othernum) which is natural and cool. One more note, in the code we can see another syntactical sugar, {} attached to the same line, is the same codeblock we talked about just presented differently.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;C# (3.0)&lt;/h3&gt;
&lt;p&gt;I&amp;#39;ve put 3.0 in parens, because even if I did or did not use its features, I belive its still a considerate step towards functionalism that it deserves its own respect.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;So, lets take a look at the code, this is more verbose, but we&amp;#39;ll discuss it after the break. Another note, beware of usage of Extension methods which may not seem obvious at first.&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;div style="font-family:Consolas;font-size:10pt;color:black;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span&gt;Program&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;{&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;delegate&lt;/span&gt; &lt;span style="color:blue;"&gt;double&lt;/span&gt; &lt;span&gt;NumericDelegate&lt;/span&gt;(&lt;span style="color:blue;"&gt;int&lt;/span&gt; s, &lt;span style="color:blue;"&gt;int&lt;/span&gt; e); &lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Main(&lt;span style="color:blue;"&gt;string&lt;/span&gt;[] args)&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;&lt;span style="color:blue;"&gt;double&lt;/span&gt;&amp;gt; Y = &lt;span style="color:blue;"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color:blue;"&gt;double&lt;/span&gt;&amp;gt;();&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;&lt;span style="color:blue;"&gt;double&lt;/span&gt;&amp;gt; X;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;//see also Sequence.Range.&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; X = (-5.0).UpTo(5.0);&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; X.ForEach(x =&amp;gt; Y.Add(1.0 / (Math.Cos(2.0 * x) + Math.Pow(x, 2.0))));&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&lt;/span&gt;&amp;nbsp;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;13&lt;/span&gt;&amp;nbsp;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;14&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(NewtonLagrange(X, Y, 3.16));&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;16&lt;/span&gt;&amp;nbsp;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;17&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;double&lt;/span&gt; NewtonLagrange(List&amp;lt;&lt;span style="color:blue;"&gt;double&lt;/span&gt;&amp;gt; X, List&amp;lt;&lt;span style="color:blue;"&gt;double&lt;/span&gt;&amp;gt; Y, &lt;span style="color:blue;"&gt;double&lt;/span&gt; px)&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;18&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;19&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;&lt;span style="color:blue;"&gt;double&lt;/span&gt;&amp;gt; divdifs = Enumerable.Range(0, X.Count).ToList().Select(x =&amp;gt; divdif(0, x, X, Y)).ToList();&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;20&lt;/span&gt;&amp;nbsp;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;21&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; divdifs.Reverse();&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;22&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; X.Reverse();&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;23&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; IEnumerable&amp;lt;&lt;span style="color:blue;"&gt;double&lt;/span&gt;[]&amp;gt; zipped = X.Zip(divdifs);&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;24&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; zipped.Aggregate(0.0, (res, tup) =&amp;gt; res * (px - tup[0]) + tup[1]);&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;25&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;26&lt;/span&gt;&amp;nbsp;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;27&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;double&lt;/span&gt; divdif(&lt;span style="color:blue;"&gt;int&lt;/span&gt; s, &lt;span style="color:blue;"&gt;int&lt;/span&gt; e, List&amp;lt;&lt;span style="color:blue;"&gt;double&lt;/span&gt;&amp;gt; X, List&amp;lt;&lt;span style="color:blue;"&gt;double&lt;/span&gt;&amp;gt; Y)&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;28&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;29&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (s == e)&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;30&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; Y[s];&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;31&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;else&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;32&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; (divdif(s + 1, e, X, Y) - divdif(s, e - 1, X, Y)) / (X[e] - X[s]);&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;33&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;34&lt;/span&gt;&amp;nbsp;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;35&lt;/span&gt;&amp;nbsp;}&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;36&lt;/span&gt;&amp;nbsp;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;37&lt;/span&gt;&amp;nbsp;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;38&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span&gt;Exts&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;39&lt;/span&gt;&amp;nbsp;{&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;40&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; List&amp;lt;TSource []&amp;gt; Zip&amp;lt;TSource&amp;gt;(&lt;span style="color:blue;"&gt;this&lt;/span&gt; IEnumerable&amp;lt;TSource&amp;gt; first, IEnumerable&amp;lt;TSource&amp;gt; second)&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;41&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;42&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;TSource[]&amp;gt; result = &lt;span style="color:blue;"&gt;new&lt;/span&gt; List&amp;lt;TSource[]&amp;gt;();&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;43&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; IEnumerator&amp;lt;TSource&amp;gt; secondenum = second.GetEnumerator();&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;44&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; secondenum.MoveNext();&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;45&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (TSource item &lt;span style="color:blue;"&gt;in&lt;/span&gt; first)&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;46&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;47&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; result.Add(&lt;span style="color:blue;"&gt;new&lt;/span&gt; TSource[2] { item, secondenum.Current });&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;48&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; secondenum.MoveNext();&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;49&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;50&lt;/span&gt;&amp;nbsp;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;51&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; result;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;52&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;53&lt;/span&gt;&amp;nbsp;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;54&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; List&amp;lt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;gt; UpTo(&lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; x, &lt;span style="color:blue;"&gt;int&lt;/span&gt; y, &lt;span style="color:blue;"&gt;int&lt;/span&gt; step)&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;55&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;56&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;gt; result = &lt;span style="color:blue;"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;gt;();&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;57&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;while&lt;/span&gt; (x &amp;lt;= y)&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;58&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;59&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; result.Add(x);&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;60&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; x += step;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;61&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;62&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; result;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;63&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;64&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; List&amp;lt;&lt;span style="color:blue;"&gt;double&lt;/span&gt;&amp;gt; UpTo(&lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:blue;"&gt;double&lt;/span&gt; x, &lt;span style="color:blue;"&gt;double&lt;/span&gt; y, &lt;span style="color:blue;"&gt;double&lt;/span&gt; step)&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;65&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;66&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;&lt;span style="color:blue;"&gt;double&lt;/span&gt;&amp;gt; result = &lt;span style="color:blue;"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color:blue;"&gt;double&lt;/span&gt;&amp;gt;();&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;67&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;while&lt;/span&gt; (x &amp;lt;= y)&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;68&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;69&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; result.Add(x);&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;70&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; x += step;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;71&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;72&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; result;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;73&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;74&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; List&amp;lt;&lt;span style="color:blue;"&gt;double&lt;/span&gt;&amp;gt; UpTo(&lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:blue;"&gt;double&lt;/span&gt; x, &lt;span style="color:blue;"&gt;double&lt;/span&gt; y)&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;75&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;76&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; x.UpTo(y, 1.0);&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;77&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;78&lt;/span&gt;&amp;nbsp;}&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
First a note about the code. Some of the Extension method are redundant, and I&amp;#39;ve done it just to show how we could simulate Ruby&amp;#39;s syntactic sugar.
It might take a bit longer to digest this code, because we&amp;#39;re essentially moving from more declarative to less declarative (more imperative) programming style. So take the time to review.&lt;/p&gt;
&lt;p&gt;Since the code is a bit long and more expressive, I&amp;#39;ll make the explanation shorter .&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;19&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;&lt;span style="color:blue;"&gt;double&lt;/span&gt;&amp;gt; divdifs = Enumerable.Range(0, X.Count).ToList().Select(x =&amp;gt; divdif(0, x, X, Y)).ToList();&lt;/p&gt;

&lt;span&gt;&lt;/span&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Here we&amp;#39;re using Enumerable.Range, which was in fact Sequence.Range with earlier versions of the language. Doing a &amp;#39;Select&amp;#39; is like doing a &lt;i&gt;map&lt;/i&gt;. We can also see the new lambda syntax, &amp;lt;args&amp;gt; =&amp;gt; { block },&amp;nbsp; I&amp;#39;m certain everyone is already fed up with talking about :).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&amp;nbsp; 24&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; zipped.Aggregate(0.0, (res, tup) =&amp;gt; res * (px - tup[0]) + tup[1]);&lt;/p&gt;
&lt;p&gt;Aggregate is a &amp;#39;fold&amp;#39; or &amp;#39;inject&amp;#39;. To the keen eyed, you guessed right and this code is in fact almost identical to the Ruby code in structure and idioms, with missing parts implemented as needed, with the power of Extension Methods. I&amp;#39;ll break this part here and let you all breath :).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Check back later as I&amp;#39;ll put both of the code snippets up for download.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Next up: python and Scala.&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=53760" width="1" height="1"&gt;</content><author><name>dotan</name><uri>http://blogs.microsoft.co.il/members/dotan.aspx</uri></author><category term="languages" scheme="http://blogs.microsoft.co.il/blogs/dotan/archive/tags/languages/default.aspx" /><category term="programming" scheme="http://blogs.microsoft.co.il/blogs/dotan/archive/tags/programming/default.aspx" /><category term="F#" scheme="http://blogs.microsoft.co.il/blogs/dotan/archive/tags/F_2300_/default.aspx" /><category term="ruby" scheme="http://blogs.microsoft.co.il/blogs/dotan/archive/tags/ruby/default.aspx" /><category term="functional" scheme="http://blogs.microsoft.co.il/blogs/dotan/archive/tags/functional/default.aspx" /><category term=".Net" scheme="http://blogs.microsoft.co.il/blogs/dotan/archive/tags/.Net/default.aspx" /><category term="C#" scheme="http://blogs.microsoft.co.il/blogs/dotan/archive/tags/C_2300_/default.aspx" /></entry><entry><title>Functional Language Pit Part I: Introduction and F#</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/dotan/archive/2008/01/17/language-pit-part-i-f-ruby.aspx" /><link rel="enclosure" type="application/zip" length="407" href="http://blogs.microsoft.co.il/blogs/dotan/attachment/51270.ashx" /><id>http://blogs.microsoft.co.il/blogs/dotan/archive/2008/01/17/language-pit-part-i-f-ruby.aspx</id><published>2008-01-17T17:26:00Z</published><updated>2008-01-17T17:26:00Z</updated><content type="html">&lt;p&gt;Welcome to &lt;i&gt;the Pit&lt;/i&gt;. &lt;/p&gt;&lt;p&gt;In this series I&amp;#39;ll try and explore idiomatic functional language usages with C# 3.0, F#, Ruby (IronRuby), Python (IronPython), and Scheme. I will provide a short description for each snippet just to get motivated, and will close the series with performance and numerical stability analysis.&lt;/p&gt;
&lt;h2&gt;Test Subject&lt;/h2&gt;
&lt;p&gt;Like any good test, there has to be a good test subject. Now, while I&lt;i&gt; could&lt;/i&gt; do a dull iteration / manipulation of a list of ice-cream flavors, I picked something a bit more interesting and practical: &lt;a href="http://en.wikipedia.org/wiki/Lagrange_polynomial"&gt;Newton-Lagrange interpolation&lt;/a&gt;. &lt;br /&gt;Interpolation, in short, is taking partial data of something, and &amp;#39;filling in the blanks&amp;#39; based on known context rules.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/photos/dotan/images/51278/original.aspx" alt="" /&gt; 
&lt;p&gt;&lt;br /&gt;In elementary geometry, we all know that it takes 2 points in space to define a single unique line. But it also takes 3 points to define a single unique parabola -- a 2nd degree polynomial, 4 points for a 3rd degree polynomial, and so on.&lt;/p&gt;
&lt;p&gt;The Newton-Lagrange method of interpolation will interpolate all of the missing data based on those rules, with ,of course, a certain error. In practice, Cubic &lt;a href="http://en.wikipedia.org/wiki/Spline_%28mathematics%29"&gt;Splines&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/B%C3%A9zier_curve"&gt;Bezier&lt;/a&gt; curves (yea, thats the Pen tool in Photoshop), use forms of interpolation similar to that.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/photos/dotan/images/51279/364x177.aspx" alt="" /&gt; 
&lt;h2&gt;&amp;nbsp;&amp;nbsp;&lt;/h2&gt;
&lt;h2&gt;Theory&lt;/h2&gt;
&lt;p&gt;No, I&amp;#39;m not going to bore you with the math. Basically what needs to be done, is (preferably) compute a table of divided differences - here done with recursion, and use that with the Horner multiplication scheme. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;F#&lt;/h2&gt;
&lt;div style="font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:Consolas;"&gt;
&lt;div style="font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:Consolas;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;#light&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;open&lt;/span&gt; System&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;let&lt;/span&gt; NewtonLagrange (X, Y, px) =&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;let&lt;/span&gt; &lt;span style="color:blue;"&gt;rec&lt;/span&gt; divdif s e&amp;nbsp; =&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;match&lt;/span&gt; s, e &lt;span style="color:blue;"&gt;with&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; | n1, n2 &lt;span style="color:blue;"&gt;when&lt;/span&gt; n1 = n2 &lt;span style="color:blue;"&gt;-&amp;gt;&lt;/span&gt; List.nth Y n1&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; | _, _ &lt;span style="color:blue;"&gt;-&amp;gt;&lt;/span&gt; (divdif (s+1) e - divdif s (e-1) ) / (List.nth X e - List.nth X s)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;let&lt;/span&gt; divdifs = List.map (divdif 0) [0 .. X.Length-1]&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List.fold_right2 (&lt;span style="color:blue;"&gt;fun&lt;/span&gt; a b acc &lt;span style="color:blue;"&gt;-&amp;gt;&lt;/span&gt; acc*(px - a) + b) X divdifs 0.0&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;13&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;14&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;let&lt;/span&gt; X =&amp;nbsp; [-5.0 .. 1.0 .. 5.0]&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;16&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;let&lt;/span&gt; Y = List.map (&lt;span style="color:blue;"&gt;fun&lt;/span&gt; x &lt;span style="color:blue;"&gt;-&amp;gt;&lt;/span&gt; 1.0 / (cos(2.0*x) + x**2.0)) X&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;17&lt;/span&gt;&amp;nbsp;NewtonLagrange(X, Y, 3.16)&lt;/p&gt;&lt;/div&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;b&gt;
&lt;/b&gt;&lt;div style="font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:Consolas;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;b&gt; X =&amp;nbsp; [-5.0 .. 1.0 .. 5.0] &lt;/b&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Range:&lt;/b&gt; &lt;span style="color:blue;"&gt;let&lt;/span&gt; X =&amp;nbsp; [&amp;lt;start&amp;gt; ..&amp;nbsp;&amp;lt;step&amp;gt; .. &amp;lt;end&amp;gt;]. Note, that&amp;nbsp;in order to help F# do a good deal of inference, I like to state double values as 0.0 explicitly.&lt;/p&gt;&lt;b&gt;
&lt;/b&gt;&lt;div style="font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:Consolas;"&gt;
&lt;p style="margin:0px;"&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;b&gt;(&lt;span style="color:blue;"&gt;fun&lt;/span&gt; x &lt;span style="color:blue;"&gt;-&amp;gt;&lt;/span&gt; 1.0 / (cos(2.0*x) + x**2.0))&lt;/b&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Lambdas:&lt;/b&gt;&amp;nbsp;&amp;nbsp;(&lt;span style="color:blue;"&gt;fun&lt;/span&gt; &amp;lt;params&amp;gt; &lt;span style="color:blue;"&gt;-&amp;gt;&lt;/span&gt; &amp;lt;body&amp;gt;), returns a &lt;b&gt;function object&lt;/b&gt;. remember, functions are &lt;i&gt;first-class citizens&lt;/i&gt; in functional langauges.&lt;/p&gt;&lt;b&gt;
&lt;div style="font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:Consolas;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;List.map &lt;u&gt;(divdif 0)&lt;/u&gt; [0 .. X.Length-1]&lt;/p&gt;&lt;/div&gt;&lt;/b&gt;
&lt;p&gt;&lt;b&gt;Curried functions&lt;/b&gt;: This is a hyped, not that straight forward concept to grasp by the imperative programmer. A curried function is a function object, where we allow parameters to be &lt;b&gt;partially&lt;/b&gt; specified. A curried function does not carry&amp;nbsp;or curry anything, its name&amp;nbsp;is a tribute to &lt;a href="http://en.wikipedia.org/wiki/Haskell_Curry" class=""&gt;Haskell Curry&lt;/a&gt;.&amp;nbsp;So, how could this be possible?&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Imaging a function Add. Lets drop to a psuedo-F# syntax for a moment. So Add x y -&amp;gt; x+y, currying on it, we say&amp;nbsp;AddFive = Add 5. AddFive now represent an add &lt;b&gt;function&lt;/b&gt; that looks like:&amp;nbsp; Add 5 y -&amp;gt; 5 + y. And thats all there is to it.&lt;/p&gt;
&lt;p&gt;In line 10, we say: divdif 0. This goes and &lt;b&gt;returns&lt;/b&gt; to map&amp;nbsp;a divdif function where the parameter s is always zero.&lt;/p&gt;&lt;b&gt;
&lt;/b&gt;&lt;div style="font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:Consolas;"&gt;
&lt;p style="margin:0px;"&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;b&gt;List.fold_right2 (&lt;span style="color:blue;"&gt;fun&lt;/span&gt; a b acc &lt;span style="color:blue;"&gt;-&amp;gt;&lt;/span&gt; acc*(px - a) + b) X divdifs 0.0&lt;/b&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;b&gt;List comprehensions: folding&lt;/b&gt; &amp;quot;folding&amp;quot; is just like &amp;quot;accumulating&amp;quot; or &amp;quot;injecting&amp;quot; or what ever idiom a language might use, to describe applying an operation to an item, and accumulating it, for every item on a list. As an example consider accumulating&amp;nbsp;X = [ 1 1 1 1], which is folded into &amp;quot;4&amp;quot; by the &amp;quot;sum&amp;quot; function.&amp;nbsp;&amp;nbsp;Here we use a fold_right2, which starts from the end of the list, using 2 lists, which suits the Horner multiplication scheme &lt;b&gt;perfectly&lt;/b&gt;.&lt;/p&gt;&lt;b&gt;
&lt;div style="font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:Consolas;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;let&lt;/span&gt; divdifs = List.map (divdif 0) [0 .. X.Length-1]&lt;/p&gt;&lt;/div&gt;&lt;/b&gt;&lt;b&gt;List comprehensions: map&lt;/b&gt; a map takes a list, applies a function to every item, and returns a &amp;#39;deformed&amp;#39; list, that represents the same list with the function applied to every item.&lt;b&gt;&amp;nbsp;&lt;/b&gt;An example would be taking a list X = [ 1 2 3 ] and squaring every element into [ 1 4 9 ].&lt;b&gt;&lt;/b&gt;&lt;b&gt; 
&lt;div style="font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:Consolas;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;let&lt;/span&gt; &lt;span style="color:blue;"&gt;rec&lt;/span&gt; divdif s e&amp;nbsp; = ...&lt;/p&gt;&lt;/div&gt;&lt;/b&gt;&lt;b&gt;Let rec&lt;/b&gt;, line 5,&amp;nbsp;&lt;b&gt;&amp;nbsp;&lt;/b&gt;a &amp;quot;let rec&amp;quot; is a binding operation, that will let you use the bound entity, inside&amp;nbsp;its&amp;nbsp;own body. In other words, its the way we do recursion here, and you&amp;#39;ll also recognize that from Scheme, and other functional languages.&lt;b&gt;&lt;/b&gt;&lt;b&gt; 
&lt;div style="font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:Consolas;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;match&lt;/span&gt; s, e &lt;span style="color:blue;"&gt;with&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;| decomposition1 &lt;span style="color:blue;"&gt;when&lt;/span&gt;&amp;nbsp;guard &lt;span style="color:blue;"&gt;-&amp;gt; &lt;font color="#000000"&gt;(handle case)&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;|&amp;nbsp;decomposition2 &lt;span style="color:blue;"&gt;-&amp;gt;&lt;/span&gt; (handle case)&lt;/p&gt;&lt;/div&gt;&lt;/b&gt;
&lt;p&gt;&lt;b&gt;Pattern matching:&lt;/b&gt; this feature would seem just like a sophisticated switch-statement, but its not, its a totally, completly, different concept. To grasp it fully, you might want to look at &lt;a href="http://en.wikipedia.org/wiki/Prolog"&gt;Prolog&lt;/a&gt;,&amp;nbsp;or more practically,&amp;nbsp;Erlang. In essence, a match block in F# can help you pick apart a matchable argument and do case-handling effectively, most preferably expressing recursion.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Paying a price:&lt;/b&gt; using&lt;b&gt;&amp;nbsp;List.nth&lt;/b&gt; is O(n)!. We can always use an Array and say myarray.(0), but I wanted to go pure functional anyway.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;b&gt;Next up:&lt;/b&gt; C#3.0 and Ruby.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=51270" width="1" height="1"&gt;</content><author><name>dotan</name><uri>http://blogs.microsoft.co.il/members/dotan.aspx</uri></author><category term="languages" scheme="http://blogs.microsoft.co.il/blogs/dotan/archive/tags/languages/default.aspx" /><category term="programming" scheme="http://blogs.microsoft.co.il/blogs/dotan/archive/tags/programming/default.aspx" /><category term="F#" scheme="http://blogs.microsoft.co.il/blogs/dotan/archive/tags/F_2300_/default.aspx" /><category term="ruby" scheme="http://blogs.microsoft.co.il/blogs/dotan/archive/tags/ruby/default.aspx" /><category term="functional" scheme="http://blogs.microsoft.co.il/blogs/dotan/archive/tags/functional/default.aspx" /><category term=".Net" scheme="http://blogs.microsoft.co.il/blogs/dotan/archive/tags/.Net/default.aspx" /></entry><entry><title>Hello cruel world.</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/dotan/archive/2008/01/15/hello-cruel-world.aspx" /><id>http://blogs.microsoft.co.il/blogs/dotan/archive/2008/01/15/hello-cruel-world.aspx</id><published>2008-01-15T12:06:00Z</published><updated>2008-01-15T12:06:00Z</updated><content type="html">&lt;p&gt;And everyone else.&lt;/p&gt;&lt;p&gt;This is a test post.&amp;nbsp;&lt;/p&gt;&lt;p&gt;In the following posts (later this day) I&amp;#39;ll introduce myself, shortly followed by a selection of my other posts in Hebrew.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=50388" width="1" height="1"&gt;</content><author><name>dotan</name><uri>http://blogs.microsoft.co.il/members/dotan.aspx</uri></author></entry></feed>
