Bindings, Platforms, and Innovation
This presentation focuses on the Internet and separating myth from fact, history from the future, and the mundane from the imaginative. Bob Frankston presents a vision of what could and should be.
Tracking change and innovation in the enterprise software development community
Posted by Jonathan Allen on Apr 07, 2008 06:48 AM
With the addition of LINQ, extension methods, and improved anonymous delegates, many algorithms no longer need explicit loops. In a post titled "If you are using a loop, you're doing it wrong", Chuck Jazdzewski looks at a possible future for C#.
Chuck Jazdzewski opens with the source of his quote, a college professor teaching APL. APL is a language from the 60's that focused heavily on vector and matrix operations. While loops existed, they were generally not needed. Chuck continues,
It is similar with LINQ, if you are using a loop you are doing it wrong. I find myself doing a lot of prototyping lately and I am forcing myself to use LINQ; not because I don't like it, far from it, I really like LINQ, but using loops is so ingrained into my psyche that I have to stop myself and force myself to think in LINQ. Every time I am tempted to write a loop that involves a collection or an array I ask myself, could I use LINQ instead? Programmers with more of a database background seem to take to LINQ like a duck to water. They think in sets and vectors, I don't, but I am getting there.
While Chuck relies heavily on LINQ expressions and extension methods, he does not eliminate loops entirely. In one case he has to move them into IEnumerable extension method that hides the complexity from the calling function. This is done for his generic function Reduce, which takes a list of items and combines adjacent items that 'match'. Both the criteria for matching, and how to actually combine them, are passed in as anonymous functions. This makes it unnecessary for anyone to ever write a similar function.
The goal of the code Chuck shows is to create a function that takes a sequence of ranges, text and a name like "Whitespace" or "Keyword", and apply styles to them. In the end his function is reduced to three query statements:
While most commenter's where positive, not everyone was convinced this is the right way to go. Holger Flick writes,
The headline should be "If you are using a loop, somebody might still be able to read your code without need to analyse it" :)
Don't get me wrong, I use LINQ quite often and love it. However, in this case it becomes too complex to grasp while reading the source code and thus hard to manage IMHO. I rather write a "multi-line" if e.g. instead of using the one-line ?? -approach.
Will C# code be mostly free of loops in the future? And for that matter, would it be a good thing?
Functional programming has been around forever... if it was superior in every ways, we would have been using it sooner in the mainstream sooner :)
That said, for certain things in definately does help. .NET 3.5 doesn't have a ForEach extension method, so you have to add it. Once you do, the trivial loops are indeed simplified and much cleaner now. For more complex stuff well... functional paradigms don't look quite as pretty in the debugger, for one.
Its like everything else. If it makes code cleaner and easier to understand, go for it. If not, use the classic way (and there are a LOT of cases for the classic way still...)
For loops are implicitly single threaded. As the multi-core revolution occurs, being able to do more than one thing at once is important. Vector-based languages can automatically parallelise the operations, as can operations where the looping is an implicit rather than explicit part. One of the reasons Google's code queries can be scaled is that the mapreduce specifies a requirement that can be broken down and sent across multiple boxes, rather than a 'foreach page in pages' which would do one at a time. The more languages that adopt intrinsic parallelism, the better.
What I use in the "extension method over IEnumerable
Actually Parallel FX, which I believe is still in alpha, is going to add parallel for loops to C#. For the simple case, all you do is write "Parallel.For" instead of "for".
PLINQ is even more applicable here (the Task Parallel Library and PLINQ are both part of ParallelFX)... Most of the time, it's as simple as writing .AsParallel() to your exiting LINQ query to parallelize the computation.
Yes, but by that same logic, object oriented programing is not superior in "every way" and yet it is the mainstream paradigm. Object oriented programming has been around forever too. It took a while before it's time came. Maybe the same is true for functional programming (just on a longer time line). Maybe the functional planets are aligning and an environment is being created that will nurture the functional philosophy and bring it mainstream. Multi-core could be the mother of the new functional movement, or a least the Object-Functional movement.
Microsoft is putting F# in as an official part of Visual Studio for a reason. It isn't best for everything. Woe to the person who thinks that writing a presentation layer in functional languages like F# is a good idea. That said, for certain kinds of problems - particularly cases where parallelism is important, functional, be it through C# parallel support and lambdas or in F#.
Hah! Check out Cells, a lisp library by Kenny Tilton. It beats the hell out of any other presentation layer I have ever seen.
If you try an imperative paradigm over a functional language, that will hurt, of course. A declarative paradigm, though, is clear, easy to understand, very reliable (ie, bug-resistant) and completely apt for functional programming -- and, interestingly, a hell for imperative languages. :)
Check this article by Kenny. It doesn't describe what Cells is -- you can find that elsewhere in his blog -- but I have personally felt it is an interesting showcase.
This presentation focuses on the Internet and separating myth from fact, history from the future, and the mundane from the imaginative. Bob Frankston presents a vision of what could and should be.
This article explores the use of JBoss and jBPM to implement design solutions that effectively address the issue of orchestrating long running activities.
This presentation covers the use of graph databases as an optimal solution for data that is difficult to fit in static tables, rapidly evolving data or data that has a lot of optional attributes.
This session introduces Real Options and shows how it can help in running your project. Real Options is a decision-making process that can be used to manage risk.
This article discusses the use of bindings on services and references (including the instance of non-configured bindings) as the means to implement SCA communications in a Web and SOA environment.
After a short introduction to DSLs, Scott Davis plays with the keyboard showing how to approach the creation of a DSL by typing working snippets of Groovy code that get executed.
IBM Rational and InfoQ present, Scaling Agile with C/ALM, an eBook showing organizations how to become “finely tuned software delivery machines” by enabling team integration and scaling.
Amanda Laucher presents a real life enterprise application written in F#. She shows actual code snippets, explaining design decisions and suggesting how to use some of the F# constructs.
8 comments
Watch Thread Reply