DEV Community

Ben Halpern
Ben Halpern Subscriber

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?

Top comments (40)

Collapse
Ā 
rhymes profile image
rhymes •

Go only has for loops so there's not much of a choice there šŸ˜‚

In Python I use for as well combined with various iterators. List comprehensions are favored over map and reduce there.

Collapse
Ā 
kataras profile image
Gerasimos (Makis) Maropoulos •

Exacltly. I was ready to post the same about Go xD

Collapse
Ā 
therealkevinard profile image
Kevin Ard •

I like go's for a lot. It can be a for, a while, or an infinite loop. It's all in how you use it.

The same idea shows up all over the place in it: "here's some minimal core, fiddle it however you want". It's one of its main attractions ā™„ļø

Collapse
Ā 
buphmin profile image
buphmin •

Though go is kind of cheating since it's "for" loop can behave in many ways.

Collapse
Ā 
quii profile image
Chris James •

Honestly it's one of many reasons Go is great, no bikeshedding about iteration

Collapse
Ā 
cathodion profile image
Dustin King •

The for loop in Go is more flexible than the one in C though. I just started with Go, and it's surprising how much they chose to diverge from other C-like languages.

Collapse
Ā 
taillogs profile image
Ryland G •

I'm actually writing a post which touches on this exactly. Figured I might as well post the relevant part of it here:

let sum = 0;
const myArray = [1, 2, 3, 4, 5, ... 99, 100];
for (let i = 0; i < myArray; i += 1) {
  sum += myArray[i];
}

A vanilla for loop is one of the least parallel constructs that exists in programming. At my last job, one of the teams I led spent months trying to come up with a strategy to convert traditional R lang for-loops into automagically parallel code. It's basically an impossible problem with modern technology. The difficulty arises because of a single pattern possible with for loops.

let runningTotal = 0;
for (let i = 0; i < myArray; i += 1) {
  if (i === 50 && runningTotal > 50) {
    runningTotal = 0;
  }
  runningTotal += Math.random();
}

This code only produces the intended result if it is executed in order, iteration by iteration. If you tried to execute multiple iterations at once, the processor might incorrectly branch based on inaccurate values, which invalidates the result. We would be having a different conversation if this was C code, as the usage is different and there are quite a few tricks the compiler can do with loops. In JavaScript, traditional for loops should only be used if absolutely necessary. Otherwise utilize the following constructs:

map

// in decreasing relevancy :0
const urls = ['google.com', 'yahoo.com', 'aol.com', 'netscape'];
const resultingPromises = urls.map((url) => makHttpRequest(url));
const results = await Promise.all(resultingPromises);

for-each

const urls = ['google.com', 'yahoo.com', 'aol.com', 'netscape'];
// note this is non blocking
urls.forEach(async (url) => {
  try {
    await makHttpRequest(url);
  } catch (err) {
    console.log(`${err} bad practice`);
  }
});
Collapse
Ā 
rhymes profile image
rhymes •

Do you know JS has async iterators and generators?

Collapse
Ā 
taillogs profile image
Ryland G •

Yes, and I do everything in my power to stay the hell away. Why would I want an async for loop? That's just a map with extra steps.

Thread Thread
Ā 
rhymes profile image
rhymes •

Probably the use case hasn't really emerged well. Maybe with an infinite stream of data or if you have to build a lazy parser for something like HTML or XML...

Collapse
Ā 
mkenzo_8 profile image
mkenzo_8 •

Lately, I am liking this way of writing fors in JavaScript:

for(const item of array){
   console.log(item)
}

But I have always used the 'indexed' version:

for(let i = 0;i<array.length;i++){
   console.log(array[i]);
}

There are other ways (forEach for example) but as I know they are usually 'slower' so I always use for :)

Collapse
Ā 
jamesthomson profile image
James Thomson •

There are other ways (forEach for example) but as I know they are usually 'slower' so I always use for :)

I think that depends on how much data you're processing. If it's a massive amount, then you may notice it to be a bit slower, but generally the discrepancy is so minimal that it's inconsequential. v8 is actually greatly optimised to use forEach. This is a great talk on the subject by Mathias Bynens: youtube.com/watch?v=m9cTaYI95Zc

So, IMO, it's a far nicer developer experience to use forEach or for of/in in certain cases.

Collapse
Ā 
kspeakman profile image
Kasey Speakman • • Edited

F# has some traditional looping constructs like for and while. However, they provide functions that take all the common plumbing out of looping. For example, say you want to loop through a list of items and convert each one to a string. You only have to define how to do it for one item.

let stringify item =
    sprintf "%s x%i" item.Name item.Quantity

// stringify {Name="Confabulator"; Quantity=11} = "Confabulator x11"

Then you use a List operation to perform that transformation on a whole list. Without having to worry about the mechanics of looping through it.

let items = [ ... ]
let strings = List.map stringify items

I really like the separation of concerns. My stringify function only worries about a single item... it doesn't know anything about lists. And since List introduces the need to loop, it also provide functions to do that for you (map, filter, reduce, etc). You simply plug in a function for a single item, and it takes care of doing it to the whole list.

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/

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
Ā 
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
Ā 
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
Ā 
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
Ā 
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);
    }