[Fwd: Re: [cells-devel] More newbie questions]
Kenny Tilton
ktilton at nyc.rr.com
Sun Mar 6 20:56:00 UTC 2005
-------- Original Message --------
Subject: Re: [cells-devel] More newbie questions
Date: Sun, 06 Mar 2005 15:55:29 -0500
From: Kenny Tilton <ktilton at nyc.rr.com>
To: Mike J. Bell <ckimyt at gmail.com>
References: <cfae84d805030507185b924b26 at mail.gmail.com>
<4229F03F.2050100 at nyc.rr.com> <cfae84d8050306120043642e64 at mail.gmail.com>
Mike J. Bell wrote:
>I'm quoting a bunch of stuff, sorry so long, but I think it's all
>related...comments below.
>
>On Sat, 05 Mar 2005 12:45:35 -0500, Kenny Tilton <ktilton at nyc.rr.com> wrote:
>
>
>>Mike J. Bell wrote:
>>
>>
>>>5) Multi-method (?) calculations: I've seen simple examples in the
>>>Cells docs that show a slot being dependent on another slot. It looks
>>>like you install this computation in the "destination" slot, i.e. the
>>>one that's dependent. What if you've got a situation where you have
>>>five slots, A B C D and E, that are parts of say three different
>>>objects, O1 O2 and O3. There's one computation that needs A B C D and
>>>E, and ends up modifying slots F G H and I in objects O4 and O5. Can
>>>it be done, making a single computation that depends on many slots in
>>>different instances that then updates slots in many instances? Or do
>>>you need to decompose this computation into (complicated!) pieces to
>>>be installed in each of the destination slots (F G H and I)?
>>>
>>>
>>>
>>You say complicated, I say "divide and conquer". Have you ever developed
>>a finite state machine, breaking some complex problem down into a
>>kazillion states? It seems painfully slow at first, until you realize
>>how effortlessly the approach deals with the overall computation, which
>>had you so confused that you resorted to using a finite state machine. :)
>>
>>Cells is all about exposing the semantics of a slot in the one formula
>>which determines the value of a slot. What you are describing is
>>"classic" imperative programming, where this point in the code decides
>>FGHI, another decides GH, another decides GHZ, etc etc. At which point
>>no one can really tell us the semantics of H.
>>
>>Now if you promise me that there is one and only one computation which
>>decides FGHI, what I do in cases like that is simply create a new slot
>>called FGHI (I wager the real name will be quite meaningful to anyone
>>reading your code) and then F, G, H, and I can have extremely simple rules:
>>
>> :f (c? (get-f (^fghi)))
>> :g (c? (get-g (^fghi)))
>> ..etc...
>>
>>
>>
>>> Can a
>>>change in one or more of A B C D and E cause a computation that
>>>updates C D F and G? (I.e. C and D are both inputs *and* outputs of
>>>the calculation. Note that self-cycling must be avoided!).
>>>
>>>
>>>
>>Again, sounds like you are resisting "divide and conquer". <g> I have
>>been doing cells for about nine years now, and I have never had a
>>problem decomposing big computations into so many slots mediated by so
>>many cells. The cyclicity thing rarely materializes, but see my
>>discussion of scrollbars in an earlier reply for how I handle that
>>cyclic case.
>>
>>
>>
>>>6) Multiple "owners" of responsibility, or aspect separation: (this
>>>is related to #5 above) What if you have a normal calculation that
>>>happens 99% of the time that changes slot A into slot B (B is
>>>dependent on A). You write the formula into the slot code for B, and
>>>you're happy. But then, because of some strange requirement or other
>>>complicated design issue, you realize that B also depends, every once
>>>in a while (say 1%), on C D and E. But you don't want to stick this
>>>new computation and dependency code with the original code, because it
>>>will not only clutter reading, but also the complicated process may
>>>change in the future.
>>>
>>>
>>>
>>You say "clutter", I say "completely specified". <g> What is wrong with:
>>
>> (c? (if (one-chance-in-a-million self)
>> (big-hairy-mess (^c) (^d) (e)))
>> (nice-and-easy (^a))))
>>
>>And who cares if it changes in the future? Just maintain the formula,
>>which will always fully document the semantics of a slot. One of the
>>nice things about not using GOTOs is just /knowing/ without worrying
>>that any given point in the code is always reached via visible control flow.
>>
>>
>
>I think these comments strike into the heart of the differences
>between Cells and what I'm using. It seems to me they're both
>event-driven paradigms; Cells is declarative, and mine is imperative.
>
>I guess my biggest concern about using Cells at this point (and I
>think I'm going to have to just try it and see!) is scalability, from
>a design perspective.
>
>In the system I'm using right now, because the data and functions that
>operate on it are separate (and many to many), you get a really nice
>modularization of major aspects of an application. For instance, I
>wrote a program that loads and displays audio waveform data visually.
>The original code allowed integer multiples of zooming. The zoom
>factor was represented by one of these pieces of data. The drawing
>code listened for changes in this data in order to repaint the screen
>at the appropriate zoom level. The GUI widget (slider) posted changes
>to this zoom factor. This exemplifies the extreme separation of
>model, view and controller (as I'm sure Cells does as well).
>
>Now, the really nice thing about the system I'm using is that when a
>new requirement came along about zoom levels, I didn't have to touch a
>single bit of old code. It went like this: a ruler was added to the
>screen to show a timecode display with the waveform. Because of
>strange "evenness" or regularity constraints on the design, the zoom
>level couldn't just be any old integer...it had to satisfy a
>divisibility property involving the sample rate of the audio. This
>contraint was written as a new function that took the sample rate and
>the zoom level as inputs, and published (possibly) a new zoom level
>that was "correct." The old code remained exactly the same, and the
>new code was added to the application, and everything just works.
>
>In the declarative model that I think Cells uses, I would have had to
>change code that's already written, tested, debugged, etc. in order to
>effect the change in requirements.
>
Not sure what code you are referring to. I would not have the slider set
the zoom, I would give the zoom a rule which watched the slider value,
which would just go from zero to one. When the new requirement came
along I would simply have the zoom rule look at the slider /and/ the
sample rate. Seems easy enough to me, and more self-documenting than the
approach you described. If the zoom value is coming out wrong, I like
knowing without doubt exactly where to look. Hell, in the inspector I
can even look at the code, which for debugging purposes I store in
symbolic form in the Cell for those cases where a slot gets different
rules for different instances so often that it is painful to work out
which rule applies to some instance I am debugging.
I am not saying I do not find constraint programming interesting or that
it would not be fun to simply drop a new rule in the basket as a way of
modifying a program. On the other hand, I have heard nothing but
nightmares about what it is like to program with multi-way and partial
constraints, so I have not been tempted to add anything like that to
Cells (so far <g>).
> Granted this is a simple example,
>picked for its ease of describing, but I've had this pattern occur
>quite a bit coding in the system I'm using...i.e. 95% of my
>application stands as is, with most changes just introducing new code
>which operates on existing defined data in the application.
>
>Please don't take any of my comments as negative criticism.
>
Not at all. We are both working the same very productive field,
constraints of one kind or another, and we see the same benefits.
kt
--
Cells? Cello? Cells-Gtk?: http://www.common-lisp.net/project/cells/
Why Lisp? http://lisp.tech.coop/RtL%20Highlight%20Film
"Doctor, I wrestled with reality for forty years, and I am happy to state that I finally won out over it." -- Elwood P. Dowd
More information about the cells-devel
mailing list