## Idiomatic and Non-Idiomatic Code
You'll come across a lot of discussions about some bit of code in
some language being "idiomatic" or "non-idiomatic". The meaning of
this is reasonably clear: it means existing code in that language
will do things in a similar way. As a trivial example: looping over
a range of numbers in Python is usually done with `for` loops and
the `range` function:
~~~.python
for x in range(10):
foo(x)
~~~
We could, of course, write an effectively identical loop using the
`while` function:
~~~.python
x = 0
while x < 10:
foo(x)
x += 1
~~~
But in this case, the code in question is much less idiomatic, and
for very good reasons: it's more complicated, longer, and easier
to screw up (e.g. by forgetting a line or getting a token wrong.)
On the other hand, the following is safer and clearer than a
while loop, and we'd _still_ consider it unidiomatic Python:
~~~.python
IntRange(0, 10).each(foo)
~~~
The above code (assuming we've implemented `IntRange`) is pretty
clear and doesn't suffer from the safety problems of the `while`-based
code, but it's still not idiomatic. We can conclude that being
"idiomatic" isn't just about clarity or convenience or safety: it
instead has to do with conforming to technical and social choices
within an existing system.
That raises the question: if we can write code that's safe and clear
and concise but still not idiomatic, then what does writing "idiomatic
code" buy us?
## Why Be Idiomatic?
There's a strong social advantage to writing idiomatic code: other
people are used to reading idiomatic code, so your audience will find
your code clearer and easier to read and, above all, _less surprising_.
But there are strong technical advantages, too:
## Idiomatic and Non-Idiomatic Systems