Saving a file is not an invitation to do anything with the REPLs that I started -- it's an invitation to save the file! :-D

And no, I write a lot of code in the REPL at all. I *load* a lot of code into REPLs, yes, multiple active REPLs, all the time. Actually writing code in what is almost always a 2nd-class environment (compared to a proper editor) doesn't make any sense to me.

I see three issues here:

(a) Should ccw provide the richest possible editing experience, e.g. code completion, symbol navigation, etc, etc?

(b) Should the implementation of (a) automatically and silently modify the state of a running program initiated by the user?

(c) To what extent should running REPLs be "synchronized" with the codebase in question?

I'd answer an emphatic "yes", "no", and "probably not much", respectively.

What's odd to me about this "debate" is that issue (c) would appear to be a very difficult problem to solve in general for very little gain. Certainly at the edges, people are going to have unusual and/or long- running build processes that either the tool will not know how to invoke "properly" (i.e. as they would be in the normal course of development), or that will be simply too long-running to fit within an interactive setting. This is to say nothing of automatically ns- unmap'ing deleted vars, dealing with files that are in an interim state (which, as many have mentioned, is the case 98% of the time), and other stuff that I'm surely not thinking of.

As far as I can tell, the advantage of all the work associated with tackling (c) is....to help people avoid understanding how to work with REPLs (perhaps to somehow nudge the environment as a whole a hair closer to an image-based environment?...though that's speculation on my part). Knowing how to work with REPLs, and understanding the relationship between them and source files and (if one uses AOT) classfiles is paramount to being able to use Clojure effectively IMO. If anyone were to get the impression that REPLs are really just an editor feature, are managed automatically, and are not a natural outcropping of Clojure being a lisp, they'd be at a disadvantage.

Totally FWIW, I think enclojure's REPL support is stellar (some are probably tired of hearing me say that). I think ccw (or any other "integrated environment") would do well to ape it as much as possible (something I aim to help with, but I'm underwater at the moment).

- Chas

On Jul 19, 2010, at 2:50 PM, Laurent PETIT wrote:

That's interesting ! Thanks for the feedback.
Please note that it's not "impolite" in the sense that there's a policy: the project is reloaded in the REPL when the file is saved - that's a kind of "invitation" made by the user :-). If you don't work from the files, but from the REPL, nothing will happen automatically. If you work from the files, then you simply do not save the files until you're "happy" with the codebase. You can make several roundtrips between the file's content and the REPL (even via keyboard shortcuts) without saving the files. Ultimately, when you want to quit, you have to quit the REPL anyway, and you have the option to save the files or not.

Does this answer make sense ?

There's also the problem of "I save file A", and all project namespaces are reloaded as well. By maintaining a dependency graph of the namespaces relationships (easily obtained dynamically via the REPL), I may be able to only reload the expected namespaces. Some may see this as a feature - ensuring that all functions which depend on namespace A macros are recompiled -, I can see that some may see this as a recipe for disaster if reloading the namespaces also reloads global-var-as-data contents. Proper use of defonce may help there ?

Anyway, I didn't expect you reaction to be soo opinionated, and it's refreshing to hear others thoughts.

Let's see how others react to what you wrote !

Cheers,

--
Laurent

2010/7/19 Chas Emerick <cemer...@snowtide.com>
Automatically reloading namespaces into a REPL that I'm actively using is a very bad idea -- I expect to control what happens within REPLs I start, and subverting that is decidedly impolite IMO. I can expect to see odd behaviour when that happens, insofar as I assume new code I've written hasn't yet been put into play.

(I actually didn't realize that this is how ccw's completion, etc were implemented, but I've not been able to verify that behaviour -- adding a new def to a source file and saving it does not seem to add the defined var to the REPL, so perhaps I'm misunderstanding things).

To answer your open question directly: if an IDE/plugin/whatever stops REPLs I've created (and potentially poured hours of time into to get data into particular states, etc), then I'll never touch that environment again. Your suggestion (a) that code be automatically loaded in an IDE-managed and -started REPL is the right direction -- that's an implementation detail that I rightfully don't care about one way or the other.

The "desynchronization" issue that you're worried about is not a concern as far as I'm concerned, and I suspect that'd be a typical reaction. A REPL should have only one point of input in the base case -- the user of the REPL. Tinkering with that is violating a variety of expectations. If the user wants to have some new code she's written loaded into the REPL, she'll do that of her own accord -- and if there's a variety of changed files, then having a "reload all" command associated with each directory or project makes sense.

Cheers,

- Chas

On Jul 19, 2010, at 8:35 AM, Laurent PETIT wrote:

Hi,

I'm currently thinking about the next step for better user- assistance in Eclipse/counterclockwise.

But the questions I'm facing are general - enough so that they can be posted here.

Preliminary info:
user assistance (code completion, var documentation, etc.) is mainly obtained from a running instance of a REPL for the project.

Currently in ccw, I "try to be smart" by reacting as such when a file is saved by the user: I automatically reload all the project's namespaces into the project's running REPL (if there is one). That way, user-assistance in the IDE is as accurate as possible, and I avoid desynchronisation (technically speaking, I currently "obtain" this feature by AOT-compiling the project's namespaces, but that's an implementation detail) between what is saved in the project's files, and what is loaded in the REPL.


In the future, I intend to be even smarter :-)
* By being more "incremental" regarding which namespaces to call "reload" on. * And also by providind ways for people with "corner-case projects" to disable the "automatic reload" feature for the whole project, or for specific namespaces.

* But one question(*) remains open: should I stop to use the user- created REPL as the target of these "automatic reloads" ? Currently, if the user has not launched any REPL, he cannot benefit from IDE assistance requiring a running REPL. a. So having an "IDE-dedicated live server REPL" seems like I could relieve the user from explicitly launching a REPL (it's weird and counter-intuitive for a user to have to somehow "manually" trigger the IDE user assistance !). b. But if I do so, then the "automatic reloads" will now happen on the "IDE-dedicated server REPL", not on the REPL(s) the user will manually launch. And again there will be a desynchronization between the user's REPL loaded code and the project's saved files content ...


Users of Counterclockwise, Enclojure, La Clojure, please speak ! What behaviour do you expect from your IDE in this area ? (please do not answer in general terms, but try to the same precision-level of this email, or even more precise).

Users of Emacs / swank, vimClojure (etc.), please speak ! Share with us your workflows, why you think the goal I'm trying to achieve is good or not, so that we could think of better workflows to provide to IDE users if it seems appropriate.


Thanks in advance,

--
Laurent


(*) and many more, but I'd like to start with this one :-)

--
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


--
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


--
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

--
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