Patch is up. I also changed attach so the file is reloaded from the idle loop, so you don't have to actually press any key in your Sage command line to re-evaluate as long as you are sitting at the command prompt.
On Friday, May 3, 2013 9:26:10 AM UTC+1, Marco Streng wrote: > This is now http://trac.sagemath.org/sage_trac/ticket/14523 > > There are indeed choices to be made first, all options sound sensible. > > > 2013/5/2 Nils Bruin <nbr...@sfu.ca <javascript:>> > >> On May 1, 9:45 am, Marco Streng <marco.str...@gmail.com> wrote: >> > And how to fix this? I have three ideas that all have a downside: >> > * Catching the error will destroy a valuable traceback (which I removed >> > above). Or is there a way to preserve that traceback and have it printed >> > somehow? >> >> Apparently the traceback is there. One should be able to retrieve the >> most recent one: >> >> exc_type, exc_value, exc_traceback = sys.exc_info() >> >> (just google for it -- there's some info in stack exchange about it) >> >> So we could do something along the lines: >> >> try: >> reload_modified_attached_files() >> except: >> INFO = sys.exc_info() >> print "Warning. An exception occurred during reloading of ..." >> print_traceback(INFO) >> print "continuing with command you entered. Funny things can >> happen" >> execute_command() >> >> The problem with this is that usually the right thing to do IS to >> abort if an error occurs on reloading an attached file. People will >> probably get used to just entering an empty command to trigger reload >> after they've edited though, so the extraneous execution of an empty >> command will probably not affect much. >> > > > Not really important, but completely empty commands actually don't trigger > reloading. > > sage: %attach myfile.sage > loading file > sage: > sage: file('myfile.sage','a').write('\nprint "this line was added later"') > sage: > sage: > sage: > sage: > sage: > sage: 1+1 > loading file > this line was added later > 2 > sage: file('myfile.sage','a').write('\nprint "this line was added later"') > sage: > sage: > sage: ; > loading file > this line was added later > this line was added later > '' > > > > >> >> > * How about attempting to reload only once (move the line >> "attached[fpath] >> > = os.path.getmtime(fpath)" to just before "execfile" in >> > sage.misc.preparser.load)? This may hide the problem: there will be only >> > one error message when attach fails, which the user may mistake for an >> > error related to the last input, and then think the latest version of >> the >> > file is safely attached, while actually an old version is still being >> used. >> >> If that is accompanied by an explicit message >> "detaching file ... due to exception. >> Execute 'attach(<file>)' to reattach." >> I think that's the cleanest (and we actually do detach the file) >> >> The other option is indeed >> "suspending reloading file ... due to exception >> Reload will be reattempted if file modification is detected" >> >> (and then just update the reference timestamp as you suggest) >> >> > * Is it possible to separate the reloading from the evaluation of the >> input >> > line? This may be the best option. Any idea how to implement that? Looks >> > like this is handled in IPython/core/interactiveshell.py , so it would >> mean >> > patching IPython? >> >> I think the option above, catch exception but print the traceback >> anyway, would accomplish this in essence. Of course now we have to >> answer questions such as: should we catch exceptions for each reloaded >> file separately? Do we just print all tracebacks if multiple fail? Or >> do we abort after first reload? >> >> For reference, Magma does: >> >> > Attach("a.m"); >> > Attach("b.m"); >> > intrinsic_defined_in_a(); >> True >> [invalidate a.m and b.m] >> > 1; >> [PC] >> [PC] User error: syntax error at end of input >> [PC] >> [PC] User error: syntax error at end of input >> > intrinsic_defined_in_a(); >> User error: Identifier 'intrinsic_defined_in_a' has not been declared >> or assigned >> >> So: >> - it reloads all attachments separately >> - it still executes the command >> - definitions in a failed reload really disappear >> - reloads are only reattempted when another change is detected. >> >> Due to python semantics, we cannot let previous attachments really >> disappear, but we can do the rest. >> >> -- >> You received this message because you are subscribed to the Google Groups >> "sage-devel" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to sage-devel+...@googlegroups.com <javascript:>. >> To post to this group, send email to sage-...@googlegroups.com<javascript:> >> . >> Visit this group at http://groups.google.com/group/sage-devel?hl=en. >> For more options, visit https://groups.google.com/groups/opt_out. >> >> >> > -- You received this message because you are subscribed to the Google Groups "sage-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-devel+unsubscr...@googlegroups.com. To post to this group, send email to sage-devel@googlegroups.com. Visit this group at http://groups.google.com/group/sage-devel?hl=en. For more options, visit https://groups.google.com/groups/opt_out.