Readability
Monday, February 13, 2012
James O’Beirne wrote a great blog post on why languages matter with some thoughts on predictability, readability, and compactness. In it, he compares some examples of code in dynamic languages such as PHP, Python, and Groovy.
I wanted to compare his simple “readability” examples with Factor, to show why concatenative programming matters.
PHP
This example of some PHP code:
<?php
$x = 1;
$nums = array(10, 20, 30, 40);
$res = 0;
foreach ($nums as $n)
if ($n > 15)
$res -= $n*2 + $x;
Groovy
He compares the PHP code favorably to this Groovy code:
def x = 1
def nums = [10, 20, 30, 40]
def res = nums.findAll { it > 15 }
.collect { it * 2 + x }
.inject(0) {accum, val -> accum - val}
Python
Although James doesn’t show a Python example, it could look something like this:
x = 1
nums = [10,20,30,40]
res = 0
for n in nums:
if n > 15:
res -= (n*2) + x
We could improve this by using a generator expression (or, equivalently, a list comprehension)):
>>> def foo(x, nums):
... return -sum(n*2+x for n in nums if n > 15)
...
>>> foo(1, [10,20,30,40])
-183
Factor
I would argue that a Factor version is pretty readable:
IN: scratchpad { 10 20 30 40 } [ 15 > ] filter
[ 2 * 1 + ] map sum neg .
-183
If you wanted to factor (ahem) this into a reusable word:
: foo ( x nums -- res )
[ 15 > ] filter [ 2 * + ] with map sum neg ;
IN: scratchpad 1 { 10 20 30 40 } foo .
-183