[cells-devel] Cells & Clozure CL

Kenneth Tilton kentilton at gmail.com
Tue Jun 30 13:59:16 UTC 2009


[I have taken the liberty of CCing cells-devel because it might be 
useful in the archive.]

Neil Baylis wrote:
> This cells.. is a good thing. Do you want to incorporate the changes I
> made to make it work under Clozure CL?

Nah, I am not really doing o/s any more. Thx, tho.

> 
>>From what I've seen so far, it looks as though it fits with my
> project, which is some kind of geometry/art tool for exploring
> tilings, tessellations, symmetries, etc.
> 
> The graphic objects will mainly be triangles and squares, and I'm
> still figuring out how I want to model them.
> 
> Take triangles: At first glance, it looks as though I would model a
> triangle with a cell. I would have some way to initialize it, and then
> slots to return attributes. E.g. if I specifed 3 sides, there would be
> slots that returned the angles (lazily). Another slot might return the
> area. That much I understand.
> 
> But there are more ways to create a triangle. I could specify 3 sides,
> or 2 sides and an angle, etc. I could also say "make it similar to
> that triangle over there, but the same size as that square over there,
> etc. So, it seems to me that each of those cases would require a
> different defmodel, because they would have different initforms. Is
> that right?

No. One of the most powerful features of Cells is an accident: OO works 
now, because two instances of the same class can have different rules 
(or a non-rule literal or an input cell allowing conventional procedural 
code to alter a slot) for the same slot. This means more reuse for a 
class, because normally the variation you describe requires one to 
forever be creating new classes. The only question is whether you go 
crazy and have just one class (say, polygon) or strike a middle ground 
and have classes for triangle, quadrangle, etc. I guess it comes down to 
how much you want to get out of method specialization, which obviously 
calls for a different instance type.

That said, I often create a class (a defmodel) just as a way of bundling 
up a bunch of rules. ie, They can as well be functions or macros with a 
make-instance 'polygon inside. I guess for debugging and inspecting 
specifically a different class can be of use.

You prolly do want a defmodel triangle, but going for isosceles might be 
a point of dimishing return.

> 
> Anyway, assume I have that sorted out. Then, I'll create a bunch of
> instances of these classes. I'd start by putting one of them in the
> middle of the canvas. Then attach others to it, as dependents.So, if I
> then change a dimension on the original object, that change would have
> to propagate to all the dependent objects so they resize themselves.
> That part sounds like cells to me.
> 
> The relationships will all be about geometry: coincident points, equal
> angles, similar figures, parallel lines, intersections, etc. "This
> triangle is rotated 45 degrees further than that one over there". And
> so on. Maybe circles as well, tangents, secants, etc. That's a lot of
> stuff right there.
> 
> I've attached an image of the kind of thing I want to do. This one I
> created in Inkscape, but the UI there is somewhat horrid and it's easy
> for cumulative errors to creep in. But that was built up entirely from
> small squares and triangles. It's a reproduction of a tile pattern I
> saw in Sydney Australia when I went there earlier this year.

Nice.

> 
> I was thinking I wanted a full blown geometric constraint solver, but
> I'm hoping that I don't need that. It's a lot of math  and other
> theory I want to avoid learning at the moment. Cells looks like it
> might do the trick. I need to get more familiar with it though.

Not sure where you need a solver, unless the idea is that you hope to 
specify just a few parameters and let a solver figure out a pattern that 
"works". Cells is not about that -- we specify all the rules and the 
Cells engine just sees to it that the rules run.

If you need something non-deterministic I would use Screamer+ to work 
out the hard stuff and have cell rules mine the screamer results.

> 
> 
> I also had a probably dumbass newbie question: Whenever I eval a
> (defmodel..) I get compiler errors, such as:
> 
> CELLS> (defmodel hello-cells ()
>   ((num :accessor num :initarg :num :initform (c-in 0))
>    (square-num :accessor square-num
> 	       :initform (c? (* (num self) (num self))))))
> ;Compiler warnings :
> ;   In an anonymous lambda form inside an anonymous lambda form inside
> an anonymous lambda form: Undefined function NUM
> ;   In an anonymous lambda form inside an anonymous lambda form inside
> an anonymous lambda form: Undefined function NUM
> NIL
> CELLS>
> 
> I imagine there's some delcaration I need to invoke to make that not
> happen. Any ideas?

I actually see that from time to time, but rarely. There must be 
something wrong with my eval-whens internal to defmodel. You won't see 
those on subsequent iterations, so ignore them (or go crazy and debug 
defmodel).

cheers, ken





More information about the cells-devel mailing list