<<21-07-2012>>

00:12:15Araqgood night everyone
00:12:30dom96I'm heading to bed as well. Bye.
00:14:11*q66 quit (Quit: Leaving..)
08:52:41*Trix[a]r_za is now known as Trixar_za
09:45:39*jyyou joined #nimrod
09:47:30Araqhi jyyou
09:47:46jyyouAraq: hi
09:50:28dom96good morning
09:55:05*zahary joined #nimrod
09:58:53Araqgood morning, dom96, zahary
09:58:54Trixar_zaGood morning all
09:59:56*q66 joined #nimrod
10:00:10Trixar_zaWait. emacs has a Nimrod plugin?
10:01:36AraqTrixar_za: I think so, yeah; somebody put something on github ...
10:02:01dom96I would guess it's more of a slightly modified python plugin
10:02:29Trixar_zaProbably. That's how I wrote my geany syntax highlighter file
10:02:40Trixar_zaIronically, now I use Aporia instead
10:02:52dom96yay :D
10:05:26Trixar_zaI even packaged it for SliTaz: http://www.trixarian.net/downloads/aporia-0.1.2.tazpkg
10:05:37Trixar_zaWhich is funny since I haven't package Nimrod yet
10:05:37Trixar_za:P
10:06:21dom96I'm hoping to release a new version of Aporia soon.
10:06:34dom96I have too many features planned though.
10:06:45dom96:P
10:07:17Trixar_zaWell, one feature people have asked for was a Exit/Quit under the file menu :P
10:07:45dom96Seriously? lol
10:07:56Trixar_zaYeah - lol
10:08:28Araqdom96: should be easy to add, right?
10:08:33Trixar_zaI've compiled Aporia too. But my Aporia frequently hangs, have no 'Close' or 'Exit' entry in 'File' menu, and sometimes don't close own window by pressing on cross. Killall helps. I want to test your pkg.
10:08:33dom96Araq: Sure
10:08:43Trixar_zaThat's a quote
10:08:44Trixar_za:P
10:08:57Trixar_zaBut he compiled Aporia without -d:release
10:09:08dom96It should still work without -d:release
10:09:22Araqthis is really frightening ...
10:09:49dom96Araq: Are you thinking it's a Nimrod bug?
10:10:11Trixar_zaIt doesn't. It outputs key numerics in the terminal if you don't strip the debugger :/
10:10:18Trixar_zaAnd none of the keys work in it
10:10:32dom96Well it should work.
10:10:55dom96Some echos should have no affect on it.
10:11:16dom96It works perfectly for me in debug mode.
10:11:21Trixar_zaAlso --opt:size and --opt:speed have similar issues with some keys not working. So with SliTaz atleast using -d:release gives a working copy
10:11:54dom96What version of gtk do you have?
10:12:17dom96I have actually found that on Arch Ctrl + F keys do not work.
10:12:18Trixar_za2.24.10
10:12:55Araqdom96: could be a subtle bug in the gtk wrapper
10:12:58dom96Yeah, same as Arch's version.
10:12:59Araqor in your code
10:13:15dom96or in Gtk :P
10:13:52Araqsure but I doubt it as that is not recompiled with different settings :P
10:13:54dom96However it does seem to be something in my code. I have KeyRelease and KeyPress signals connected
10:14:26dom96So that's a big risk factor, because those functions can stop keys from being pressed.
10:14:45Araqmaybet these handlers are executed in some other thread ...
10:15:53dom96Lets hope not...
10:26:14zaharyyay, system.compiles :)
10:26:47zaharyI want to add block version too (that tests semStmt on a nkStmtList)
10:27:16Araqfeel free to do so
10:27:55zaharywe'll need to improve the exception safety of the compiler to do that
10:27:55zaharyfor example, if the error is raised after a openScope, the matching closeScope won't be called
10:28:17Araq?
10:28:30Araqit should work
10:28:55Araqbut I suppose I should do an openScope/closeScope pair in semCompiles
10:29:29Araqso no symbol table manipulation is possible
10:29:43Araqon the other hand, I thought it could be useful
10:29:54zaharyer, no? the context will be left in invalid state? the same goes for matching inc/dec calls for things like in*Context
10:29:54Araqwhen compiles(x): # introduces 'y'
10:30:25Araqthere is only ERecoverable error that can be raised
10:30:46Araqany other exception indicates a bug I think
10:31:01Araqand the code takes care of ERecoverableError
10:32:01zaharyhmm, let me look at some code, but I don't think I've seen any handling of ERecoverableError in the places I refer to
10:33:26Araqit's only handled on top level
10:34:25Araqin general so that no annoying following errors are generated
10:34:49dom96What's this system.compiles? What does it do?
10:34:53Trixar_zaAnd more reasons emailed to use Nimrod to code apps
10:35:10Trixar_zaIt always surprises me how resilient developers are to change
10:36:48zaharyaha, I see the RecoverContext proc, but it doesn't handle the inc/dec pairs of calls
10:38:50zaharyand you need something like "local" RecoverContext in semCompiles
10:38:50Araqwhich pairs do you mean?
10:39:21dom96Does it check whether something compiles?
10:39:27zaharyInGenericContext / InUnrolledContext
10:39:30Araqdom96: exactly
10:39:59dom96But what is that something? Templates/macros?
10:40:01Araqzahary: ah yeah I forgot about those :-)
10:40:15Araqsurely there are bugs left, but it's a good start
10:40:42zaharywhat I propose is to just start using the exception handling mechanisims
10:40:42zaharyinc InGenericContext
10:40:42zaharyfinally: dec inGenericContext
10:40:54AraqI know
10:41:00Araqbut I fear the overhead :P
10:41:08zaharyit would be smarter to switch to C++ :)
10:41:26Araqnot before I got 0.9.0 out :P
10:42:19Araqdom96: see http://forum.nimrod-code.org/t/56
10:42:44dom96thank you
10:43:00Araqhowever we know that c.inGenericContext == 0 in semCompiles (I think...)
10:43:36Araqthough semExpr could increment that propably somehow
10:44:58zaharyand if I add a block version, all bets are off
10:45:59Araqyep.
10:46:08Araqhow would that be invoked btw?
10:46:22Araqlet c = compiles:
10:46:41Araq block:
10:46:45Araq x == x
10:46:47Araq?
10:49:03zaharyyes, I think - maybe a string version too, because it's would be easier to combine with a when statement
10:50:46dom96Araq: What should I call this more efficient acceptAddr?
10:50:57Araq'acceptAddr'
10:51:08Araqno need for a new name, make an overload
10:51:19dom96ok
10:51:42Araqzahary: I played with the idea to restrict 'compiles' much more
10:51:59Araqlike only allowing nkCall and running the overloading resolution stuff
10:52:20Araqas I think it otherwise ties 'compiles' very heavily to the implementation
10:52:45Araqbut it'd have been more work
10:52:52Araqand I know you wouldn't like it ;-)
10:53:44zaharythe heavier version of compiles will be the major workhorse in the type constraints
10:54:21Araqfyi there is now a 'booting' define that I hope should help with changes in system.nim
10:54:30Araqand bootstrapping
10:54:46AraqI don't feel like always rebuilding the C code ...
10:54:53zaharyin theory exception safe C++ compiler should perform just as good as now
10:55:05AraqI know
10:55:15Araqbut I appreciate C's faster compile times
10:56:17Araqplus it's better for marketing reasons I guess
10:57:03zaharywell, you can rightfully claim that nimrod can generate C code (the fact that C++ is supported as well is just a bonus)
10:57:30zaharybut I don't see reason (marketing or otherwise) to avoid using C++ in the compiler itself
10:58:09zaharyI'm not sure about the compilation speed - have to test this
11:07:11Araqbtw if I have: int x[40] = {1, 2, ..} in C will it be put into a data section of the exe?
11:07:26Araqwill 'const int' do it instead?
11:08:26zaharyyou mean if you have this inside a function?
11:09:00Araqno top level
11:09:22zaharythen both int and const int will be in the data section
11:12:42Araqgood
11:12:51Araqas we can't generate the 'const' for C++ ;-)
11:13:01Araqit's too strict with const ...
11:19:07dom96hrm, I really like this Error list :D
11:19:30dom96It would be cool if we could get some nice icons though :)
11:27:26dom96"Error: unhandled exception: value 16 out of range [EOutOfRange]"
11:27:30dom96I gotta say I'm puzzled
11:29:35Araqugh that's exactly what I feared with the new integer promotion rules ...
11:29:46Araqif you do:
11:30:03Araqvar x = y and 15
11:30:15Araqx's type is not 'int' but range[0..15]
11:30:39Araqso if you update 'x' like 'x = 16' it will produce this error
11:30:53dom96Yeah, the error should at least be more clear
11:31:19dom96And it still doesn't make sense
11:31:21Araqok will add it to my todo.txt
12:10:57*Trixar_za is now known as Trix[a]r_za
12:16:29Araqzahary: how does the type info stuff deal with types that span multiple modules?
12:16:47Araqthat's why I put it all into a single C file in the first place
12:30:11zaharywhat kind of types are these? generic types?
12:31:10AraqmoduleA.X = seq[moduleB.Y] ?
12:31:10zaharyI always put the type info in the owner module
12:31:18Araqok
12:31:28Araqand never close any C file?
12:31:33zaharyyes
12:31:48Araqhrm, didn't affect anything, right?
12:32:02Araqwell I did that for DCE already I guess
12:32:12zaharywell, I asked you about the merging business that was not clear to me
12:34:19zaharyyou may want to take a look here
12:34:20zaharyhttps://github.com/Araq/Nimrod/blob/e394a642e98663a784f42329e45d8082ba5a2536/compiler/cgen.nim#L1113
12:35:05zaharyhow was pending=true used to be related to symbol files and merging?
12:35:37zaharythe code there used to loop over the pending modules only
12:38:25Araqthere is a comment that says:
12:38:29Araq# We need 2 different logics here: pending modules (including
12:38:31Araq# 'nim__dat') may require file merging for the combination of dead code
12:38:32Araq# elimination and incremental compilation! Non pending modules need no
12:38:34Araq# such logic and in fact the logic hurts for the main module at least;
12:38:35Araq# it would generate multiple 'main' procs, for instance.
12:40:27AraqI read it as:
12:40:35Araqthe merge process fails for the main C file
12:40:49Araqand for other C files it's redundant and slow
12:40:56Araqif it's not a pending module
12:45:14zaharyand pending used to mean "dead code elimination enabled"? (plus nimdat)
12:45:17zaharynothing more?
12:46:48Araqyeah I think so
12:47:04Araqthere is no other feature that would require module pending
12:47:34Araq'mergeRequired' looks pretty good though
12:47:42Araqso I think your change did no harm
12:48:25zaharyok, I can improve the code there some more - gPendingModule could be removed too because the new gModules is sufficient
12:48:27*Boscop joined #nimrod
12:51:36Araqso is it clear how C file merging is implemented?
12:54:34zaharyi understand the mechanics of the merging itself (I think) - it's less clear to me what happens earlier in the compilation that leads to the fact that only the "new parts" of the module are present in memory
12:55:17zaharyalthough not that unclear really - I guess the module is not compiled at all and only side-effects from generating other modules populate it (i.e. like inserting a typeinfo inside it)
12:56:17Araqexactly
12:57:05zaharyand these ID sets like typeInfoMarker, etc are read from the rod files at some point?
12:57:32zaharyto know what's already present in the previous compilation
12:58:41Araqthey part of the C file :D
12:58:52Araqencoded in a comment
12:58:55AraqXD
12:59:17Araqcouldn't be bothered to have backend info in the rodfile
12:59:33zaharyyeah, I actually saw this binary comments :) but though they could be suplementary only
13:01:33Araqif rodfiles would know about backend stuff we wouldn't need a merge operation in the first place
13:02:10AraqI also considered to get rid of the 1-1 mapping from Nimrod module to .c file
13:02:30Araqbut I think it's horrible for debugging
13:02:38zaharyhmm, why so?
13:02:56AraqmoduleA.1.c, moduleA.2.c, etc.
13:03:05zaharywhat's wrong with that?
13:03:35Araqwell you know, sometimes even I do look at the generated C code ;-)
13:03:36zaharywhich file has my function?
13:03:39Araqyeah
13:06:52zaharyit's a little inconvenience, but I think the possible benefits outweight it - we'll be able to split files is such chunks that you are more or less guaranteed that incremental compilation will always be very fast and once this is present we can do continuous compilation on the fly while the user edits the code
13:08:20zaharyand it will be an option anyway so if you plan to spend a lot of time C debugging land you can turn it off for a while
13:10:07Araqif you make it happen, I may accept it
13:10:21Araqbut "turn off" for debugging the compiler itself often does not work
13:10:33Araqas that could turn off the bug too
13:11:22Araqhowever I think we need this "compiler as a service" feature first
13:11:34Araqthat listens to a socket
13:11:58Araq(yeah I know you told me and I said it's unnecessary...)
13:12:21zaharyI will work on a DLL for now as it is much easier (no IPC layer)
13:13:04zaharyif this works ok, adding socket interface will be easy
13:14:25Araqwhat's the gain of the DLL?
13:14:35Araqcompiler part of stdlib?
13:15:26dom96"compiler as a service" yes please.
13:17:09zaharythe DLL is just another build of the compiler - instead of MainCommand that parses the command line, it exports all necessary functions to compile projects from another programs (like Aporia)
13:17:53dom96That sounds nice.
13:19:12zaharyand what's crucial is that I want to be able to keep the PContexts in memory to support various queries coming from the IDE
13:30:49Araqthe hard part is not to keep everything in memory, but the incremental updates
13:31:06Araqbut symbol files require that same logic
13:31:31Araqbut we talked enough about this already :-)
13:34:39zaharyyes
14:52:54*shevy quit (Ping timeout: 260 seconds)
15:06:11*shevy joined #nimrod
19:00:46Araqping Boscop
19:04:56BoscopAraq, pong
19:05:44Araqam I correct that a coroutine is just a closure with all locals in the enviroment + some control flow modifications?
19:06:51Boscopyeah, coroutines and closures are isomorphic conceptually
19:08:01Boscophm, but it seems to depend on the definition that people use
19:08:56Boscope.g. http://blogs.igalia.com/vjaquez/2008/10/09/coroutines-closures-and-continuations/
19:09:43AraqLua's coroutines are "first shot" continuations iirc
19:09:53Araqbut there was a paper that they are just as powerful
19:11:49Boscopone-shot continuations?
19:12:04Araqer, yeah
19:12:14Araqone-shot it was
19:15:56Boscopfor simple generator/yield stuff it may be enough to use inversion of control and convert the generator function to a state-machine object, like C# does
19:16:26Araqbut nimrod already supports simple generator/yield stuff
19:16:31Boscopah
19:16:52Araqso I'm enhancing that to make iterators first class
19:18:21Araqthe example on http://blogs.igalia.com/vjaquez/2008/10/09/coroutines-closures-and-continuations/ is confusing
19:18:38Araqthe coroutine 'foo' restarts itself ... is that common?
19:20:27Boscopyou can decide how you want it to behave. if it doesn't restart, some kind of end symbol (null/None etc) has to be returned
19:20:59AraqI'll let the implementation decide ;-)
19:58:34Araqhrm this seems to be ridiculously easy
19:59:16Araqit transforms every 'yield' into a 'return', adds a state field in the closure
19:59:33Araqand introduces some labels and gotos
19:59:55dom96Awesome. After reading that article Boscop posted I'm very glad that Nimrod is getting coroutines :D
20:06:12Araqit seems to be aweful for exception handling
20:06:25Araqas it introduces jumps into a 'try' block
20:07:10dom96Is there no way to make it play nice with exception handling?
20:07:25Araqdunno yet
20:08:46AraqI may simply disallow 'try' in a coroutine for the first version
20:10:11dom96As long as it doesn't cause strange bugs then I'm fine with it :P
20:14:13AraqI'm thinking about keeping iterators as they are and instead allow 'yield' in procs
20:14:29Araqand if a proc contains a 'yield' it's translated to a coroutine
20:14:33Araqlike in Python
20:14:50shevyhmm
20:14:54Araqfor greenthreads the keyword 'iterator' would only be confusing
20:15:01shevyimagine if learning nimrod would be more fun than learning python
20:16:08Araqbut it already is :P
20:16:24Araqif you value compiler error messages ;-)
20:16:39shevywell newcomers always struggle with errors in all languages
20:16:47shevywhat annoys me in python is the python2 vs python3 transition
20:16:49Araqtrue
20:16:52shevythis kills all the fun in wanting to learn it for me
20:16:53dom96How about a coroutine keyword?
20:17:33Araqdunno
20:18:04Araqfor types it makes no difference:
20:18:19Araqtype MyCoroutine = proc () {.closure.}
20:18:46Araqso 'proc' is justified
20:20:06Araqshevy: just ignore python 3 and use 2 as all the libraries do ;-)
20:20:26Araqand python 3's new unicode handling is worse than the old one IMHO
20:21:02Araqthe other stuff isn't good either: I like '%' for string formating and 'print' without ()
20:21:38Araqit's insane to change these things for a widespread scripting language
20:21:45NafaiI plan on never writing Python 3 code
20:22:03Araqand then they don't even name the exe 'python3' ...
20:22:06Nafaiand I'm really trying not to write Python 2 code, but it seems the libraries I need are always available for it
20:23:37AraqNafai: which libraries for example?
20:24:47Nafaihmm. an example I can think of for a project I wanted to recently do in Haskell was GDATA libraries and bindings for the Google APIs
20:25:07NafaiI would have started a particular project already in Haskell if they would have been around
20:25:20NafaiAnd writing Python isn't that exciting to me any more
20:26:37Araqyay another haskell programmer in #nimrod :-)
20:28:22shevyhehe
20:29:00Nafaias the years go on, I've become more and more an advocate of static typing :)
20:29:50AraqI never liked dynamic typing in the first place ;-)
20:31:13NafaiI realize I only like Python because it was the lesser of evils. It's not hard to beat C++ and Java though
20:36:37AraqI only like python's syntax, its semantics are stupid
20:36:58Araqexcept its collections like dicts, lists, tuples and their interactions
20:37:14Araqwhich work quite nicely
20:37:29*Nafai nods
20:46:44zaharyone cool feature of the lua coroutines is that they allow for 2-way communication
20:46:44zaharyfor room in labyrinth():
20:46:44zahary if room.hasDoor(Left): continue Left
20:48:04Araqcontinue left?
20:48:31zaharyon the other side it looks like this
20:48:31zaharychoice = yield room
20:49:27Araqjust noticed that my way is broken btw as it can't yield in an arbitrary nested call chain
20:49:42Araqbut that's a feature too as it simplifies the implementation
20:49:57Araqotherwise it would really need to take a snapshot of the stack
20:50:30zaharyI linked a paper some time ago that provided some optimizations for nested iterators
20:51:24zaharyalso, the third way to implement recursive iterators is to transform the outer loop body into a closure and to pass that closure as an implicit argument to the iterator proc
20:51:35zaharybut this doesn't allow you to treat iterators as first class values
20:52:15Araqyeah indeed
20:52:39AraqI also don't like it at all as it's a visitor
20:52:54Araqwith its associated problems
20:53:00Araq(like inability to 'break' easily)
20:53:23zaharywell, you cheat with special treatment of the return value, etc
20:53:37Araqsure
20:54:22zaharyanother viable compilation strategy IMO is to use the OS provided primitives such as fibers (activated by some pragma for example)
20:55:30Araqwe've talked about this before but
20:55:57Araqit's natural to map a "unit" in a game to a coroutine, right?
20:56:17zaharyhaven't tried it myself, but some people are using it, yeah
20:56:23Araqand then stack snapshotting becomes too expensive anyway
20:56:30AraqI guess
20:56:36zaharyI made a point then that most of the game code is trigger-based, which doesn't map nicely to coroutine
20:57:55AraqI remember, yes
20:59:17Araqthere is a way to implement stack snapshotting in C
20:59:33zaharyhttp://code.google.com/p/libconcurrency/
21:00:24zaharybut I guess the state machine approach will be nicer
21:00:58zaharywhy are you saying that it doesn't work?
21:01:21Araqit does work, but it's more limited
21:01:27NafaiSo is nimrod's compilation strategy compiling via C?
21:02:27AraqNafai: yes and I've frozen the plans to use LLVM instead
21:03:03Araqwe need the stack copying too as it's just too cool, but it requires GC support
21:03:39Araqso I think I'll implement python's restriction (yield as keyword only in the co-routine itself)
21:04:58Araqbut for the stack copying I'd prefer assembler code tbh
21:05:08Araqyou never know what modern optimizers do ...
21:05:47zaharythe C libraries use setjmp and stack switching, copying is a portable fallback (or something)
21:06:39zaharyyeild only in the coroutine makes sense to me (the only way you can compile them to state machine)
21:06:57Araqoh yeah good point they often don't copy
21:07:40Araqthe state machine is hard to do without 'goto'; will be a challenge to get that to work for the JS backend
21:08:04Araqfortunately iterators work and cover most common use cases :-)
21:15:43Araqsee you later
21:23:00zaharyI guess you can use continuation-passing style in javascript to emulate the jumping to the last line with goto
21:24:28zaharyyeild is transformed into return [value, function() { rest of proc }]
21:24:53zaharypretty hacky and probably slow too - loops have to be transformed into recursive functions too
22:45:11Araqback
22:45:18Araqzahary: it seems better to transform any control flow into:
22:45:22Araqwhile (true) {
22:45:30Araq switch (state) { ... } }
22:45:43Araqfor the JS backend
22:50:31Araqyou can then implement 'goto Label' as 'state = labelNo; continue;'
22:52:19zaharyI though about this, but it doesn't work for jumping inside a loop, doesn't it?
22:52:36Araqwhich loop?
22:52:46Araqany control structure is transformed to 'goto'
22:52:55Araqthere is only one while loop left
22:53:11Araqforgot the name, it's kleeney's theorem or something
22:53:48zaharyI see
22:56:56dom96It's nice to see that you guys still take the JS backend into consideration :)
22:57:45zaharyit adds cost to all control flow, but the coroutine related control flow is less expensive - probably it depends whether the function have a lot of yields or a lot of normal loops, ifs, etc
23:03:42Araqit's easy to do both: ordinary while loops and then in coroutines the other translation
23:04:01Araqhowever, I think it doesn't work with JS's exceptions
23:04:29Araqyou need to map 'try' to JS's 'try' and you can't do that with the while/switch solutioon
23:09:08Araqspeaking of which; try-except-finally is complete broken in the JS codegen
23:09:33Araqthe other features that I tested work suprisingly well though
23:10:27Araqhowever, I thought more about this and ugh I really want the stack capturing for coroutines
23:10:52AraqPython styled is not good enough for parsers
23:11:08Araqor tree traversal
23:11:24zaharybut stack capturing is easily delivered as library
23:11:39zaharyso I don't see much need for compiler support there
23:14:45Araqmatters little to me if it's in a library or in the compiler ;-)
23:14:56zaharyabout try finally and goto based couroutines… isn't it possible to statically determine what exceptions will be handled from error occurring on any line (respectfully any state)? case State_X: try { } catch (PossibleErrorsForX)
23:15:25zaharywell, nimrod already supports interfacing with C and there are C libraries, so one can argue that it's already supported?
23:23:41Araqyeah but not really
23:23:56Araqit needs 'registerStack' and 'unregisterStack' for the GC
23:24:08Araqit's very easy to add these though
23:25:02Araqabout the try finally: I don't know; however I think the state machine approach is taken by Google's Java to JS compiler
23:25:43Araqso there has to be a way to do it; unless of course they re-implement the exception handling stuff completely with 'goto'
23:26:22AraqI'd assume that V8 has some crazy optimizations to for their Java to JS compiler ...
23:26:23zaharyyou need the same kind of code for C/C++ too
23:28:41Araqhu? what do you mean?
23:38:02zaharyyou can not jump inside a try block from a duff's device
23:38:08zaharyjust tested it
23:38:25Araqyeah that's true
23:41:06AraqI'll simply disallow 'yield' within a 'try' ...
23:41:17Araqany better ideas
23:41:19Araq?
23:45:09zaharywell, this could be a start, but I think it's possible to determine which exceptions are to be expected in each state
23:45:59Araqhow does that really help?
23:46:10Araqexception tracking is planned for other reasons
23:46:21Araqbut I don't see how it solves the problem
23:46:37Araqrethrow?
23:46:51Araqso that you can sink the 'try' section?
23:46:59zaharyit's interesting semantically what is supposed to happen if exception is thrown in the outer loop
23:47:04zaharywhy rethrow?
23:47:29zaharythe way I see it the single try statements will be broken in multiple try statements just as it is broken in multiple states
23:48:10Araqthat's the 'sinking' part yes
23:50:00Araqyou need 'rethrow' to preserve the semantics
23:52:15zaharyI don't follow - I imagine if the exception is handled, it will be followed by a normal "goto" to a next state
23:53:57Araqtry {a;b} catch (e)
23:54:07Araqcannot be transformed into:
23:54:17Araqtry {a} catch (e); try {b} catch (e);
23:54:55Araqand that's the easiest case (sequential execution), right?
23:55:24Araqin fact, I'm still thinking about how to transform that properly
23:55:25zaharyI must be sleepy :) why isn't this equivalent?
23:55:47zaharyaha, I got it
23:56:12zaharybut try {a} catch(e) { goto end; } try {b} catch (e) ; end: ..
23:56:16zaharyis this the same?
23:56:52Araqyeah true
23:57:01Araqright, we got the 'goto' command
23:58:16Araqnow do:
23:58:27Araqtry {a;b} finally {} :P
23:58:53AraqI think you need to rethrow here
23:59:24*Bosc0p joined #nimrod
23:59:56zaharywell, sure - but the rethrow here is just a part of the regular catch block - user inserted reraise will do the same