Jewel.jl handles all the code analysis/eval related stuff. I don't know ESS that well but it shouldn't be hard to make use of it if someone wants to.
In a nutshell it's basically as simple as calling `eval(Base, :(foo() = 1))`, but there's a few other things to think about like making sure Julia recognises the path of the file and the line number (for include statements and error messages). On 26 January 2015 at 15:52, Tamas Papp <[email protected]> wrote: > Where is the API for this functionality exposed, so that eg ESS could > make use of it? For example, how would one eval or define new functions > into a module in the REPL? > > Best, > > Tamas > > On Mon, Jan 26 2015, Mike Innes <[email protected]> wrote: > > > 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 > >> >
