DEV Community

Ben Halpern
Ben Halpern

Posted on

Which types of loops are most popular in the programming languages you use?

I was thinking about how in Ruby, we rarely use while or for even though they are available. The language prefers array.each do loops or perhaps n.times do.

How does your language handle these sorts of things?

Do you like the way it's done?

Latest comments (40)

Collapse
 
jcmrva profile image
Josh M

I use higher order functions (map, filter, fold) whenever reasonable - easier to think about and maintain in the long run.

Collapse
 
gklijs profile image
Gerard Klijs

Really like the forEach in Java for anything you don't need the return value for. With the logic in a separate method it makes the code both short and readable.
When I do need the return value is stream, and ending in some collect.
But there are still some cases where you need to integration number in the loop, so back to for loops in that case.
With Clojure it's for if I want the return value, or doseq if I don't. It's also common to use reduce for looping when you need the return value.
After reading previous reactions maybe I should give Go a go. Having only one way to do things seems boring. But now I'm sometimes busy with Java changing the loops to someone else's taste to get the merge request approved.

Collapse
 
programazing profile image
Christopher C. Johnson • Edited

I generally work with collections in C# so I use ForEach loops a lot.

var numbers = new List<int>() { 1, 2, 3, 4 };

foreach (var number in numbers)
{
    Console.WriteLine(number + 1);
}
Collapse
 
aschwin profile image
Aschwin Wesselius

In PHP the implementation of collections is quite popular now. This makes map and reduce a breeze. It also makes it more readable.

However I am curious to know why not many people know about and have implemented a Duff’s Device.

This is probably the most optimized way of iteration over items. My take is because it is less readable or understandable.

I have implemented this approach both in JavaScript and PHP. And it is quite faster than normal iterations. I think it can be implemented in any language that supports a while loop.

However only use it where optimizations are needed.

Collapse
 
missrahee profile image
Adam Misrahi

I'm a fan of ruby's each method for the fact that you can use it as an interface to make any object enumerable (or what other languages call iterable).

I particularly love it for the lazy evaluation. You can iterate over a collection of infinite size like a prime number generator or like something I did the other day, wrap a large remote resource but make it feel like any other local one. You just stream in as much of it as you need and no more.

Collapse
 
chryw profile image
Cherry Wang

JavaScript

In production I prefer map, reduce, etc. because I always want to return the same type as input. Sometimes I do use for loop when writing temporary utility scripts, or trying to validate some ideas. It's just because for loop is easy to read even without much context.

Collapse
 
olegthelilfix profile image
Oleg Aleksandrov

Loop is boring, and recursion is my choice.
hehe)

  void printNextValue(int index, List<String> list) {
        if (list.size() == index) {
            return;
        }

        System.out.println(list.get(index));

        printNextValue(++index, list);
    }

Collapse
 
chrisrhymes profile image
C.S. Rhymes

I always used to use foreach in php, but now I’ve swapped to using collection methods in Laravel as they are much more powerful and you can chain them together instead of having multiple loops or nested loops.

Here is an example of map, taken from the docs, which I use a lot

$collection = collect([1, 2, 3, 4, 5]);

$multiplied = $collection->map(function ($item, $key) {
    return $item * 2;
});

$multiplied->all();

// [2, 4, 6, 8, 10]
Collapse
 
laurieontech profile image
Laurie

I just published this

and after doing so all the comments I got were that JavaScript developers should only use maps and functional constructs at this point 🤷🏻‍♀️
Collapse
 
temporal profile image
Jacek Złydach
(loop for i in *random*
   counting (evenp i) into evens
   counting (oddp i) into odds
   summing i into total
   maximizing i into max
   minimizing i into min
   finally (return (list min max total evens odds)))

Or, more realistic example from a project I'm currently working on:

(loop
   with entities = (%get-entities-for-rendering x (+ x w) y (+ y h))
   for (ent-x ent-y ent-fg ent-char) in entities
   for realx = (+ cx (- ent-x x))
   for realy = (+ cy (- ent-y y))
   do
     (tcod:console-set-char-foreground console realx realy ent-fg)
     (tcod:console-set-char console
                            realx
                            realy
                            ent-char))

Common Lisp's loop can do crazy amount of things in a compact form, though there are things that are missing, and the whole thing isn't extensible (though there are library-provided alternatives like iterate that are better in this aspect).

Collapse
 
yorodm profile image
Yoandy Rodriguez Martinez

All Hail The Mighty LOOP!!!!!

Collapse
 
easyaspython profile image
Dane Hillard • Edited

Python got those list comprehensions 👀

numbers = [1, 2, 3, 4, ...]
odds = [
    number
    for number in numbers
    if number % 2 == 1
]
Collapse
 
pinotattari profile image
Riccardo Bernardini

Ada is based on old-style grammar, so basically we have the usual for loop (but only with +1 or -1 increments, a-la Pascal), while loop and just "loop" for never ending loops (you exit with an exit in the middle).

For loop allows for a very convenient construction. If V is an array you can write

for Idx in V'Range loop 
   V(Idx) := V(Idx)+1;
end loop; 

to run over the index range of V. No risk of buffer overflow or off-by-one errors.

However, recently (Ada 2005 or 2012) the syntax of for has been extended in something that resembles the each loop in Ruby (compatibly with old syntax, of course). If Container is any kind of container (standard or defined by you) you can write

for Item of Container loop
  Item :=  Item + 1;  -- Here Item is an element stored in Container
end loop;

Very convenient. Not much different from the Ruby-sque

container.each do |item|
  item = item+1;
end

The same syntax can be used even if Container is a simple array.

You also have an extension of "old school loop" for a container that is not an array

for Idx in Container.Iterate loop
  Container(Idx) := Container(Idx)+1;
end loop;
Collapse
 
shushugah profile image
shushugah • Edited

Ruby is unique in the “more than one way to do the same thing” and while (no pun intended) for/while loops may not be as common, they were made for developers entering ruby from other languages particularly java and php (I don’t have source for this, will look it up)

Collapse
 
ahferroin7 profile image
Austin S. Hemmelgarn

Ruby is not as unique in that respect as you think.

There are not one, not two, but three ways to loop over an array in JavaScript, and that's not counting special cases like map, reduce, or filter. You have classic C-style for loops, 'for...of' loops (iteration), and the callback-based .forEach() approach.

Collapse
 
quantumsheep profile image
Nathanael Demacon

In Rust it's quite a simple syntax:

for i in 1..100 {
    println!("{}", i);
}

And for Vec:

let mut nums: Vec<i32> = Vec::new();
nums.push(1);
nums.push(2);
nums.push(3);

for i in nums {
    println!("{}", i);
}

Same syntax for everything \o/