[cells-devel] [openair] redundant updates and mk-checkbox
Ken Tilton
kennytilton at optonline.net
Wed Apr 9 07:28:24 UTC 2008
I took a minute to look at what you were doing before crashing. Overall
I gots to say you are coming up to speed on Lisp, macros, and Cells very
nicely. :) The bad news is that I am not going to look too losely unless
you yell for help, I gotta start getting ready for ECLM and the small
matter of shipping my damn app. :)
(defmd web-apropos (page)
(term (c? (param? "term")))
(pkg (c? (param? "pkg")))
(exported-only-p (c? (let ((rslt (param? "EXPORTED-ONLY-P")))
(trc "exported" rslt)
rslt)))
(filter (c? (param? "filter")))
(result (c? (progn
(trc "calculating result" (^term) (^pkg)
(^exported-only-p) (^filter))
(bwhen (search (^term))
(apropos-list search
(^pkg)
(^exported-only-p))))))
(title "Lisp Apropos")
(style "style.css")
(kids (c? (the-kids
(mk-div ()
(mk-form (:action "get")
(mk-label (:for "term")
"Apropos: ")
(mk-input (:name "term" :id "term"
:-type "text"
:value (c? (term (u^ web-apropos)))))
(mk-checkbox "Exported: " exported-only-p)
(mk-text (c? (exported-only-p (u^ web-apropos))))
(mk-div (:id :result)
(mk-ul ()
(list
(loop for match in (result (u^ web-apropos))
collect (let ((match match))
(mk-li ()
(mk-text match)))))))))))))
I just wanted to mention that once we implement XREF (object identity)
this last rule for the kids can look like this:
(loop for match in (result (u^ web-apropos))
collect (let ((m match))
(or (find m .cache :key 'value)
(mk-li (:value m)
(mk-text (value .parent))))))
[Note btw that by this time all the mk-whatevers will be returning the
OID, not the xhtml. And I am sure I am messing things up. <g> I do a lot
of self-clarification as I code. <g>]
The idea above is that there is a symbol-macro .cache (I think it is a
symbol macro) that evaluates to the value calculated by the rule the
last time, nil if there was no last time. So it is pretty easy to avoid
regenerating the same kids.
We could go even further and have one slot that takes the union of the
cache and any new items that need to be created, while the kids slot
then takes what it needs from that slot. That way if they winnow the
list too much and then unwinnow all the xhtml will already exist.
And once we do Cells/js, damn, it all can happen on the client side.
Which raises the question of whether we love Parenscript. If not, hey,
this is Lisp, we never use anyone else's code, we'll do our own.
What I am envisioning is something like Franz's implementation of
Prolog. We start in CL, then say (prolog... and now we are doing prolog,
in the middle of which we can say (lisp... and do a computation in Lisp.
I'd love to see rules default to server-side, but be able to say
(client... blah blah stuff that needs to xlate to JS and cells-js and
then possibly within that (server ... and now we are making a trip to
the server to get some info.
What would be scary would be to be able to some compiler-style analysis
and determine the above automatically at run-time without requiring the
developer to stop and think about which side of the broadband should be
doing the job.
kt
More information about the cells-devel
mailing list