Persistant variable handling is one of the things which I have spent much
time on as a beginner and former SQL-illiterate (Among getting the swank to
finally work (it's a dream!)). I have however got into databases quite a bit
among the way - but it was not my main goal and it has taken some time from
"the real task".

I have looked into clj-record, which seems to be highly usable as well, but
the persistant refs-idea IMHO may feel a bit more elegant.

An easy way of persistence would be highly valuable when developing web
applications with compojure in :reload-mode, since it seems to lose normal
persistant refs after each reload in the browser. It would be valuable in
production environments as well, of course.

/Linus

2010/9/2 Alyssa Kwan <alyssa.c.k...@gmail.com>

> I'll go one step further and say that we shouldn't have to call
> "persist namespace".  It should be automatic such that a change to the
> state of an identity is transactionally written.
>
> Let's start with refs.  We can tackle the other identities later.
>
> The API is simple.  Call (refp) instead of (ref) when creating a
> persisted ref.  Passed into the call are a persistence address (file
> path, DB connection string, etc.) and a name that has to be unique to
> that persistence address.  Not all refs end up being referred to by a
> top-level symbol in a package, and multi-process systems are hard...
> Ensuring uniqueness of name is up to the programmer.  Upon creation,
> Clojure checks to see if the refp exists in the store; if so it
> instantiates in memory with that state, else it uses the default in
> the call.
>
> In a dosync block, the function runs as normal until commit time.
> Then Clojure acquires a transactional write lock on each refp that is
> alter-ed or ensure-d.  It checks the value against memory.  If it's
> the same, commit data store changes.  If not, retry after refreshing
> memory with the current contents of the store.  If the data store
> commit fails, retry a number of times.  If the data store commit still
> can't proceed, roll back the whole thing.  commute and refset are
> slightly different, but for an initial implementation, just treat
> commute as an alter, and ignore refset.
>
> Does this make sense?
>
> My intention is to cover the 80% case.  The implementation would
> necessarily be chatty, since the API is chatty.  That's OK for most
> systems.
>
> This API has the benefit of being able to be shared across Clojure
> instances.  It's a nice bonus.
>
> A dosync block may contain symbols pointing to refp's spanning
> different data stores, which isn't too hard to handle.  It simply
> requires that if this is the case, each data store must support two-
> phase commit or some other distributed transaction supporting
> protocol.  For an initial implementation, I would just throw an
> exception.
>
> I've begun working on an implementation using BDB.
>
> What do people think?
>
> On Aug 30, 5:02 pm, nchubrich <nchubr...@gmail.com> wrote:
> > I'm not aware of any, but +1 for seeing persistence handled as part of
> > the language.  A big project and a long-term one, to be sure, but
> > could it not be considered a goal?
> >
> > In my student days, I was talking to a well-known Lisper (name
> > suppressed for fear of Google indexing) about some data structures in
> > MIT Scheme.  When I asked about saving them to disk, he said in
> > effect, "You're on your own----that's something that \should be
> > handled, but never is".
> >
> > I think people are so used to this state of affairs they forget how
> > ugly it really is.  Programming languages are like Moses without
> > Joshua: they lead your data in the wilderness, but when it comes to
> > finding it a permanent home, you have to talk to someone else.  And
> > these "someone elses" (who seem to be as numberless as the sons of
> > Abraham) each have their own habits and ways of talking.
> >
> > Persistence libraries always end up warping the entire codebase; I've
> > never succeeded in keeping them at bay.  Using data with Incanter is
> > different from ClojureQL, which is different from just using
> > contrib.sql, and all of it is different from dealing with just
> > Clojure.  (I've never even tried Clojure + Hibernate.)  You might as
> > well rewrite the program from scratch depending on what you use.
> > Maybe other people have had better luck; but whatever luck they have,
> > I'm sure it is a fight to keep programs abstracted from persistence.
> >
> > I'd like to be able to work with mere Clojure until my program is
> > complete, and then work in a completely separate manner on how to read
> > and write data.  Or maybe there would be off-the-shelf solutions I
> > could plug in for different needs: low latency, high read, high write,
> > large stores, etc.
> >
> > On the Clojure side, you would simply call something like "persist
> > namespace", which would save the state of your current or given
> > namespace (unless you pass it the names of variables as well, in which
> > case it only saves those).  And to read data, you would simply require
> > or use it into your namespace: you could choose what granularity to
> > give first-class status: just tables, or columns as well, etc.  And
> > you could do this equally well for XML, JSON, relational data, or a
> > graph store; your choice.  And the only difference between these and
> > ordinary variables would be----heaven forbid!----a disk access might
> > happen when you deal with them!
> >
> > To have such a system work well, you would need to enrich the way you
> > query Clojure datastructures.  I have some ideas on that, but I'd like
> > to make sure I'm not shouting in the dark first.
> >
> > I'd like to see a day when programmers need to worry about persistence
> > about as much as they worry about garbage collection now.
>
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with
> your first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com<clojure%2bunsubscr...@googlegroups.com>
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to