6 ms·
(Ab)Using Language Features: The Common Lisp Condition System
- eudox 12y agoIt's nice seeing Common Lisp posts on the front page.
- Grue3 12y agoThe post probably should've mentioned reader macros, since this is how you do this sort of stuff "normally".
- jmdavis 12y agoI originally had a section about reader macros but I ended up cutting it since the article was running a little long. Reader macros are great, but they work best when a token can unambiguously be recognized by the reader as using some "special syntax" (usually involves a '#' and then another dispatch character preceding the new syntax). This is great when you're coming up with a brand-new syntax. But if you're trying to match something that already exists, it's not easy
- chaitanya 12y agoFor those wondering about reader macros in Common Lisp, I wrote a tutorial a couple of months back that allows the Lisp reader to understand JSON: https://gist.github.com/chaitanyagupta/9324402 https://gist.github.com/chaitanyagupta/9324402
- howeyc 12y agoThis was something I really loved during my time in Common Lisp. This was a gem that I was hoping would make it into Clojure, but I think around version 1.3 they decided to abandon the idea and add a library to "make anything throwable" which totally missed the point in my opinion. Are there any other languages that allow the calling scope to specify how lower-level functions handle errors without unwinding the stack?
- pjmlp 12y agoNot really the same thing, but Eiffel does have retries. https://docs.eiffel.com/book/platform-specifics/exception-mechanism https://docs.eiffel.com/book/platform-specifics/exception-me...
- kbenson 12y agoPerl 6 allows for handling exception in a same-scope CATCH block, so you can try to recover. It can probably be mixed with their phasers[1] in interesting ways. Also of interest might be control exceptions[2]. 1: http://perlcabal.org/syn/S04.html#Phasers http://perlcabal.org/syn/S04.html#Phasers 2: http://perlcabal.org/syn/S04.html#Control_Exceptions http://perlcabal.org/syn/S04.html#Control_Exceptions
- qnaal 12y agoperl6: super hyperdimensional prototype future programming language "It's not Lisp!"
- draegtun 12y agoHere is an interesting perl6 example which works in Rakudo: $ perl6 > $*PERL<name>; rakudo > $*PERL<compiler><ver>; 2014.03.01 > { CONTROL { print 1; $_.resume }; print 2; warn; say 3 } 213 ref: https://news.ycombinator.com/item?id=7192294 https://news.ycombinator.com/item?id=7192294 For a perl5 Condition System see this implementation - https://metacpan.org/pod/ConditionSystem https://metacpan.org/pod/ConditionSystem
- mst 12y ago
- reikonomusha 12y agoHere[0] is another example of extreme abuse of the condition system in order to construct "dynamic data pipelines" in Lisp. Roughly, it provides the ability of sending data to different parts of the call stack, and then returning back to continue processing. It can do all of this without any explicit use of variables, or without passing state around. [0] PDF: https://bitbucket.org/tarballs_are_good/dynamic-collect/src/10d87a2d838ed6db568c8c826b7dea292e214795/dynamic-collect.pdf?at=default https://bitbucket.org/tarballs_are_good/dynamic-collect/src/...
- chaitanya 12y agoInteresting abuse of the Lisp Condition system. If you'd like to read more, an excellent introduction to the Common Lisp condition system is given in Practical Common Lisp: http://www.gigamonkeys.com/book/beyond-exception-handling-conditions-and-restarts.html http://www.gigamonkeys.com/book/beyond-exception-handling-co... And I wrote a tutorial on Common Lisp restarts, using them in a non-trivial real world example: http://chaitanyagupta.com/lisp/restarts.html http://chaitanyagupta.com/lisp/restarts.html
- tolmasky 12y agoThis reminds me of using doesNotRecognizeToSelector:/methodForSelector: in Objective-C to do similar tricks. For example, you can wire up a color class to respond to any hexColor selector by catching the unimplemented ones: NSColor * color = [Colors h00FF00]; You can then parse the selector string when the runtime doesn't find an appropriate method for it. As with all these tricks, it is of course incredibly slower than just doing GetHexColor(char * hexString), but where's the fun in that right.
- rcthompson 12y agoThis reminds me of Perl's AUTOLOAD, only for variable binding instead of functions.