It's not an inherent feature of Julia, no, just a tooling thing. Juno, for example, will allow you to eval directly into modules just fine, including defining new functions, replacing them, evalling `include`s, and replacing the module wholesale in order to get around type redefinition issues and #265.
It's a really nice workflow IMO, and it's about as interactive as it gets, but it's perhaps a bit less obvious than I thought – I really need to add some workflow tips of my own to the Juno docs. (It's also especially great for working with Base / bigger packages etc. since you can modify things without recompiling everything. It would be a great feature if the REPL was able to "step into" modules other than Main so that everyone can use this) On 26 January 2015 at 14:54, Tamas Papp <[email protected]> wrote: > So the only the global name space is for "tinkering" (iterative, > interactive development), and modules are for more-or-less stable code > --- is this correct? > > Is this an inherent feature of the architecture of Julia, or can one > expect this to change as issues (especially #265) are resolved? > > Best, > > Tamas > > On Mon, Jan 26 2015, Tim Holy <[email protected]> wrote: > > > You can redefine a function like this: > > > > function MyModule.myfunction(args...) > > stuff > > end > > > > Two caveats: > > - myfunction has to already exist in MyModule for this to work---you > can't add > > new names to an already-closed module. > > - Anything that has already been compiled and uses myfunction won't > "hear" > > about the new definition unless you reload the whole module (see issue > #265). > > > > --Tim > > > > > > On Monday, January 26, 2015 02:54:03 PM Tamas Papp wrote: > >> Thanks to everyone for the replies. > >> > >> So do I understand the following correctly: if I separate my functions > >> and runtime code (eg MyModule and MyModuleRun), and then want to > >> redefine a single function in the first, then I have to reload the whole > >> module again? > >> > >> Julia seemed so ideal for exploratory programming at first, but then it > >> looks like I cannot manipulate the image freely and restarts are > >> required all the time, which is somewhat time-consuming. Perhaps I am > >> missing something important in my understanding, still trying to use > >> Julia similarly to Common Lisp, which is very flexible in this respect. > >> > >> Best, > >> > >> Tamas > >> > >> On Tue, Jan 20 2015, Tim Holy <[email protected]> wrote: > >> > My workflow (REPL-based, Juno in particular is probably different): > >> > - Open a file ("MyModule.jl") that will consist of a single module, > and > >> > contains types & code > >> > - Open a 2nd file ("mymodule_tests.jl") that will be the tests file > for > >> > the > >> > module. Inside of this file, say `import MyModule` rather than `using > >> > MyModule`; you'll have to scope all calls, but that's a small price > to pay > >> > for the ability to `reload("MyModule")` and re-run your tests. > >> > - Open a julia REPL > >> > - Start playing with ideas/code in the REPL. Paste the good ones into > the > >> > files. And sometimes vice-versa, when it's easier to type straight > into > >> > the > >> > files. > >> > - When enough code is in place, restart the repl. Cycle through > >> > > >> > reload("MyModule") > >> > include("mymodule_tests.jl") > >> > <edit these two files> > >> > > >> > until things actually work. > >> > > >> > --Tim > >> > > >> > On Tuesday, January 20, 2015 01:09:01 PM Viral Shah wrote: > >> >> This is pretty much the workflow a lot of people use, with a few > julia > >> >> restarts to deal with the issues a) and b). I often maintain a > script as > >> >> part of my iterative/exploratory work, so that I can easily get to > the > >> >> desired state when I have to restart. > >> >> > >> >> -viral > >> >> > >> >> On Tuesday, January 20, 2015 at 4:15:13 PM UTC+5:30, Tamas Papp > wrote: > >> >> > Hi, > >> >> > > >> >> > I am wondering what the best workflow is for iterative/exploratory > >> >> > programming (as opposed to, say, library development). I feel > that my > >> >> > questions below all have solutions, it's just that I am not > experienced > >> >> > enough in Julia to figure them out. > >> >> > > >> >> > The way I have been doing it so far: > >> >> > 1. open a file in the editor, > >> >> > 2. start `using` some libraries, > >> >> > 3. write a few functions, load data, plot, analyze > >> >> > 4. rewrite functions, repeat 2-4 until satisfied. > >> >> > > >> >> > I usually end up with a bunch of functions, followed by the actual > >> >> > runtime code. > >> >> > > >> >> > However, I run into the following issues (or, rather, > inconveniences) > >> >> > with nontrivial code: > >> >> > > >> >> > a. If I redefine a function, then I have to recompile dependent > >> >> > functions, which is tedious and occasionally a source of bugs > >> >> > (cf. https://github.com/JuliaLang/julia/issues/265 ) > >> >> > > >> >> > b. I can't redefine types. > >> >> > > >> >> > I can solve both by restarting (`workspace()`), but then I have to > >> >> > reload & recompile everything. > >> >> > > >> >> > I am wondering if there is a more organized way of doing this --- > eg > >> >> > put > >> >> > some stuff in a module in a separate file and just keep reloading > that, > >> >> > etc. Any advice, or pointers to tutorials would be appreciated. > >> >> > > >> >> > I am using Emacs/ESS. > >> >> > > >> >> > Also, is there a way to unintern symbols (a la CL) that would > solve the > >> >> > type redefinition issue? > >> >> > > >> >> > Best, > >> >> > > >> >> > Tamas >
