Lab 1: Functional Geometry
Bard College – Computer Science – Design of Programming Languages
In section 9.4 of “Programming in Lua,” develops a system for describing geometric regions using higher-order functions and closures. Earlier, Peter Henderson used similar ideas of functional transformations in his paper (adapted into in ). In this week’s lab, we will combine these ideas (using scheme or lua).
Following Ierusalimschy, our first few functions describe shapes as predicate functions that take an (x,y) location and return whether that location is in the shape or not. For example,
function left(x,y) -- (number x number) -> boolean
return x < 0
function unitc(x,y) -- (number x number) -> boolean
return x^2 + y^2 < 1
Write a function blank that creates an empty blank image; and top that colors in the top half of the image.
plot(top, 400, 300, "top_test.pbm")
To actually see the image, we can write out a with desired width (M) and height (N).
function plot (r, M, N, filename)
local file = io.open(filename, "w")
file:write("P1\n", M, " ", N, "\n")
for i = 1, N do
local y = (N - i*2)/N
for j = 1, M do
local x = (M - j*2)/M
file:write(r(x,y) and "1 " or "0 ")
Next, we can use higher-order functions to construct those kind of predicates.
function disk (cx, cy, r) -- (number x number x number) -> function
return function (x, y) -- (number x number) -> boolean
return (x - cx)^2 + (y - cy)^2 <= r^2
describes a circle; and
function rect (left, right, bottom, up)
return function (x, y)
return left <= x and x <= right and bottom <= y and y <= up