< 1198455820 0 :CakeProphet!unknown@unknown.invalid QUIT :"haaaaaaaaaa" < 1198456710 0 :RedDak!unknown@unknown.invalid QUIT :Remote closed the connection < 1198461023 0 :duerig!i=tyrecius@xmission.xmission.com JOIN :#esoteric < 1198461071 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :\ < 1198461075 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :Hello? < 1198461125 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :Anybody here? < 1198461170 0 :faxathisia!unknown@unknown.invalid PRIVMSG #esoteric :Hello < 1198461189 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :Hi. < 1198461223 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :I just had a crazy programming-language idea, and I'd like to know why it is dumb. :) < 1198461229 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :Care to listen and comment? < 1198461255 0 :faxathisia!unknown@unknown.invalid PRIVMSG #esoteric :I would listen < 1198461261 0 :faxathisia!unknown@unknown.invalid PRIVMSG #esoteric :I may not have any valuable comment though < 1198461310 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :Well, the idea is about failure control. There are two types of failures: External (cannot connect to server), and Internal (Whoops, just de-referenced that null pointer). < 1198461368 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :I think that current ideas about exceptions map well to internal exceptions. If something like that happens, then it is useful to print or log or pop-up an error message, then resume from a high level. < 1198461395 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :But they don't seem to map well to external failures. It does me no good to know that my connection failed on line 30. < 1198461435 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :So, what if instead, any function which can fail returns two distinct types. With no odd stack unwinding. A normal type and a failure type. < 1198461450 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :And you add a new control structure. So you might be able to code something like: < 1198461479 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :attempt (file.open("foo.txt", for_input)) < 1198461481 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :{ < 1198461486 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric : // do stuff with file < 1198461486 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :} < 1198461493 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :fail < 1198461493 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :{ < 1198461496 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :whoops < 1198461518 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :fail (int file_failure) < 1198461519 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :{ < 1198461528 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric : // Handle failure (retry, etc.) < 1198461529 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :} < 1198461560 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :And the compiler would force you to use functions that might fail in such a control structure. < 1198461568 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :Rather than just ignoring them. < 1198461576 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :So that is the idea. < 1198461587 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :In what ways do you think it is broken? < 1198461603 0 :faxathisia!unknown@unknown.invalid PRIVMSG #esoteric :It's a fine idea < 1198461616 0 :faxathisia!unknown@unknown.invalid PRIVMSG #esoteric :We already do this in programming though, so I don't think it's something new? < 1198461646 0 :faxathisia!unknown@unknown.invalid PRIVMSG #esoteric :#define if attempt < 1198461647 0 :faxathisia!unknown@unknown.invalid PRIVMSG #esoteric :#define fail else < 1198461648 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :Well, it is not something that is part of the language. So if you return an error code, say, then you cannot return a file descriptor. < 1198461657 0 :faxathisia!unknown@unknown.invalid PRIVMSG #esoteric :attempt(f(a, b, c, &output)) { < 1198461661 0 :faxathisia!unknown@unknown.invalid PRIVMSG #esoteric : output.left; < 1198461662 0 :faxathisia!unknown@unknown.invalid PRIVMSG #esoteric :} < 1198461670 0 :faxathisia!unknown@unknown.invalid PRIVMSG #esoteric :fail { do something with output.right; } < 1198461696 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :I guess the idea is to formalize this in the language and to make it easy. < 1198461700 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :And to enforce it. < 1198461710 0 :faxathisia!unknown@unknown.invalid PRIVMSG #esoteric :what is the host language? < 1198461713 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :Because even if you have carefully defined f() with several failure types. < 1198461728 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :Then they might just say f() and not attempt(f()) in, say, C. < 1198461739 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :I'm envisioning a c++ or java-like language variant for this idea. < 1198461750 0 :faxathisia!unknown@unknown.invalid PRIVMSG #esoteric :C basically doesn't have a type system < 1198461764 0 :faxathisia!unknown@unknown.invalid PRIVMSG #esoteric :it would (like C++) be a bad choice < 1198461768 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :Well, it definitely doesn't enforce it outside of translation units. < 1198461773 0 :faxathisia!unknown@unknown.invalid PRIVMSG #esoteric :you could do it as a preprocessor for java yeah < 1198461869 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :But I guess that the difference would be that the compiler, or preprocessor, or whatever, would *enforce* this. You might have an empty fail{} part, but you couldn't just ignore the error altogether. < 1198461890 0 :faxathisia!unknown@unknown.invalid PRIVMSG #esoteric :have you use any ML or haskell? < 1198461915 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :And it would be easier to be disciplined because the compiler would tell you if you didn't live up to the requirement. :) < 1198461922 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :I've used OCaml and SML a bit. < 1198461927 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :Not Haskell yet. < 1198462045 0 :faxathisia!unknown@unknown.invalid PRIVMSG #esoteric :well I think you describe an either type, like datatype 'l 'r either = LEFT of 'l | RIGHT of 'r < 1198462059 0 :faxathisia!unknown@unknown.invalid PRIVMSG #esoteric :so when you match against it, you know what you're getting.. < 1198462078 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :Ah. Yeah. And this is like Maybe types that I've heard about as well. < 1198462155 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :One thing is that you often want to do a number of things in series that can each fail. So a write can fail, but you might want to do a loop around it. < 1198462163 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :So you might have another keyword: < 1198462166 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :attempt_all < 1198462167 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :{ < 1198462172 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric : f_can_fail() < 1198462176 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric : g_can_fail() < 1198462176 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :} < 1198462184 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :fail (f_type || g_type) < 1198462187 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :{ < 1198462193 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :match on type: < 1198462195 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric : } < 1198462200 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :That kind of thing. < 1198462249 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :This kind of structure would be much harder with simple matching on return type. < 1198462270 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :But is more of an exception-type mechanism. Except that it does not unwind the stack past multiple functions. < 1198462346 0 :faxathisia!unknown@unknown.invalid PRIVMSG #esoteric :maybe with Haskell (esp. lists and other monads), you may be able to implement these ideas < 1198462385 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :Hmm. Maybe. Does Haskell have lisp-style macros? < 1198462509 0 :faxathisia!unknown@unknown.invalid PRIVMSG #esoteric :no < 1198462561 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :Hmm. Maybe I could also do it using one of the syntax-extenders for Java. < 1198463975 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :Thanks for your comments. < 1198463977 0 :duerig!unknown@unknown.invalid PRIVMSG #esoteric :Take care. < 1198463979 0 :duerig!unknown@unknown.invalid PART #esoteric :? < 1198464997 0 :mtve!unknown@unknown.invalid QUIT :Read error: 110 (Connection timed out) < 1198469148 0 :Sgeo!n=Anonymou@ool-18bf68ca.dyn.optonline.net JOIN :#esoteric < 1198476263 0 :Sgeo!unknown@unknown.invalid QUIT :Read error: 110 (Connection timed out) < 1198476771 0 :pikhq!unknown@unknown.invalid PRIVMSG #esoteric :ACTION flings a goblin at you < 1198477342 0 :weilawei!n=weilawei@pool-72-70-237-75.spfdma.east.verizon.net JOIN :#esoteric < 1198477713 0 :faxathisia!unknown@unknown.invalid PRIVMSG #esoteric :ACTION whacks it back at pikhq with a racket < 1198477798 0 :pikhq!unknown@unknown.invalid PRIVMSG #esoteric :ACTION wonders what card you have that lets you do that < 1198479349 0 :lament!unknown@unknown.invalid PRIVMSG #esoteric :anybody plays violin here? < 1198479416 0 :bsmntbombdood!unknown@unknown.invalid PRIVMSG #esoteric :i used to < 1198479430 0 :lament!unknown@unknown.invalid PRIVMSG #esoteric :what stopped you? < 1198479468 0 :bsmntbombdood!unknown@unknown.invalid PRIVMSG #esoteric :laziness < 1198479658 0 :bsmntbombdood!unknown@unknown.invalid PRIVMSG #esoteric :why? < 1198479905 0 :lament!unknown@unknown.invalid PRIVMSG #esoteric :ah. < 1198479961 0 :oerjan!n=oerjan@hagbart.nvg.ntnu.no JOIN :#esoteric < 1198483009 0 :mtve!i=mtve@mtve.vm.jvds.com JOIN :#esoteric < 1198483199 0 :clog!unknown@unknown.invalid QUIT :ended < 1198483200 0 :clog!unknown@unknown.invalid JOIN :#esoteric < 1198490158 0 :helios24!unknown@unknown.invalid QUIT :Read error: 104 (Connection reset by peer) < 1198490175 0 :helios24!i=helios@tomakin.quasar-net.de JOIN :#esoteric < 1198490596 0 :helios24_!i=helios@tomakin.quasar-net.de JOIN :#esoteric < 1198490640 0 :helios24!unknown@unknown.invalid QUIT :Read error: 113 (No route to host) < 1198492747 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :ooh, irregular webcomic christmas special. not for the weak. < 1198492759 0 :oerjan!unknown@unknown.invalid PRIVMSG #esoteric :or the sane, for that matter. < 1198492765 0 :helios24!i=helios@tomakin.quasar-net.de JOIN :#esoteric < 1198492866 0 :helios24_!unknown@unknown.invalid QUIT :Read error: 113 (No route to host) < 1198493006 0 :helios24!unknown@unknown.invalid QUIT :Read error: 113 (No route to host) < 1198493014 0 :helios24!i=helios@tomakin.quasar-net.de JOIN :#esoteric < 1198493396 0 :jix!n=jix@dyndsl-085-016-232-211.ewe-ip-backbone.de JOIN :#esoteric < 1198495280 0 :faxathisia!unknown@unknown.invalid QUIT :"Leaving" < 1198496560 0 :Sgeo!n=Anonymou@ool-18bf68ca.dyn.optonline.net JOIN :#esoteric < 1198498725 0 :sebbu!unknown@unknown.invalid QUIT :Read error: 110 (Connection timed out) < 1198498759 0 :sebbu!n=sebbu@ADijon-152-1-72-206.w83-203.abo.wanadoo.fr JOIN :#esoteric < 1198499757 0 :RedDak!n=dak@host75-94-dynamic.18-79-r.retail.telecomitalia.it JOIN :#esoteric < 1198499792 0 :dak!n=dak@79.18.94.75 JOIN :#esoteric < 1198499815 0 :dak!unknown@unknown.invalid QUIT :Read error: 104 (Connection reset by peer) < 1198508381 0 :RedDak!unknown@unknown.invalid QUIT :Remote closed the connection < 1198508429 0 :meta7!n=a@80.83.238.249 JOIN :#esoteric < 1198508716 0 :meta7!unknown@unknown.invalid PART #esoteric :? < 1198511363 0 :sebbu!unknown@unknown.invalid QUIT :Connection timed out < 1198511703 0 :sebbu!n=sebbu@ADijon-152-1-30-116.w83-194.abo.wanadoo.fr JOIN :#esoteric < 1198512895 0 :sebbu!unknown@unknown.invalid QUIT :Read error: 60 (Operation timed out) < 1198512972 0 :jix!unknown@unknown.invalid QUIT :"CommandQ" < 1198513358 0 :oerjan!unknown@unknown.invalid QUIT :"Dinner" < 1198513939 0 :sebbu!n=sebbu@ADijon-152-1-21-231.w83-194.abo.wanadoo.fr JOIN :#esoteric < 1198514190 0 :Sgeo!unknown@unknown.invalid QUIT :Remote closed the connection < 1198514363 0 :Sgeo!n=Anonymou@ool-18bf68ca.dyn.optonline.net JOIN :#esoteric < 1198514443 0 :sebbu2!n=sebbu@ADijon-152-1-72-23.w83-203.abo.wanadoo.fr JOIN :#esoteric < 1198515402 0 :sebbu!unknown@unknown.invalid QUIT :Read error: 110 (Connection timed out) < 1198516167 0 :jix!n=jix@dyndsl-085-016-232-211.ewe-ip-backbone.de JOIN :#esoteric < 1198523559 0 :oerjan!n=oerjan@hagbart.nvg.ntnu.no JOIN :#esoteric < 1198525269 0 :dgm!n=dgm@24-119-31-249.cpe.cableone.net JOIN :#esoteric < 1198525869 0 :AnMaster!unknown@unknown.invalid QUIT :"rebooting to older kernel, 2.6.23 breaks with usb after a few days" < 1198529861 0 :jix!unknown@unknown.invalid QUIT :Nick collision from services. < 1198529871 0 :jix!n=jix@dyndsl-080-228-190-098.ewe-ip-backbone.de JOIN :#esoteric < 1198531006 0 :sebbu2!unknown@unknown.invalid QUIT :No route to host < 1198531258 0 :sebbu!n=sebbu@ADijon-152-1-72-23.w83-203.abo.wanadoo.fr JOIN :#esoteric < 1198532998 0 :dgm!unknown@unknown.invalid QUIT :Read error: 104 (Connection reset by peer) < 1198533102 0 :oerjan!unknown@unknown.invalid QUIT :"leaving" < 1198533214 0 :sebbu!unknown@unknown.invalid QUIT :Read error: 113 (No route to host) < 1198533306 0 :sebbu!n=sebbu@ADijon-152-1-50-79.w83-194.abo.wanadoo.fr JOIN :#esoteric < 1198538032 0 :Slereah-!n=Test4@81.53.108.180 JOIN :#esoteric < 1198538707 0 :RedDak!n=dak@host75-94-dynamic.18-79-r.retail.telecomitalia.it JOIN :#esoteric < 1198539026 0 :Slereah!unknown@unknown.invalid QUIT :Read error: 110 (Connection timed out) < 1198539460 0 :RedDak!unknown@unknown.invalid QUIT :Remote closed the connection < 1198540713 0 :jix!unknown@unknown.invalid QUIT :"CommandQ"