Doug Moen doug at moens.org
Tue Oct 1 09:30:27 EDT 2019

```On Tue, Oct 1, 2019, at 3:00 AM, nop head wrote:
> Doesn't the current C like for(..;..;) syntax effectively allow a while loop and mutable variables in the loop?

If we add mutable variables, an assignment statement, and a while loop to OpenSCAD, then we enable a rich set of coding patterns:
* conditional assignment statements
* assignments inside a `for` or `while` statement which modify an accumulator variable
And these patterns can be nested and sequenced.

The C-like for (;;) syntax is only available inside list comprehensions, where it is used for generating a sequence of list elements. I do not think that list comprehensions are in any way a replacement for general imperative programming features.

Here is a Curv function that I used for generating a shape based on voronoi diagrams. I think it would be quite painful to translate this into OpenSCAD using tail recursion and list comprehensions. I ported this code from another language. A major benefit of imperative programming in Curv is that I could port the code trivially, doing a line-for-line transliteration, without wholesale restructuring of the code to use entirely different coding patterns.

// input: 2D coordinate, output: distance to cell border
voronoi x =
let
n = floor(x - 1.5);
f = x - n;
md = 8;
in do
// first pass: distance to cell centre
local mr = [0,0];
for (j in 0 .. 3)
for (i in 0 .. 3) (
local g = [i,j];
local o = hash2x2(n + g);
local r = g + o - f;
local d = dot(r,r);
if (d < md) (
md := d;
mr := r;
);
);
// second pass: distance to border
md := 8.0;
for (j in 0 .. 3)
for (i in 0 .. 3) (
local g = [i,j];
local o = hash2x2( n + g );
local r = g + o - f;
if (dot(mr-r,mr-r)>EPSILON) // skip the same cell
md := smooth_min(md, dot(0.5*(mr+r), normalize(r-mr)),.2);
);
in md;
-------------- next part --------------
An HTML attachment was scrubbed...