3 ms·
A where clause on a loop is nice, but I think it's likely it will either be abused or be limiting. I've always favored systems that work well together to build
by kbenson 6y ago
A where clause on a loop is nice, but I think it's likely it will either be abused or be limiting. I've always favored systems that work well together to build something more than the sum of the parts. Perl is an example of that in many cases.
for my $i ( 1..(10-1) ) {
next if $i % 2 == 0;
print $i;
}
Here Perl's post-conditional syntax (which works only on a statement and not a block so it's more manageable) combines well with "next" (Perl's version of "continue") to very clearly convey intent without a lot of extra boilerplate. An additional clause is often just an additional line. Comments after each can provide additional context as needed. I think this is a more flexible way to accomplish the same thing, and more readable in all but the simplest of cases. And for those simplest of cases, I would use a grep, which is also useful in other parts of the language:
for my $i ( grep { not $_ % 2 } 1..(10-1) ) {
print $i;
}
Any syntax learned that works as a special case to only a single structure is either a case of missed opportunity or a case of extra syntax that needs to be learned which shouldn't be, IMO.
- saagarjha 6y agoThat where is not a one-off construct, it's used with switch statements: switch i { case 1...100 where i % 2 == 0: print("\(i) is a small even number") case ..<0: print("\(i) is negative") default: print("I couldn't care less") } Or generic constraints: struct Vector<T> where T: Numeric { // ... } If you so wish, you can always use any of the functional constructs as well, as in for i in (0..<10).filter { $0 % 2 == 0 } { print(i) }
- kbenson 6y agoSo it looks like it's a general modifier to a range type, so can be used where those work. That's slightly better, but if filter exists, why not just use that? One of the biggest criticisms that Perl gets is that there's so many different ways to do things, and that's somewhat deserved, so the question is what does "where" offer that "filter" doesn't other than another keyword and concept you have to learn to understand the language? What's the point if it's not really that much more expressive or clear? > struct Vector<T> where T: Numeric Is this really the same thing? This seems like a case where the same word is used to mean something else, even if they are loosely conceptually the same.
- jiofih 6y agoBetter learn a new, generic concept than obscure syntax I’ll see combined 1000 different ways on the same codebase.
- solidsnack9000 6y agoIt isn't actually a modifier to a range type -- it modifies other constructs, like looping or conditionals. The examples don't show it but literally any condition can go in the where clause, even something like `where random() % 7 == 2`.