<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5722310642266356003</id><updated>2012-02-01T04:29:26.498+01:00</updated><category term='phasing'/><category term='visual'/><category term='clojure'/><category term='cl'/><category term='perl'/><category term='continuations'/><category term='multimethods'/><category term='syntax'/><category term='advocacy'/><category term='types'/><category term='cs'/><category term='trs'/><category term='c#'/><category term='dylan'/><category term='transactions'/><category term='haskell'/><category term='edgelisp'/><category term='llvm'/><category term='performance'/><category term='laws'/><category term='hygiene'/><category term='scheme'/><category term='plot'/><category term='java'/><category term='ats'/><category term='os'/><category term='macros'/><category term='factor'/><category term='modules'/><category term='lisp'/><category term='oop'/><category term='concurrency'/><category term='go'/><category term='c'/><category term='cecil'/><category term='diesel'/><category term='eulisp'/><category term='the next lisp'/><category term='generics'/><category term='ell'/><category term='kernel'/><category term='islisp'/><category term='lowlevel'/><category term='fun'/><category term='collections'/><category term='goo'/><category term='dependent'/><category term='virtua'/><category term='newspeak'/><title type='text'>The Axis of Eval</title><subtitle type='html'>Manuel Simoni's blog about programming (languages).</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default?start-index=101&amp;max-results=100'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>204</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-3872092800680934227</id><published>2012-01-20T19:43:00.005+01:00</published><updated>2012-01-20T20:00:33.069+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><title type='text'>Fun with Kernel</title><content type='html'>Smug &lt;a href="http://web.cs.wpi.edu/~jshutt/kernel.html"&gt;Kernel&lt;/a&gt; Weenies - known to be even smugger than &lt;a href="http://c2.com/cgi/wiki?SmugLispWeenie"&gt;Smug Lisp Weenies&lt;/a&gt; - are advised to check out Dale Schumacher's series on Kernel:&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.dalnefre.com/wp/2011/11/fexpr-the-ultimate-lambda/"&gt;Fexpr the Ultimate Lambda&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.dalnefre.com/wp/2011/12/semantic-extensibility-with-vau/"&gt;Semantic Extensibility with &lt;i&gt;Vau&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.dalnefre.com/wp/2012/01/mutable-objects-in-kernel/"&gt;Mutable Objects in Kernel&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Besides &lt;i&gt;vau&lt;/i&gt; (known as the &lt;i&gt;&lt;b&gt;Wow Combinator&lt;/b&gt;&lt;/i&gt; by fans, &lt;i&gt;&lt;a href="http://lambda-the-ultimate.org/node/4345#comment-66877"&gt;Frankenexpressions&lt;/a&gt;&lt;/i&gt; by critics), that unifies functions and (&lt;a href="http://lambda-the-ultimate.org/node/4345#comment-66868"&gt;hygienic&lt;/a&gt;) macros in a single concept (with some &lt;a href="http://www.eighty-twenty.org/index.cgi/tech/scheme/fexprs-remain-inscrutable-20110929.html"&gt;open questions&lt;/a&gt;), one of my favorite Kernel features are first-class environments. They're just cute.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First-class environments have been shown to exhibit nice properties (e.g. you can write a module system in userland), and solve some of Scheme's problems (such as the letrec black hole), by Queinnec in the somewhat difficult to read &lt;a href="http://pagesperso-systeme.lip6.fr/Christian.Queinnec/PDF/modenv.pdf"&gt;Sharing Code Through First-class Environments&lt;/a&gt;. I think all designers of new &lt;a href="http://lambda-the-ultimate.org/node/1562#comment-18623"&gt;dynamic&lt;/a&gt; languages should seriously consider them.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Previously: &lt;a href="http://axisofeval.blogspot.com/2011/09/kernel-underground.html"&gt;The Kernel Underground&lt;/a&gt;, &lt;a href="http://axisofeval.blogspot.com/2011/08/praising-kernel.html"&gt;Praising Kernel&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-3872092800680934227?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/3872092800680934227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=3872092800680934227&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3872092800680934227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3872092800680934227'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2012/01/fun-with-kernel.html' title='Fun with Kernel'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-4206175567226910658</id><published>2012-01-06T21:10:00.006+01:00</published><updated>2012-01-07T00:06:58.512+01:00</updated><title type='text'>Why I find Dart's production mode evil</title><content type='html'>&lt;a href="http://www.dartlang.org/articles/why-dart-types/"&gt;&lt;i&gt;Why Dart Types Are Optional and Unsound&lt;/i&gt;&lt;/a&gt; contains the following example:&lt;pre style="font-size:small"&gt;class Mammal {}&lt;br /&gt;class Cow extends Mammal { String moo() =&amp;gt; 'moo!';  }&lt;br /&gt;class Pig extends Mammal { String oink() =&amp;gt; 'oink!'; }&lt;br /&gt;&lt;br /&gt;Mammal mammal = new Mammal();&lt;br /&gt;Cow cow = new Cow();&lt;br /&gt;Pig pig = new Pig();&lt;br /&gt;&lt;br /&gt;mammal = cow;      // [1]&lt;br /&gt;pig = mammal;      // [2] Checks OK statically, but now pig holds a Cow.&lt;br /&gt;print(pig.oink()); // [3] NoSuchMethodException if we get this far.&lt;br /&gt;&lt;/pre&gt;In &lt;i&gt;production mode&lt;/i&gt;, the type declaration that pig holds instances of Pig is simply ignored at [2]! IMO, this should never happen. The Dart team's reasoning is that this is still "safe", because you'll get a NoSuchMethodException at [3].&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But think about it: you might get the NoSuchMethodException at a completely different place in the program! What good are type declarations/assertions when you never know whether they are true? It actually feels worse than having no type declarations at all!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thankfully, in Dart's &lt;i&gt;checked mode&lt;/i&gt;, &lt;a href="https://twitter.com/#!/dart_lang/status/155374956027461632"&gt;you will get the error at [2]&lt;/a&gt;, making this behavior less troubling. But given that the page says that &lt;span style="font-style:italic;"&gt;"type checks are not a major drain on performance"&lt;/span&gt;, why have production mode at all?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Update:&lt;/b&gt; Relief! Bob Nystrom &lt;a href="http://news.ycombinator.com/item?id=3435474"&gt;writes on HN&lt;/a&gt;:&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;i&gt;My understanding was that the prime original motivation for unchecked mode was indeed performance. As our Dart implementations are getting more mature, we're starting to get a better picture of how it does actually impact performance.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;I think what we're starting to see is that the performance implications aren't that bad. Given that, I think we're focusing less and less on production mode. It's still a valid option and it may make sense for some users but it may not be commonly used, sort of like -Ofast in gcc.&lt;/i&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-4206175567226910658?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/4206175567226910658/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=4206175567226910658&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/4206175567226910658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/4206175567226910658'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2012/01/why-i-find-darts-production-mode-evil.html' title='Why I find Dart&apos;s production mode evil'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-5724710969207756517</id><published>2012-01-06T17:50:00.002+01:00</published><updated>2012-01-06T17:55:48.779+01:00</updated><title type='text'>Small data and humble sequentialism</title><content type='html'>Yeah, big data and massive parallelism in the cloud are exciting!&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But there are two problems with the cloud:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Technical: doing stuff in centralized data centers, when all of your users have multiple, hugely overprovisioned computing devices is a bit of a joke.&lt;/li&gt;&lt;li&gt;Political: do you actually want to have all your users' data, and take on the huge responsibilities and risks associated with that?&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;The cloud is really a reaction to browsers' highly limited request-response interaction style. But browsers have changed now, they're becoming little operating systems.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;May I suggest to take a fresh look at small data and humble sequentialism in 2012?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-5724710969207756517?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/5724710969207756517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=5724710969207756517&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/5724710969207756517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/5724710969207756517'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2012/01/small-data-and-humble-sequentialism.html' title='Small data and humble sequentialism'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-339622639581153522</id><published>2012-01-06T01:17:00.010+01:00</published><updated>2012-01-08T00:16:22.597+01:00</updated><title type='text'>Type systems vs interactivity</title><content type='html'>On Twitter last night, &lt;a href="https://twitter.com/#!/psnively"&gt;Paul Snively&lt;/a&gt; and I had one of our recurring &lt;i&gt;type systems vs interactivity&lt;/i&gt; discussions.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Paul made his point clear:&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;i&gt;My thesis is that programmers' ability to be logically inconsistent in a formal sense at any stage of development is overrated. &lt;a href="https://twitter.com/#!/psnively/status/155069782729834496"&gt;#&lt;/a&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;To which I replied, equally grandly:&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;i&gt;Without the ability to be inconsistent, you can't support the Lisp Experience™ &lt;a href="https://twitter.com/#!/msimoni/status/155070517437669376"&gt;#&lt;/a&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;My point is this: current type systems treat type checking as a batch job. But:&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;i&gt;Intermittently, during editing, programs are nonsense. then we bring them back into consistency. type systems should support this &lt;a href="https://twitter.com/#!/msimoni/status/155067745673822209"&gt;#&lt;/a&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;I'd really love to treat type system outputs not as one-off errors that prevent running the program, but rather as a dynamic console of warnings, that updates as I change the - running - program. Every warning corresponds to a point in the program where I &lt;i&gt;might&lt;/i&gt; get a runtime error &lt;i&gt;if&lt;/i&gt; I were to run the program at this moment.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Update:&lt;/b&gt; James Iry blogged about the same conversation in &lt;a href="http://james-iry.blogspot.com/2012/01/type-errors-as-warnings.html"&gt;&lt;i&gt;Type Errors as Warnings&lt;/i&gt;&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Update 2:&lt;/b&gt; Paul Snively added another nice quote:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;i&gt;I observe that I'm given to extremes: give me &lt;a href="http://web.cs.wpi.edu/~jshutt/kernel.html"&gt;Kernel&lt;/a&gt; or give me &lt;a href="http://coq.inria.fr/"&gt;Coq&lt;/a&gt;! &lt;a href="https://twitter.com/#!/psnively/status/155086895230091265"&gt;#&lt;/a&gt;&lt;/i&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;b&gt;Update 3:&lt;/b&gt; Great minds think alike. Brian McKenna reports:&lt;div&gt;&lt;blockquote&gt;&lt;i&gt;Simon Peyton-Jones talked about this a couple of times with me. It's something he's going to try with GHC &lt;a href="https://twitter.com/#!/puffnfresh/status/155087697394937856"&gt;#&lt;/a&gt;&lt;/i&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;b&gt;Update 4:&lt;/b&gt; &lt;a href="http://channel9.msdn.com/Blogs/Charles/YOW-2011-Simon-Peyton-Jones-Closer-to-Nirvana"&gt;around 27:00 in this talk&lt;/a&gt;, SPJ details his idea for type warnings. &lt;a href="https://twitter.com/#!/jamesiry/status/155397866796498944"&gt;#&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-339622639581153522?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/339622639581153522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=339622639581153522&amp;isPopup=true' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/339622639581153522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/339622639581153522'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2012/01/type-systems-vs-interactivity.html' title='Type systems vs interactivity'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-6935137845881425015</id><published>2012-01-04T19:04:00.006+01:00</published><updated>2012-01-04T19:33:59.470+01:00</updated><title type='text'>Restartable exceptions</title><content type='html'>&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;b&gt;TL;DR:&lt;/b&gt; Restartable exceptions are a must for new languages &amp;amp; they're dead simple to implement.&lt;/div&gt;&lt;/blockquote&gt;A dormant LtU thread on &lt;a href="http://lambda-the-ultimate.org/node/3896"&gt;Go's proposed panic/recover exception-like mechanism&lt;/a&gt; is waking up again, and I'd like to take the opportunity to evangelize restartable exceptions once again (see also my previous post &lt;a href="http://axisofeval.blogspot.com/2011/04/whats-condition-system-and-why-do-you.html"&gt;&lt;i&gt;What's a condition system and why do you want one?&lt;/i&gt;&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Especially, because this is one of the few topics where &lt;a href="http://awelonblue.wordpress.com/"&gt;David Barbour&lt;/a&gt; and me are of the same opinion. :) In the thread, David presents an interesting list of &lt;a href="http://lambda-the-ultimate.org/node/3896#comment-58374"&gt;Error Handling Patterns&lt;/a&gt;, which includes the following points (my emphasis in bold):&lt;/div&gt;&lt;dl&gt;&lt;p&gt;&lt;/p&gt;&lt;dt&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/dt&gt;&lt;blockquote&gt;&lt;dt&gt;&lt;strong&gt;Exceptions&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/dt&gt;&lt;dd&gt;Include a non-local exit so that error-handling may be isolated upon the stack. Unfortunately, &lt;b&gt;in many languages this "unwinds" the "stack", and thus a lot of important, unfinished work is simply lost&lt;/b&gt;, and the error-handling policy cannot effectively say anything useful about error &lt;i&gt;recovery&lt;/i&gt;. [...]&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;/dd&gt;&lt;dt&gt;&lt;strong&gt;Resumable Exceptions&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/dt&gt;&lt;dd&gt;The unfinished work is maintained during error handling, and there are mechanisms available to return to that work - i.e. by return value, or via 'resumption points' annotated in the code (which look the same as exception handlers). This allows a great deal of flexibility for what those error-handling policy can express, similar to the pass-a-handler approach. The greater structure, however, can lead to better performance and static analysis.&lt;br /&gt;&lt;p&gt;Usefully,&lt;b&gt; the difference between resumable exceptions and regular exceptions only requires a very minor tweak in implementation&lt;/b&gt;, even in languages such as C++ and Java: handle the exception as a new activation at the top of the stack, rather than unwinding first. (These activation records would need to include a pointer to the original frame in addition to the stack pointer.) This is exactly what Dylan does.&lt;/p&gt;&lt;/dd&gt;&lt;/blockquote&gt;&lt;/dl&gt;&lt;div&gt;For a practical example of restartable exceptions, check out &lt;a href="http://www.bluishcoder.co.nz/"&gt;Chris Double&lt;/a&gt;'s &lt;b&gt;&lt;i&gt;&lt;a href="http://groups.google.com/group/comp.lang.dylan/browse_thread/thread/82ccceeddec10289"&gt;A tale of restarts&lt;/a&gt; &lt;/i&gt;&lt;/b&gt;('&lt;i&gt;This is a "I'm glad I used Dylan" story...&lt;/i&gt;').&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, I still don't fully grok &lt;a href="http://web.cs.wpi.edu/~jshutt/kernel.html"&gt;Kernel&lt;/a&gt;'s &lt;i&gt;continuation guarding&lt;/i&gt; ("Exception-handling 'done right'") and how it relates to restartable exceptions. This is definitely another topic &lt;a href="http://fexpr.blogspot.com/"&gt;John&lt;/a&gt; should put on his growing list of blog posts to write. :P&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-6935137845881425015?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/6935137845881425015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=6935137845881425015&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/6935137845881425015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/6935137845881425015'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2012/01/restartable-exceptions.html' title='Restartable exceptions'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-7562245389957063935</id><published>2012-01-03T23:14:00.003+01:00</published><updated>2012-01-03T23:20:55.780+01:00</updated><title type='text'>Ringing in the new programming year</title><content type='html'>Straight outta Rob Pike's Command Center:  &lt;i&gt;&lt;b&gt;&lt;a href="http://commandcenter.blogspot.com/2011/12/esmereldas-imagination.html"&gt;Esmerelda's Imagination&lt;/a&gt;&lt;/b&gt;&lt;/i&gt;:&lt;br /&gt;&lt;i&gt;&lt;blockquote&gt;I resolve to recognize that a complaint reveals more about the complainer than the complained-about. Authority is won not by rants but by experience and insight, which require practice and imagination. And maybe some programming.&lt;br /&gt;&lt;/blockquote&gt;&lt;/i&gt;Gah. :) And Matt Might's &lt;i&gt;&lt;b&gt;&lt;a href="http://matt.might.net/articles/programmers-resolutions/"&gt;12 resolutions for programmers&lt;/a&gt;&lt;/b&gt;&lt;/i&gt;.&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And don't worry, today's &lt;a href="http://www.dailymail.co.uk/news/article-2081564/Dont-despair-Its-depressing-day-year-say-experts.html"&gt;the most depressing day of the year&lt;/a&gt;, say experts.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-7562245389957063935?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/7562245389957063935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=7562245389957063935&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/7562245389957063935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/7562245389957063935'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2012/01/ringing-in-new-programming-year.html' title='Ringing in the new programming year'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-7690844112636488366</id><published>2012-01-02T16:51:00.004+01:00</published><updated>2012-01-02T21:35:58.851+01:00</updated><title type='text'>(winningp) =&gt; t</title><content type='html'>&lt;div&gt;Thank you Paul Graham for the Lisp renaissance.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Say what you like about the tenets of Lisp, Dude, at least it's an ethos.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some signs that Lisp has now gained significant mindshare again:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Designers explicitly state that they won't have macros or don't have them yet: &lt;a href="http://code.google.com/p/decac/"&gt;Deca&lt;/a&gt;, &lt;a href="http://www.inf.puc-rio.br/~roberto/talks/novelties-5.2.pdf"&gt;Lua&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Languages actually do add macros: &lt;a href="http://scalamacros.org"&gt;Scala&lt;/a&gt;, &lt;a href="https://github.com/josevalim/elixir"&gt;Elixir&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Now the big problem is that, as they say, in CS not only do we not learn from our mistakes, we also don't learn from our successes.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let me tell you: people &lt;i&gt;will&lt;/i&gt; spend the next 20+ years reinventing hygienic macros. (Or they could just use fexprs, and get &lt;a href="http://lambda-the-ultimate.org/node/4345#comment-66868"&gt;hygiene for free&lt;/a&gt;.)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-7690844112636488366?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/7690844112636488366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=7690844112636488366&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/7690844112636488366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/7690844112636488366'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2012/01/winningp-t.html' title='(winningp) =&gt; t'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-2802573745395439189</id><published>2012-01-01T23:09:00.002+01:00</published><updated>2012-01-01T23:13:02.303+01:00</updated><title type='text'>Isn't goto evil?</title><content type='html'>Goto-considered-harmful-weenies (don't trust 'em) should ponder the following remark from the &lt;a href="http://www.inf.puc-rio.br/~roberto/talks/novelties-5.2.pdf"&gt;&lt;i&gt;Novelties of Lua 5.2&lt;/i&gt;&lt;/a&gt;:&lt;div&gt;&lt;blockquote&gt;&lt;i&gt;&lt;b&gt;continuations are much worse&lt;br /&gt;&lt;br /&gt;yet nobody complains; it is “cool” to support continuations&lt;/b&gt;&lt;/i&gt;&lt;/blockquote&gt;&lt;/div&gt;Ha!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-2802573745395439189?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/2802573745395439189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=2802573745395439189&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2802573745395439189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2802573745395439189'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2012/01/isnt-goto-evil.html' title='Isn&apos;t goto evil?'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-857555794883371043</id><published>2011-12-31T19:50:00.000+01:00</published><updated>2011-12-31T19:49:36.008+01:00</updated><title type='text'>PL Predictions for 2012</title><content type='html'>Summary: another year of broken lexical scope and broken type systems.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;There will be a &lt;b&gt;new language with broken lexical scope&lt;/b&gt; (remember, it's a &lt;a href="http://lambda-the-ultimate.org/node/3488"&gt;criterion for success&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;A &lt;a href="http://google-web-toolkit.googlecode.com/svn/javadoc/latest/com/google/gwt/user/client/ui/Widget.html"&gt;GWT-like&lt;/a&gt;, 80's style, object-oriented &lt;b&gt;GUI framework will make Dart a major player&lt;/b&gt; in web apps.&lt;/li&gt;&lt;/ul&gt;&lt;i&gt;Happy new year!&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-857555794883371043?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/857555794883371043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=857555794883371043&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/857555794883371043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/857555794883371043'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/12/pl-predictions-for-2012.html' title='PL Predictions for 2012'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-7482298941505509570</id><published>2011-12-21T18:01:00.003+01:00</published><updated>2011-12-21T18:19:12.229+01:00</updated><title type='text'>Call-by-push-value</title><content type='html'>Call-by-push-value has a &lt;a href="http://www.cs.bham.ac.uk/~pbl/cbpv.html"&gt;seducing PR message&lt;/a&gt;: &lt;i&gt;Science is reductionism. Once the fine structure has been exposed, why ignore it?&lt;/i&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Unfortunately, I'm too unsophisticated to be able to gain much insight from the &lt;a href="http://www.cs.bham.ac.uk/~pbl/papers/"&gt;CBPV papers&lt;/a&gt;. There's an &lt;a href="http://requestforlogic.blogspot.com/2011/08/embracing-and-extending-levy-language.html"&gt;introduction to CBPV&lt;/a&gt; for more mortal-like folks. Other material is hard to find.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What caught my eye was the following code sample from Paul Blain Levy's (rhymes with "all plain Stevie") &lt;a href="http://www.cs.bham.ac.uk/~pbl/papers/thesisqmwphd.pdf"&gt;PhD thesis&lt;/a&gt;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;tt&gt;thunk(print "hello1"; λz. print "we just popped" z; ...)&lt;/tt&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, apparently you can do stuff in a function before you're even taking arguments. Interested!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Maybe one of you can provide more information about this interesting new thing?!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-7482298941505509570?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/7482298941505509570/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=7482298941505509570&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/7482298941505509570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/7482298941505509570'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/12/call-by-push-value.html' title='Call-by-push-value'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-5601519639353158432</id><published>2011-12-21T17:32:00.003+01:00</published><updated>2011-12-21T17:48:48.442+01:00</updated><title type='text'>Looking back at predictions for 2011</title><content type='html'>Let's take a look at my &lt;a href="http://axisofeval.blogspot.com/2010/12/pl-predictions-for-2011.html"&gt;PL Predictions for 2011&lt;/a&gt;:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;▶ JSON will be the default format for new internet APIs.&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm not sure how to corroborate this one, but I think it's true. The most significant piece of evidence I have is that IBM even developed JSONx, a standard for &lt;a href="http://publib.boulder.ibm.com/infocenter/wsdatap/v3r8m1/index.jsp?topic=/xs40/convertingbetweenjsonandjsonx05.htm"&gt;representing JSON as XML&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;▶ As more people use JSON, we'll see a XML renaissance, as we - for the first time - discover that XML actually gets some things right.&lt;/i&gt;&lt;/b&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;Didn't really happen, AFAICS.  But there's this post: &lt;i&gt;&lt;a href="http://blog.apigee.com/detail/why_xml_wont_die_xml_vs._json_for_your_api/"&gt;Why XML won’t die: XML vs. JSON for your API&lt;/a&gt;&lt;/i&gt; which says: &lt;i&gt;"not everything in the world is a programming-language object"&lt;/i&gt;. +1 to that.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;▶ GHC will get typed type-level programming and end this highly embarrassing state of untypedness.&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://news.ycombinator.com/item?id=3174727"&gt;Strike&lt;/a&gt;!&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;▶ We'll have a verified compiler-and-OS toolchain for compiling and running some kinds of apps. It won't be x86-based.&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Unfortunately, I didn't really track this issue in 2011. There's &lt;a href="http://lambda-the-ultimate.org/node/4353"&gt;SAFE&lt;/a&gt;, and maybe the O'Caml folks have something to show.&lt;/div&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;▶ All kinds of stuff targetting JavaScript.&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Yeah, well, that was easy. My favorite is &lt;a href="http://axisofeval.blogspot.com/2011/02/emscripten.html"&gt;Emscripten&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;▶ Split stacks and maybe some scheduler improvements will be shown competitive with green threads in the millions-of-threads!!1! (anti-)scenario.&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Nobody did this AFAIK, but I still think it's true. Maybe next year.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;i&gt;&lt;b&gt;▶ some insanely great new PL for 2011&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://axisofeval.blogspot.com/2011/08/praising-kernel.html"&gt;Kernel&lt;/a&gt;!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, although most of the predictions were rather cautious, I'm satisified with the outcome.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-5601519639353158432?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/5601519639353158432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=5601519639353158432&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/5601519639353158432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/5601519639353158432'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/12/looking-back-at-predictions-for-2011.html' title='Looking back at predictions for 2011'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-4487316928189236888</id><published>2011-12-19T19:04:00.002+01:00</published><updated>2011-12-19T19:10:30.398+01:00</updated><title type='text'>what distinguishes a good program from a bad one</title><content type='html'>&lt;i&gt;&lt;b&gt;&lt;a href="http://blog.ezyang.com/2011/12/bugs-and-battleships/"&gt;Bugs and Battleships&lt;/a&gt;&lt;/b&gt;&lt;/i&gt; by Edward Z. Yang:&lt;br /&gt;&lt;blockquote&gt;&lt;img style="width: 400px; height: 201px;" src="http://4.bp.blogspot.com/-77apTDoAQSA/Tu99kMYqDJI/AAAAAAAAA4U/eh8hw0YXvck/s400/bad-good-software.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5687902915145632914" /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;i&gt;One might even say that the ability to generalize behavior of specific tests to the behavior of the program is precisely what distinguishes a good program from a bad one. A bad program is filled with many, many different cases, all of which must be tested individually in order to achieve assurance.&lt;/i&gt;&lt;/blockquote&gt;(HT @&lt;a href="https://twitter.com/#!/dyokomizo"&gt;dyokomizo&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-4487316928189236888?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/4487316928189236888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=4487316928189236888&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/4487316928189236888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/4487316928189236888'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/12/what-distinguishes-good-program-from.html' title='what distinguishes a good program from a bad one'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-77apTDoAQSA/Tu99kMYqDJI/AAAAAAAAA4U/eh8hw0YXvck/s72-c/bad-good-software.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-7666335055061383031</id><published>2011-12-13T03:58:00.001+01:00</published><updated>2011-12-13T03:59:23.705+01:00</updated><title type='text'>URLs</title><content type='html'>One of my all-time favorite &lt;a href="http://www.w3.org/People/Connolly/9703-web-apps-essay.html"&gt;quotes&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;Uniform Resource Locator&lt;i&gt; is just the result of squeezing the term &lt;/i&gt;object reference&lt;i&gt; through the IETF standardization process.&lt;/i&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-7666335055061383031?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/7666335055061383031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=7666335055061383031&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/7666335055061383031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/7666335055061383031'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/12/urls.html' title='URLs'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-4510959242343856317</id><published>2011-11-26T01:18:00.008+01:00</published><updated>2011-11-28T00:15:54.844+01:00</updated><title type='text'>The extensible way of thinking</title><content type='html'>'Twas November, 30 years ago:&lt;div&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;i&gt;&lt;span class="Apple-style-span"&gt;Aucbvax.5036&lt;br /&gt;fa.editor-p&lt;br /&gt;utzoo!decvax!ucbvax!editor-people&lt;br /&gt;Mon Nov  9 17:17:40 1981&lt;br /&gt;&lt;br /&gt;&amp;gt;&lt;a href="http://quux.org:70/Archives/usenet-a-news/FA.editor-p/81.11.09_ucbvax.5036_fa.editor-p.txt"&gt;From RMS@MIT-AI Mon Nov  9 16:43:23 1981&lt;/a&gt;&lt;br /&gt;Union types do not suffice for writing MEMBER.&lt;br /&gt;&lt;br /&gt;They may be appear to be sufficient, if you look at a single program rather than at changing the program.  But MEMBER is supposed to work on any type which does or EVER WILL exist.  It should not be necessary to alter the definition of MEMBER and 69 other functions, or even to recompile them, every time a new type is added.&lt;br /&gt;&lt;br /&gt;The only way to avoid this is if the system allows new alternatives to be added to a previously defined union type.  And this must have the effect of causing all variables, functions and structures previously declared using the union type to accept the new alternatives, without the user's having to know what variables, functions or structures they are.  Then you can define a union type called EVERYTHING and add all new types to that union.  But then the system should save you trouble and automatically add all new types to the union EVERYTHING. This is tantamount to permitting you not to declare the type.&lt;br /&gt;&lt;br /&gt;External variables are vital for extensible systems.  A demonstration of this is in my EMACS paper, AI memo 519a.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Beliefs such as that type declarations are always desirable, and that external variables should be replaced by explicit parameters, and that it is good to control where a function can be called from, are based on a static way of looking at a program.&lt;/b&gt;  There is only one program being considered, and the goal is to express that one program in the clearest possible manner, making all errors (in other words, all changes!) as difficult as possible.  Naturally, mechanisms that incorporate redundancy are used for this.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The extensible way of thinking says that we want to make it as easy as possible to get to as many different useful variations as possible. It is not one program that we want, but options on many programs. &lt;/b&gt;Taking this as a goal, one reaches very different conclusions about what is good in a programming language.  It looks less like ADA and more like Lisp.&lt;br /&gt;&lt;br /&gt;It is no coincidence that "computer scientists" have been using the static view in designing their languages.  The research has been sponsored for the sake of military projects for which that viewpoint may be appropriate.  But it is not appropriate for other things. An editor designed to be reliable enough to be "man-rated" is a waste of effort; and &lt;b&gt;if this unnecessary feature interferes with extensibility, it is actually harmful&lt;/b&gt;.&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;HT Usenet historian &lt;a href="http://chneukirchen.org/trivium/"&gt;Chris&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-4510959242343856317?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/4510959242343856317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=4510959242343856317&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/4510959242343856317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/4510959242343856317'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/11/extensible-way-of-thinking.html' title='The extensible way of thinking'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-2162704809216359865</id><published>2011-11-11T10:17:00.007+01:00</published><updated>2011-11-11T10:25:45.486+01:00</updated><title type='text'>Happy Birthday Go</title><content type='html'>&lt;a href="http://blog.golang.org/2011/11/go-programming-language-turns-two.html" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 370px; height: 400px;" src="http://4.bp.blogspot.com/-DADDcQSHslk/TrzoPFR9xkI/AAAAAAAAA34/dy6GNO3Fmhw/s400/costume.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5673664976393193026" /&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blog.golang.org/2011/11/go-programming-language-turns-two.html"&gt;The Go Programming Language turns two&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I really want to like Go (Commander Pike is one of my heroes, and systems programming currently either means C or a Special Olympics scripting language). But I'm slightly put off by the lack of exceptions, and the seemingly gratuitous concepts offered instead. Does anyone have experience with how this aspect of Go pans out in real world use?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-2162704809216359865?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/2162704809216359865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=2162704809216359865&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2162704809216359865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2162704809216359865'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/11/happy-birthday-go.html' title='Happy Birthday Go'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-DADDcQSHslk/TrzoPFR9xkI/AAAAAAAAA34/dy6GNO3Fmhw/s72-c/costume.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-1857463942082438474</id><published>2011-11-10T13:01:00.005+01:00</published><updated>2011-11-10T17:31:47.440+01:00</updated><title type='text'>Is JavaScript a Lisp in disguise?</title><content type='html'>It is something of a commonplace to say that &lt;strike&gt;Horror&lt;/strike&gt;JavaScript is a Lisp or Scheme in disguise.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But that's completely wrong!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Yeah, JavaScript gets closures right, and that has become the yardstick for measuring amateur-designed languages. If you do closures right, your language immediately enters the upper echelons of the language space. Sad, but true.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But in &lt;i&gt;every&lt;/i&gt; other respect, JavaScript &lt;i&gt;completely&lt;/i&gt; fails the Kool-Aid Lisp Test.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Peruse the &lt;a href="http://web.archive.org/web/20110724195120/http://abhishek.geek.nz/docs/features-of-common-lisp/"&gt;good old list of Lisp features&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Rich arithmetic: NO&lt;/div&gt;&lt;div&gt;Multiple values: NO&lt;/div&gt;&lt;div&gt;Macros: NO&lt;/div&gt;&lt;div&gt;Closures: YES&lt;br /&gt;Complex Lambda lists (optional, keyword, rest parameters): NO&lt;/div&gt;&lt;div&gt;Conditions, restarts: NO&lt;/div&gt;&lt;div&gt;Generic functions: MAYBE (through JS's hare-brained "object system")&lt;/div&gt;&lt;div&gt;Programmable parser: NO&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But most of all:&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;THE HALLMARKS OF LISP HAVE ALWAYS BEEN EXTREME FLEXIBILITY AND EXTENSIBILITY, AND A MINIMUM OF NONSENSE THAT GETS IN YOUR WAY.&lt;a href="http://users.rcn.com/david-moon/PLOT/page-1.html"&gt;*&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;JavaScript offers a maximum of nonsense, as amply documented. If you use Perl, you have 2 problems. If you use JavaScript, you have NaN problems.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you say that JavaScript is a Lisp, you don't know jack about Lisp.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-1857463942082438474?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/1857463942082438474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=1857463942082438474&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/1857463942082438474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/1857463942082438474'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/11/is-javascript-lisp-in-disguise.html' title='Is JavaScript a Lisp in disguise?'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-465923633421908948</id><published>2011-11-09T22:08:00.008+01:00</published><updated>2011-11-09T22:31:05.886+01:00</updated><title type='text'>Linkdump</title><content type='html'>I'm working on a Ninjas/Nazis/Bavarian Illuminati/Aliens/Werewolves* movie, so I don't have as much time for PL geekery atm. Here are some interesting links I haven't checked out fully yet.&lt;div&gt;&lt;br /&gt;▶ &lt;a href="http://goto.ucsd.edu/~rjhala/papers/nested_refinements_a_logic_for_duck_typing.html" style="font-weight: bold; font-style: italic; "&gt;Nested Refinements: A Logic For Duck Typing&lt;/a&gt; (via @&lt;a href="https://twitter.com/#!/swannodette"&gt;swannodette&lt;/a&gt;)&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;Programs written in dynamic languages make heavy use of features — run-time type tests, value-indexed dictionaries, polymorphism, and higher-order functions — that are beyond the reach of type systems that employ either purely syntactic or purely semantic reasoning. We present a core calculus, System D, that merges these two modes of reasoning into a single powerful mechanism of nested re- ﬁnement types wherein the typing relation is itself a predicate in the reﬁnement logic. System D coordinates SMT-based logical implication and syntactic subtyping to automatically typecheck sophisticated dynamic language programs. By coupling nested reﬁnements with McCarthy’s theory of ﬁnite maps, System D can precisely reason about the interaction of higher-order functions, polymorphism, and dictionaries. The addition of type predicates to the reﬁnement logic creates a circularity that leads to unique technical challenges in the metatheory, which we solve with a novel stratiﬁcation approach that we use to prove the soundness of System D.&lt;/i&gt;&lt;/blockquote&gt;(See also &lt;a href="http://www.foreignpolicy.com/articles/2011/10/28/black_market_global_economy?page=full"&gt;&lt;i&gt;The Shadow Superpower: the $10 trillion global black market is the world's fastest growing economy&lt;/i&gt;&lt;/a&gt;: &lt;i&gt;"System D is a slang phrase pirated from French-speaking Africa and the Caribbean. The French have a word that they often use to describe particularly effective and motivated people. They call them débrouillards. To say a man is a débrouillard is to tell people how resourceful and ingenious he is."&lt;/i&gt;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;▶ &lt;i&gt;&lt;b&gt;&lt;a href="http://stanford-online.stanford.edu/courses/ee380/111102-ee380-300.asx"&gt;Dart Talk @ Stanford&lt;/a&gt;&lt;/b&gt;&lt;/i&gt; (I think this is by Bracha. Haven't checked it out coz it's in some weird Windows format.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;▶ &lt;i&gt;&lt;b&gt;&lt;a href="http://explainextended.com/2010/05/07/things-sql-needs-merge-join-that-would-seek/"&gt;Things SQL needs: MERGE JOIN that would seek&lt;/a&gt;&lt;/b&gt;&lt;/i&gt; (Nice idea about using histograms to speed up index scans. I believe the &lt;a href="http://code.google.com/appengine/articles/indexselection.html"&gt;new App Engine query planner&lt;/a&gt; does that or something similar. Also &lt;a href="http://delicious.com/redirect?url=http://www.rwavesolutions.com/Tips/UnderstandingHistogramPPT.prn.pdf"&gt;&lt;i&gt;Understanding Histograms in Oracle&lt;/i&gt;&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;▶ &lt;i&gt;&lt;b&gt;&lt;a href="http://lambda-the-ultimate.org/node/4394#comment-68161"&gt;I'm a big fan of the tagless-final approach!&lt;/a&gt;&lt;/b&gt;&lt;/i&gt; (This comment caught my interest, because it reminds me of Kernel:&lt;i&gt; "everything in the language has to become both directly interpretable and available as an AST"&lt;/i&gt;.)&lt;br /&gt;&lt;br /&gt;▶ &lt;i&gt;&lt;b&gt;&lt;a href="http://news.ycombinator.com/item?id=3174727"&gt;New extension to Haskell -- data types and polymorphism at the type level&lt;/a&gt;&lt;/b&gt;&lt;/i&gt; (&lt;a href="http://lambda-the-ultimate.org/node/4088"&gt;Ωmega&lt;/a&gt;-like.)&lt;br /&gt;&lt;br /&gt;▶ &lt;span style="font-style:italic;"&gt;&lt;b&gt;&lt;a href="http://java.dzone.com/news/evolution-ddd-cqrs-and-event"&gt;Evolution of DDD: CQRS and Event Sourcing&lt;/a&gt;&lt;/b&gt;&lt;span style="font-weight:bold;"&gt;&lt;/span&gt;&lt;/span&gt; (@&lt;a href="https://twitter.com/#!/dyokomizo"&gt;dyokomizo&lt;/a&gt; hyped this weird-sounding stuff in response to &lt;a href="http://axisofeval.blogspot.com/2011/10/how-to-beat-cap-theorem.html"&gt;&lt;i&gt;Beating the CAP theorem&lt;/i&gt;&lt;/a&gt;).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(* As &lt;a href="http://www.reelz.com/movie-news/4303/the-blob-next-for-rob-zombie-maybe-werewolf-women-of-the-ss/"&gt;Rob Zombie says&lt;/a&gt;: &lt;i&gt;"I feel that the Nazi movie is back. Once the trend comes back, the Nazi trends comes back, now you pervert it like crazy and you add werewolves. So, I don't know if we'll ever see that movie, but now is the time. The time is now to strike with this."&lt;/i&gt;)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-465923633421908948?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/465923633421908948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=465923633421908948&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/465923633421908948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/465923633421908948'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/11/linkdump.html' title='Linkdump'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-2748102088249747274</id><published>2011-11-08T17:23:00.010+01:00</published><updated>2011-11-08T20:11:43.203+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><title type='text'>Open, extensible composition models</title><content type='html'>&lt;div&gt;&lt;i&gt;&lt;b&gt;&lt;a href="http://www.vpri.org/pdf/tr2011002_oecm.pdf"&gt;Open, extensible composition models&lt;/a&gt;&lt;/b&gt;&lt;/i&gt; by Ian Piumarta.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt;Did VPRI just enter the FEXPR game?&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;The evaluator corrects several semantic inadequacies of LISP &lt;/i&gt;&lt;i&gt;(described by Stoyan [5]) and is metacircular (written in the &lt;/i&gt;&lt;i&gt;language it evaluates). The language provides:&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;lists and atomic values, including symbols&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;primitive functions called SUBRs&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;symbolic functions (closures) called EXPRs&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;a FIXED object that &lt;b&gt;encapsulates another applicable &lt;/b&gt;&lt;/i&gt;&lt;i&gt;&lt;b&gt;value and prevents argument evaluation&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;predicates to discriminate between the above types&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;built-in SUBRs to access the contents of these values&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;a way to &lt;/i&gt;call&lt;i&gt; the primitive behaviour of a SUBR&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;a quotation mechanism to prevent evaluation of literals&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;(my emphasis)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;div&gt;More later. HT @&lt;a href="https://twitter.com/#!/CraigOverend"&gt;CraigOverend&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Update:&lt;/b&gt; Oh, also new: &lt;a href="http://www.vpri.org/pdf/tr2011004_steps11.pdf"&gt;&lt;i&gt;Alan Kay et al.: STEPS Toward Espressive [sic] Programming Systems, 2011 Progress Report&lt;/i&gt;&lt;/a&gt; HT &lt;a href="http://blog.felter.org/post/12504450387/alan-kay-et-al-steps-toward-espressive-programming"&gt;hack the planet in exile&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-2748102088249747274?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/2748102088249747274/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=2748102088249747274&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2748102088249747274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2748102088249747274'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/11/open-extensible-composition-models.html' title='Open, extensible composition models'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-3970439113829150031</id><published>2011-10-29T16:00:00.002+02:00</published><updated>2011-10-29T16:03:24.763+02:00</updated><title type='text'>They said it couldn’t be done, and he did it</title><content type='html'>The &lt;a href="http://herbsutter.com/2011/10/12/dennis-ritchie/"&gt;&lt;b&gt;post on Dennis Ritchie&lt;/b&gt;&lt;/a&gt; by Herb Sutter is wonderful:&lt;br /&gt;&lt;i&gt;&lt;blockquote&gt;Before C, there was far more hardware diversity than we see in the industry today. Computers proudly sported not just deliciously different and offbeat instruction sets, but varied wildly in almost everything, right down to even things as fundamental as character bit widths (8 bits per byte doesn’t suit you? how about 9? or 7? or how about sometimes 6 and sometimes 12?) and memory addressing (don’t like 16-bit pointers? how about 18-bit pointers, and oh by the way those aren’t pointers to bytes, they’re pointers to words?).&lt;br /&gt;&lt;br /&gt;There was no such thing as a general-purpose program that was both portable across a variety of hardware and also efficient enough to compete with custom code written for just that hardware. Fortran did okay for array-oriented number-crunching code, but nobody could do it for general-purpose code such as what you’d use to build just about anything down to, oh, say, an operating system.&lt;br /&gt;&lt;br /&gt;So this young upstart whippersnapper comes along and decides to try to specify a language that will let people write programs that are: (a) high-level, with structures and functions; (b) portable to just about any kind of hardware; and (c) efficient on that hardware so that they’re competitive with handcrafted nonportable custom assembler code on that hardware. A high-level, portable, efficient systems programming language.&lt;br /&gt;&lt;br /&gt;How silly. Everyone knew it couldn’t be done.&lt;br /&gt;&lt;br /&gt;C is a poster child for why it’s essential to keep those people who know a thing can’t be done from bothering the people who are doing it. (And keep them out of the way while the same inventors, being anything but lazy and always in search of new problems to conquer, go on to use the world’s first portable and efficient programming language to build the world’s first portable operating system, not knowing that was impossible too.)&lt;br /&gt;&lt;br /&gt;Thanks, Dennis.&lt;/blockquote&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-3970439113829150031?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/3970439113829150031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=3970439113829150031&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3970439113829150031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3970439113829150031'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/10/they-said-it-couldnt-be-done-and-he-did.html' title='They said it couldn’t be done, and he did it'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-5676182594180924990</id><published>2011-10-24T20:26:00.006+02:00</published><updated>2011-10-24T21:29:59.149+02:00</updated><title type='text'>Toolstrapping is everywhere - can you see it?</title><content type='html'>Jacques Mattheij &lt;a href="http://jacquesmattheij.com/I+hate+cut-and-paste"&gt;introduces&lt;/a&gt; an evocative term: &lt;i&gt;&lt;b&gt;toolstrapping&lt;/b&gt;&lt;/i&gt;: "Whatever tool you are building, you need that tool to build the tool."&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of the reasons behind the continuing success of C seems to be that, by virtue of it being the standard programming language, there's no toolstrapping involved in using C (because it's already been done for you).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the world of Scheme, we have the phenomenon that most Scheme implementations are written in Scheme, eternally perpetrating Scheme's sillier parts.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And people who say that plain text is somehow natural or native to computing simply ignore the toolstrapping involved in plain text: your quaint Unix is already toolstrapped up the wazoo for handling plain text. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://axisofeval.blogspot.com/2011/02/browsers-will-let-pls-break-free-from.html"&gt;The browser is a chance&lt;/a&gt; to raise the toolstrap bar: from plain text to hypermedia. The window of opportunity closes once we're able to &lt;a href="http://axisofeval.blogspot.com/2011/02/emscripten.html"&gt;run Emacs in X11 in the browser&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-5676182594180924990?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/5676182594180924990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=5676182594180924990&amp;isPopup=true' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/5676182594180924990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/5676182594180924990'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/10/toolstrapping.html' title='Toolstrapping is everywhere - can you see it?'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-3022294791996822222</id><published>2011-10-20T22:51:00.000+02:00</published><updated>2011-10-20T22:52:15.573+02:00</updated><title type='text'>It's called programming</title><content type='html'>&lt;blockquote&gt;&lt;i&gt;People get annoyed when they must write two lines of code instead of one, but I don't. It's called programming.&lt;/i&gt; – &lt;a href="https://twitter.com/#!/rob_pike/status/62909444551491584"&gt;Rob Pike&lt;/a&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-3022294791996822222?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/3022294791996822222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=3022294791996822222&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3022294791996822222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3022294791996822222'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/10/its-called-programming.html' title='It&apos;s called programming'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-7970487820912920733</id><published>2011-10-13T22:56:00.005+02:00</published><updated>2011-10-13T23:22:07.299+02:00</updated><title type='text'>How to beat the CAP theorem</title><content type='html'>Nathan Marz has an interesting proposal, &lt;b&gt;&lt;i&gt;&lt;a href="http://nathanmarz.com/blog/how-to-beat-the-cap-theorem.html"&gt;How to beat the CAP theorem&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;, that should resonate with all you FP shills out there:&lt;div&gt;&lt;ul&gt;&lt;li&gt;make all your data immutable&lt;/li&gt;&lt;li&gt;index snapshots of your data using "purely functional" batch computing (e.g. MapReduce)&lt;/li&gt;&lt;li&gt;index the realtime data arriving after the last snapshot using an incremental computing system&lt;/li&gt;&lt;li&gt;for querying, merge the index of the last batch job with that of the incremental system&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;As Marz explains, incremental computing has a much higher complexity than batch computing. Using it only for the &lt;i&gt;last few hours&lt;/i&gt; of data &lt;i&gt;removes a huge complexity burden from your shoulders&lt;/i&gt;:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;i&gt;Since the realtime layer only compensates for the last few hours of data, everything the realtime layer computes is eventually overridden by the batch layer. So if you make a mistake or something goes wrong in the realtime layer, the batch layer will correct it. All that complexity is transient.&lt;/i&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-7970487820912920733?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/7970487820912920733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=7970487820912920733&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/7970487820912920733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/7970487820912920733'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/10/how-to-beat-cap-theorem.html' title='How to beat the CAP theorem'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-8139212661343619481</id><published>2011-10-11T22:16:00.001+02:00</published><updated>2011-10-11T22:18:18.035+02:00</updated><title type='text'>Programming Language Checklist</title><content type='html'>&lt;b&gt;&lt;a href="http://colinm.org/language_checklist.html"&gt;Programming Language Checklist&lt;/a&gt;&lt;/b&gt;: &lt;i&gt;You appear to be advocating a new programming language.  Your language will not work.  Here is why it will not work.&lt;/i&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(via @&lt;a href="https://twitter.com/#!/importantshock"&gt;importantshock&lt;/a&gt;)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-8139212661343619481?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/8139212661343619481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=8139212661343619481&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/8139212661343619481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/8139212661343619481'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/10/programming-language-checklist.html' title='Programming Language Checklist'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-8170803212964183726</id><published>2011-09-29T12:04:00.003+02:00</published><updated>2011-09-29T12:05:58.811+02:00</updated><title type='text'>Alan Kay on type systems</title><content type='html'>&lt;i&gt;&lt;blockquote&gt;I'm not against types, but I don't know of any type systems that aren't a complete pain, so I still like dynamic typing.&lt;/blockquote&gt;&lt;/i&gt;(HT &lt;a href="https://twitter.com/#!/psnively"&gt;Paul Snively&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-8170803212964183726?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/8170803212964183726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=8170803212964183726&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/8170803212964183726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/8170803212964183726'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/09/alan-kay-on-type-systems.html' title='Alan Kay on type systems'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-435005210533013093</id><published>2011-09-19T22:43:00.003+02:00</published><updated>2011-09-19T22:51:38.991+02:00</updated><title type='text'>Delimited continuations papers 2</title><content type='html'>&lt;div&gt;Had a conversation with a friend about delimited, composable continuations again. Previously, I've linked to some &lt;b&gt;&lt;a href="http://axisofeval.blogspot.com/2011/07/some-nice-paperz.html"&gt;papers about delimited continuations&lt;/a&gt;&lt;/b&gt;. Here are two important ones:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.43.8213"&gt;&lt;b&gt;&lt;i&gt;Representing Monads&lt;/i&gt;&lt;/b&gt;&lt;/a&gt;: &lt;i&gt;We show that any monad whose unit and extension operations are expressible as purely functional terms can be embedded in a call-by-value language with "composable continuations". As part of the development, we extend Meyer and Wand's characterization of the relationship between continuation-passing and direct style to one for continuation-passing vs. general "monadic" style. We further show that the composable continuations construct can itself be represented using ordinary, non-composable first-class continuations and a single piece of state. Thus, in the presence of two specific computational effects -- storage and escapes -- any expressible monadic structure (e.g., nondeterminism as represented by the list monad) can be added as a purely definitional extension, without requiring a reinterpretation of the whole language. The paper includes an implementation of the construction (in Standard ML with some New Jersey extensions) and several examples.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;&lt;a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.68.9352"&gt;A monadic framework for delimited continuations&lt;/a&gt;&lt;/b&gt;&lt;/i&gt;: &lt;i&gt;Delimited continuations are more expressive than traditional abortive continuations and they apparently seem to require a framework beyond traditional continuation-passing style (CPS). We show that this is not the case: standard CPS is sufficient to explain the common control operators for delimited continuations. We demonstrate this fact and present an implementation as a Scheme library. We then investigate a typed account of delimited continuations that makes explicit where control effects can occur. This results in a monadic framework for typed and encapsulated delimited continuations which we design and implement as a Haskell library.&lt;/i&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've blogged about the &lt;a href="http://axisofeval.blogspot.com/2011/08/notes-on-delimited-continuations.html"&gt;&lt;b&gt;API and hair-raising example&lt;/b&gt;&lt;/a&gt; offered in this paper before.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-435005210533013093?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/435005210533013093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=435005210533013093&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/435005210533013093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/435005210533013093'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/09/delimited-continations-papers-2.html' title='Delimited continuations papers 2'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-231076830248749004</id><published>2011-09-08T17:49:00.009+02:00</published><updated>2011-09-10T13:59:26.684+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><title type='text'>The Kernel Underground</title><content type='html'>A quick update on &lt;a href="http://web.cs.wpi.edu/~jshutt/kernel.html"&gt;Kernel&lt;/a&gt; buzz:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are now &lt;strike&gt;fourfivesix&lt;/strike&gt;seven implementations of Kernel and Kernel-like languages, in addition to John Shutt's original &lt;a href="http://web.cs.wpi.edu/~jshutt/sink-01m10.tar.gz"&gt;&lt;i&gt;SINK&lt;/i&gt;&lt;/a&gt;:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://bitbucket.org/AndresNavarro/klisp/overview"&gt;&lt;i&gt;klisp&lt;/i&gt;&lt;/a&gt;, by Andres Navarro. &lt;i&gt;"written in C99 under the MIT license. It draws heavily from the Lua interpreter source code &amp;amp; file structure"&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;a href="https://github.com/tonyg/js-vau"&gt;js-vau&lt;/a&gt;,&lt;/i&gt; by Tony Garnock-Jones. JavaScript.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.eighty-twenty.org/hgwebdir.cgi/smalltalk-tng/file/default/r6f"&gt;&lt;i&gt;vau.rkt&lt;/i&gt;&lt;/a&gt;, by Tony Garnock-Jones. Racket.&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/vito/hummus"&gt;&lt;i&gt;Hummus&lt;/i&gt;&lt;/a&gt;, by Alex Suraci. Haskell.&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/vito/cletus"&gt;&lt;i&gt;Cletus&lt;/i&gt;&lt;/a&gt;, by Alex Suraci. Atomy.&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/manuel/schampignon"&gt;&lt;i&gt;Schampignon&lt;/i&gt;&lt;/a&gt;, by me. JavaScript.&lt;/li&gt;&lt;li&gt;&lt;a href="http://repo.or.cz/w/Klink.git"&gt;&lt;i&gt;Klink&lt;/i&gt;&lt;/a&gt;, by &lt;a href="http://tehom-blog.blogspot.com/search/label/kernel"&gt;Tom Breton&lt;/a&gt;. C.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Check them out for inspiration, and write your own. It's fun. &lt;a href="https://twitter.com/#!/alexsuraci/status/110927231370530816"&gt;Fexprs are fun exprs!&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are some interesting Kernel discussions going on in &lt;a href="http://lambda-the-ultimate.org/node/4345"&gt;the Guile thread&lt;/a&gt; (&lt;a href="http://lambda-the-ultimate.org/node/4346"&gt;and here&lt;/a&gt;) on LtU. David Barbour provides &lt;a href="http://lambda-the-ultimate.org/node/4345#comment-66877"&gt;welcome criticism&lt;/a&gt;. (&lt;i&gt;The truth can only be found in conflict.&lt;/i&gt; - Tarkovksy)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Oh, and I created this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-nPo8up-CfXc/TmjmkzfY5NI/AAAAAAAAA2o/UD2OM-M1kDI/s1600/haskell.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://2.bp.blogspot.com/-nPo8up-CfXc/TmjmkzfY5NI/AAAAAAAAA2o/UD2OM-M1kDI/s400/haskell.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5650019252507829458" style="cursor: pointer; width: 400px; height: 264px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-231076830248749004?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/231076830248749004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=231076830248749004&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/231076830248749004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/231076830248749004'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/09/kernel-underground.html' title='The Kernel Underground'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-nPo8up-CfXc/TmjmkzfY5NI/AAAAAAAAA2o/UD2OM-M1kDI/s72-c/haskell.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-9065563569738651308</id><published>2011-09-07T01:56:00.004+02:00</published><updated>2011-09-07T01:59:59.092+02:00</updated><title type='text'>Syntax is a monad</title><content type='html'>I'm becoming aware of a whole &lt;a href="http://spl.smugmug.com/Humor/Lambdacats/13227630_j2MHcg#960526161_yXhEz"&gt;Lambda-Meme-Universe&lt;/a&gt;! This one via &lt;a href="http://dorophone.blogspot.com/2011/09/scheme-syntax-is-monad.html"&gt;Dorophone&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-7DAvHAXSnvo/TmazVz9b_PI/AAAAAAAAA2g/r_Qmbzgynm4/s1600/schrute-syntax.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 276px;" src="http://3.bp.blogspot.com/-7DAvHAXSnvo/TmazVz9b_PI/AAAAAAAAA2g/r_Qmbzgynm4/s400/schrute-syntax.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5649399969889385714" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-9065563569738651308?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/9065563569738651308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=9065563569738651308&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/9065563569738651308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/9065563569738651308'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/09/syntax-is-monad.html' title='Syntax is a monad'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-7DAvHAXSnvo/TmazVz9b_PI/AAAAAAAAA2g/r_Qmbzgynm4/s72-c/schrute-syntax.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-1791482838537411997</id><published>2011-09-05T20:36:00.001+02:00</published><updated>2011-09-05T20:37:56.353+02:00</updated><title type='text'>Oleg cat</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/-m1mvsnf6I5I/TmUW57kiRxI/AAAAAAAAA2U/XiJNqNfoPiY/s1600/olegcat.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 272px;" src="http://1.bp.blogspot.com/-m1mvsnf6I5I/TmUW57kiRxI/AAAAAAAAA2U/XiJNqNfoPiY/s400/olegcat.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5648946492105443090" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;(via &lt;a href="https://twitter.com/#!/psnively"&gt;Paul&lt;/a&gt;)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-1791482838537411997?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/1791482838537411997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=1791482838537411997&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/1791482838537411997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/1791482838537411997'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/09/oleg-cat.html' title='Oleg cat'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-m1mvsnf6I5I/TmUW57kiRxI/AAAAAAAAA2U/XiJNqNfoPiY/s72-c/olegcat.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-2003272493149512878</id><published>2011-09-01T20:50:00.004+02:00</published><updated>2011-09-01T20:57:17.540+02:00</updated><title type='text'>Mortal combat</title><content type='html'>A &lt;a href="http://axisofeval.blogspot.com/2011/05/why-of-macros.html?showComment=1314900484731#c5009401657801219576"&gt;slightly confused anonymous commenter&lt;/a&gt; (I get to say such things about anonymous commenters, right?) reminded me of this &lt;a href="http://lambda-the-ultimate.org/node/3861#comment-57972"&gt;quote by Ray Dillinger&lt;/a&gt;:&lt;i&gt;&lt;blockquote&gt;The scheme community is now very invested in its macrology; they got there by long hard work and emotional processing and yelling and screaming and weeping and gnashing of teeth, and they still remember the pain of not having a standard macrology. You will not pry it away except from their cold dead fingers, and you will not redefine it without defeating them in mortal combat.&lt;/blockquote&gt;&lt;/i&gt;I think the commenter misunderstood my &lt;a href="http://axisofeval.blogspot.com/2011/09/on-macros.html"&gt;earlier post&lt;/a&gt;. Syntactic extension is &lt;i&gt;absolutely necessary&lt;/i&gt;, and modern Scheme macro systems are a fine way to do it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-2003272493149512878?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/2003272493149512878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=2003272493149512878&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2003272493149512878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2003272493149512878'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/09/mortal-combat.html' title='Mortal combat'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-4441663217138274042</id><published>2011-09-01T17:28:00.009+02:00</published><updated>2011-11-08T20:11:31.247+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><title type='text'>On macros</title><content type='html'>&lt;a href="http://lambda-the-ultimate.org/node/3861#comment-58165"&gt;This post&lt;/a&gt; by David Barbour is one of the most insightful statements on macros I have read (along with &lt;a href="http://axisofeval.blogspot.com/2011/05/why-of-macros.html"&gt;Vladimir Sedach's analysis&lt;/a&gt;):&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;It has been my impression that, no matter what specific thing you use macros to do, you can later invent a neat language feature that handles the problem in a clean and nice manner. The problem is the "later". Macros can do it "now"... in an ugly, brutish manner, true, but the job gets done. ...&lt;/i&gt; &lt;/blockquote&gt;&lt;blockquote&gt;&lt;i&gt;Even among people who find macros smelly, you'll find many who think macros the least distasteful of these choices.&lt;/i&gt;&lt;/blockquote&gt;John Shutt's &lt;a href="http://lambda-the-ultimate.org/node/3861#comment-58169"&gt;response&lt;/a&gt; ties this in with fexprs - instead of delegating the job to a separate preprocessing step, let the language itself have the power of self-extension:&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;Macros are an unpleasant feature to compensate, somewhat, for limitations of a language. It's better to compensate for the limitations than to leave the limitations in place without compensating at all. Better still, though, would be to eliminate the offending limitations. (Remove the weaknesses and restrictions that make additional features appear necessary.) Make no mistake, fexprs don't &lt;/i&gt;necessarily&lt;i&gt; increase the uniform flexibility of the language; but with care in the design they can do so, and thereby, the jobs otherwise done by macros are brought within the purview of the elegant language core. So instead of an ugly brutish fix with macros now and hope for a more elegant replacement later, one can produce a clean solution now with fexprs.&lt;/i&gt;&lt;/blockquote&gt;PS: This point is subtle. After all Scheme is already self-extensible. But Scheme macros still are an additional "layer" on top of, and separate from, the core language. &lt;a href="http://web.cs.wpi.edu/~jshutt/kernel.html"&gt;Kernel&lt;/a&gt;'s fexprs are not - they are the core language, thus bringing self-extension &lt;i&gt;within the purview of the elegant language core&lt;/i&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-4441663217138274042?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/4441663217138274042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=4441663217138274042&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/4441663217138274042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/4441663217138274042'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/09/on-macros.html' title='On macros'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-3921329760162133428</id><published>2011-08-28T11:25:00.001+02:00</published><updated>2011-08-28T11:27:06.315+02:00</updated><title type='text'>I endorse this</title><content type='html'>&lt;a href="http://codebabies.com/"&gt;&lt;img style="width: 400px; height: 253px;" src="http://1.bp.blogspot.com/-rbdeSNbRMOI/TloJzE843AI/AAAAAAAAA2I/8e9_h-fhsVc/s400/html.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5645835855969442818" /&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-3921329760162133428?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/3921329760162133428/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=3921329760162133428&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3921329760162133428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3921329760162133428'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/08/i-endorse-this.html' title='I endorse this'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-rbdeSNbRMOI/TloJzE843AI/AAAAAAAAA2I/8e9_h-fhsVc/s72-c/html.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-3767172472085885312</id><published>2011-08-25T15:40:00.007+02:00</published><updated>2011-08-25T22:53:47.984+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='oop'/><title type='text'>SRII 2011 - Keynote Talk by Alan Kay</title><content type='html'>Another awesome talk by Alan &lt;a href="http://c2.com/cgi/wiki?HeInventedTheTerm"&gt;"I invented the term"&lt;/a&gt; Kay, after the recent &lt;i&gt;&lt;a href="http://lambda-the-ultimate.org/node/4325"&gt;Programming and Scaling&lt;/a&gt;&lt;/i&gt;.&lt;div&gt;&lt;i&gt;&lt;/i&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;i&gt;"The internet is practically the only real object-oriented system on the planet."&lt;/i&gt; (~30:00)&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;div&gt;&lt;iframe src="http://player.vimeo.com/video/22463791?title=0&amp;amp;byline=0&amp;amp;portrait=0" width="400" height="225" frameborder="0"&gt;&lt;/iframe&gt;&lt;p&gt;&lt;a href="http://vimeo.com/22463791"&gt;SRII 2011 - Keynote Talk by Alan Kay - President, Viewpoints Research Institute&lt;/a&gt; from &lt;a href="http://vimeo.com/srii"&gt;SRii GLOBAL CONFERENCE 2011&lt;/a&gt; on &lt;a href="http://vimeo.com/"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Also, the notion of &lt;i&gt;reinventing the flat tire&lt;/i&gt; can't get enough airtime.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-3767172472085885312?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/3767172472085885312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=3767172472085885312&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3767172472085885312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3767172472085885312'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/08/srii-2011-keynote-talk-by-alan-kay.html' title='SRII 2011 - Keynote Talk by Alan Kay'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-8856138743050380390</id><published>2011-08-25T13:46:00.004+02:00</published><updated>2011-08-25T13:49:24.215+02:00</updated><title type='text'>Zippers</title><content type='html'>I really need to understand &lt;a href="http://okmij.org/ftp/continuations/zipper.html"&gt;Zippers&lt;/a&gt;. &lt;a href="http://requestforlogic.blogspot.com/2011/08/holey-data-part-33-type-of-one-hole.html"&gt;This&lt;/a&gt; seems like a good article. In the meantime, I'll meditate on the following diagram.&lt;div&gt;&lt;br /&gt;&lt;img src="http://2.bp.blogspot.com/-VTp38JBpA-0/TlY2efr8_pI/AAAAAAAAA14/u5hUFgrraEc/s400/rjs-fig5.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5644759080485322386" style="background-color:white" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-8856138743050380390?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/8856138743050380390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=8856138743050380390&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/8856138743050380390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/8856138743050380390'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/08/zippers.html' title='Zippers'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-VTp38JBpA-0/TlY2efr8_pI/AAAAAAAAA14/u5hUFgrraEc/s72-c/rjs-fig5.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-1671034808028343577</id><published>2011-08-23T23:16:00.006+02:00</published><updated>2011-08-23T23:21:06.403+02:00</updated><title type='text'>Totally awesome: FOSS Patents: Samsung cites "2001" movie as prior art against iPad patent</title><content type='html'>&lt;blockquote&gt;&lt;i&gt;Attached hereto as Exhibit D is a true and correct copy of a still image taken from Stanley Kubrick's 1968 film "2001: A Space Odyssey." In a clip from that film lasting about one minute, two astronauts are eating and at the same time using personal tablet computers. The clip can be downloaded online at &lt;a href="http://www.youtube.com/watch?v=JQ8pQVDyaLo"&gt;http://www.youtube.com/watch?v=JQ8pQVDyaLo&lt;/a&gt;. As with the design claimed by the D’889 Patent, the tablet disclosed in the clip has an overall rectangular shape with a dominant display screen, narrow borders, a predominately flat front surface, a flat back surface (which is evident because the tablets are lying flat on the table's surface), and a thin form factor.&lt;/i&gt;&lt;/blockquote&gt;&lt;a href="http://fosspatents.blogspot.com/2011/08/samsung-cites-stanley-kubricks-2001.html"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 384px;" src="http://1.bp.blogspot.com/-l0buN3azU7I/TlQYwk7wofI/AAAAAAAAA1w/FAOLdViGM7Q/s400/2001.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5644163455829189106" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(via @&lt;a href="https://twitter.com/#!/chris_stevenson"&gt;chris_stevenson&lt;/a&gt;:@&lt;a href="https://twitter.com/#!/stilkov"&gt;stilkov&lt;/a&gt;)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-1671034808028343577?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/1671034808028343577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=1671034808028343577&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/1671034808028343577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/1671034808028343577'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/08/totally-awesome-foss-patents-samsung.html' title='Totally awesome: FOSS Patents: Samsung cites &quot;2001&quot; movie as prior art against iPad patent'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-l0buN3azU7I/TlQYwk7wofI/AAAAAAAAA1w/FAOLdViGM7Q/s72-c/2001.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-3019550402167006997</id><published>2011-08-21T15:02:00.002+02:00</published><updated>2011-08-21T15:05:41.340+02:00</updated><title type='text'>Software is a branch of movies</title><content type='html'>A post by HXA about the &lt;a href="http://www.hxa.name/notes/note-hxa7241-20110821T1132Z.html"&gt;ideology of software engineering&lt;/a&gt; prompted me to re-read an old &lt;a href="http://xanadu.com/zigzag/fw99/zxInternals.html"&gt;Ted Nelson essay&lt;/a&gt;. Some choice quotes:&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;"Virtual" does not mean, as many think, three-dimensional.  It is the opposite of *real*.&lt;br /&gt;&lt;br /&gt;Virtuality therefore means the *apparent structure of things*&lt;br /&gt;&lt;br /&gt;Engineers generally deal with constructing reality.  Movie-makers and software designers deal with constructing virtuality.&lt;br /&gt;&lt;br /&gt;Software is a branch of movies.&lt;br /&gt;&lt;br /&gt;Movies enact events on a screen that affect the heart and mind of a viewer.  Software enacts events on a screen which affect the heart and mind of a user, AND INTERACT.&lt;/i&gt;&lt;/blockquote&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-3019550402167006997?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/3019550402167006997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=3019550402167006997&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3019550402167006997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3019550402167006997'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/08/software-is-branch-of-movies.html' title='Software is a branch of movies'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-5685621978232609252</id><published>2011-08-20T13:25:00.010+02:00</published><updated>2011-08-21T17:38:50.933+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><title type='text'>Praising Kernel</title><content type='html'>&lt;span class="Apple-style-span"&gt;I love &lt;a href="http://web.cs.wpi.edu/~jshutt/kernel.html"&gt;&lt;b&gt;Kernel&lt;/b&gt;&lt;/a&gt;! Let's face it: While Paul Graham has reanimated Lisp, Lisp has become stuck in a rut. CL hasn't changed since '94, and it probably won't, and heck, that's even a good thing - CL &lt;a href="http://c2.com/cgi/wiki?CommonLisp"&gt;is&lt;/a&gt; &lt;i&gt;the mud ball of strength, the acting patriarch of the Lisp family&lt;/i&gt;. There's a better chance of CL being around in 50 years than most other programming languages. The same for Scheme, although it's in a bit of an identity crisis right now. But what's crazy about Scheme is that it has become focused on ahead-of-time compilation, in a world where people run Linux in JavaScript JIT compilers. One of the purposes of Scheme should be to push compiler writers to be smarter. Let's forget all that static, performance-oriented stuff, let's make it as &lt;i&gt;dynamic&lt;/i&gt; and &lt;i&gt;general&lt;/i&gt; and &lt;i&gt;simple&lt;/i&gt; as it can get, and spend the following decades on &lt;i&gt;&lt;a href="ftp://publications.ai.mit.edu/ai-publications/pdf/AITR-474.pdf"&gt;amazing new tech&lt;/a&gt;&lt;/i&gt; to make it &lt;i&gt;fast&lt;/i&gt;! That's what Scheme's about, right? And let's not talk about Clojure, they don't even "see the need" for EVAL [in Clojure&lt;i&gt;Script&lt;/i&gt;]. So much for the state of Lisp. Can you see it? We need to put the fun, nasty fun, back into Lisp. Lisp has been resting on its well-deserved laurels for much too long. Heck, even Java is getting lambdas now, and there's talk of macros in JavaScript. Lisp's purpose in the programming language galaxy is &lt;a href="http://www.paulgraham.com/quotes.html"&gt;to&lt;/a&gt; &lt;i&gt;assist our most gifted fellow humans in thinking previously impossible thoughts, &lt;/i&gt;remember? Do you really think current Lisps are up to that task?&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;So where does Kernel fit in? In short, I think Kernel is as close as you can get to the essence, the &lt;a href="http://fexpr.blogspot.com/2011/04/fexpr.html"&gt;rhyming scheme of Lisp&lt;/a&gt;. Whereas the R6RS doesn't even mention interactive development, Kernel is squarely interactive. And it provides crystal clear semantics to go with it. LETREC blackhole? Hopeless toplevel? Not in Kernel. First-class environments solve these issues. Look, Kernel has a single form, $vau, that is as powerful as lambda, define-syntax, and let-syntax combined! (Strike that, it's even more powerful - you can use Kernel's macros, &lt;i&gt;fexprs&lt;/i&gt;, just like ordinary functions.) Need I say more? Kernel can truly bootstrap itself from its &lt;b&gt;3&lt;/b&gt; (&lt;a href="http://www.eighty-twenty.org/index.cgi/tech/scheme/constructing-kernels-if-20110816.html"&gt;or less&lt;/a&gt;) built-in forms (counting them is &lt;a href="http://lambda-the-ultimate.org/node/4093#comment-62873"&gt;not easy&lt;/a&gt;), without the need for a separate &lt;a href="http://www.r6rs.org/final/html/r6rs/r6rs-Z-H-13.html"&gt;expansion process&lt;/a&gt;, and without the need for a hygiene system - Kernel is simply inherently hygienic (when used right). Another form, $define!, not only takes on the roles of define and set!, but also doubles, nay, triples, nay, n-tuples, as a primitive for arbitrary namespace manipulation - you can build &lt;i&gt;any module system you like&lt;/i&gt; on top of this single primitive! Think about it? Can your language do that? Fat chance! But should your &lt;i&gt;Lisp&lt;/i&gt; be able to do that? I'd say. Now, you say, but no one has written real applications in Kernel yet. I say: that's what's so cool about it! It's a brave new world, without trodden paths, full of new discoveries in semantics, implementation technologies, and other things we can't even see yet. In the past 50 years, Lisp has succeeded in bringing object-orientation, dynamism, functional programming, and other niceties to the philistines. Soon, they'll even have macros and EVAL. Now it's time for Lisp to move another 50 years forward. &lt;i&gt;That's what Lisp is for!&lt;/i&gt; And as far as I can see, Kernel is the vehicle for that. So fire up your printers, print&lt;span&gt; out &lt;b&gt;&lt;a href="http://fexpr.blogspot.com/"&gt;John Shutt&lt;/a&gt;&lt;/b&gt;'s amazing works &lt;em&gt;&lt;a href="http://www.wpi.edu/Pubs/ETD/Available/etd-090110-124904/unrestricted/jshutt.pdf"&gt;&lt;b&gt;Fexprs as the basis of Lisp function application; or, &lt;tt&gt;$vau&lt;/tt&gt;: the ultimate abstraction&lt;/b&gt;&lt;/a&gt; &lt;/em&gt;and the&lt;em&gt; &lt;/em&gt;&lt;/span&gt;&lt;span&gt;&lt;em&gt;&lt;a href="ftp://ftp.cs.wpi.edu/pub/techreports/pdf/05-07.pdf"&gt;&lt;b&gt;Revised&lt;sup&gt; -1&lt;/sup&gt; Report on the Kernel Programming Language&lt;/b&gt;&lt;/a&gt;&lt;/em&gt;, bind them, study them, and start hacking on Lisp's future! It's easy (nah, OK, it's hard) and it starts with you!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-5685621978232609252?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/5685621978232609252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=5685621978232609252&amp;isPopup=true' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/5685621978232609252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/5685621978232609252'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/08/praising-kernel.html' title='Praising Kernel'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-6314306056782397038</id><published>2011-08-19T17:18:00.004+02:00</published><updated>2011-08-19T21:46:32.643+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virtua'/><title type='text'>Virtua subjotting</title><content type='html'>I'm keeping a quite detailed log of &lt;a href="http://manuel.github.com/virtua/"&gt;Virtua&lt;/a&gt; on the new Subjot service: &lt;a href="http://subjot.com/manuel/virtua"&gt;http://subjot.com/manuel/virtua&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(Subjot is an interesting new microblogging service, where every user has multiple streams, and you can choose which to follow. Here's an &lt;a href="http://sjot.it/nql85M"&gt;invite&lt;/a&gt;. I have no affiliation with Subjot.)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-6314306056782397038?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/6314306056782397038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=6314306056782397038&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/6314306056782397038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/6314306056782397038'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/08/virtua-subjotting.html' title='Virtua subjotting'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-5904126479924379397</id><published>2011-08-19T02:36:00.009+02:00</published><updated>2011-08-19T21:46:47.944+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virtua'/><title type='text'>The Virtua programming language</title><content type='html'>&lt;div&gt;&lt;a href="http://manuel.github.com/virtua/"&gt;Virtua&lt;/a&gt; will be my next programming language, with the following core features:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/COLA_(software_architecture)"&gt;combined object lambda architecture&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://axisofeval.blogspot.com/2011/08/notes-on-delimited-continuations.html"&gt;delimited continuations&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://web.cs.wpi.edu/~jshutt/kernel.html"&gt;fexprs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;plus, of course, all the good stuff we're used to from Lisp: sane syntax, numerical tower, ...&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Virtua will be written in JavaScript. The goal is to make Virtua a good command language for interactive, extensible, browser-based applications, like an Emacs for hypermedia.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you're interested to work with me on Virtua, do get in touch!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-5904126479924379397?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/5904126479924379397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=5904126479924379397&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/5904126479924379397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/5904126479924379397'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/08/virtua-programming-language.html' title='The Virtua programming language'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-2016653072662849308</id><published>2011-08-18T22:31:00.014+02:00</published><updated>2011-08-19T02:03:34.245+02:00</updated><title type='text'>Notes on delimited continuations</title><content type='html'>Delimited continuations are one of those topics where you need to spend months or maybe even years in the cloud of unknowing, until it suddenly makes click. At least, that's this autodidact's experience.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Delimited continuations are awesome, because they let us abstract over control flow - as I like to put it &lt;i&gt;&lt;b&gt;one man's control flow is another man's data&lt;/b&gt;&lt;/i&gt;, or as &lt;a href="http://www.cs.rutgers.edu/~ccshan/"&gt;Chung-chieh Shan&lt;/a&gt; puts it: delimited continuations &lt;i&gt;&lt;b&gt;liberate control flow&lt;/b&gt;&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Continuations as we know them (i.e. those created by call/cc) are undelimited, they represent the whole rest of the computation. Delimited continuations represent the rest of a &lt;i&gt;sub&lt;/i&gt;-computation up to a given &lt;i&gt;prompt&lt;/i&gt;. They come from investigating REPLs: when you capture an undelimited continuation, the continuation includes the REPL's control flow! Generally, you don't want that, so with delimited continuations, the REPL can install a prompt before executing code entered by the user, and then you can capture a delimited continuation just up to that prompt, excluding the REPL's code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My favorite description of delimited continuations is offered right at the start of &lt;b&gt;&lt;i&gt;&lt;a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.72.8645&amp;amp;rep=rep1&amp;amp;type=pdf"&gt;A Monadic Framework for Delimited Continuations&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;, even though the rest of the paper is quite over my head. Their API for delimited continuations is:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;newPrompt&lt;/b&gt; --- creates a fresh prompt, distinct from all other prompts. It's just an object that we use as an identifier, basically. Some systems simply use symbols for prompts.&lt;/li&gt;&lt;li&gt;&lt;b&gt;pushPrompt&lt;/b&gt; p e --- pushes prompt p on the stack, and executes expression e in this new context. This &lt;i&gt;delimits&lt;/i&gt; the stack, so we can later capture a delimited continuation up to this part of the stack.&lt;/li&gt;&lt;li&gt;&lt;b&gt;withSubCont&lt;/b&gt; p f --- aborts (unwinds the stack) up to and including the prompt p, and calls the function f with a single argument k representing the delimited continuation from the call to withSubCont up to but not including the prompt. This &lt;i&gt;captures&lt;/i&gt; a delimited continuation, analogous to how call/cc captures an undelimited continuation.&lt;/li&gt;&lt;li&gt;&lt;b&gt;pushSubCont&lt;/b&gt; k e --- pushes the delimited continuation k on the stack, and executes expression e in this new context. This &lt;i&gt;composes&lt;/i&gt; the stack of k with the current stack, analogous to how calling the function representing a continuation in Scheme swaps the current stack with the stack of that continuation.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Now to the example! Delimited continuation examples are always &lt;i&gt;&lt;b&gt;hair-raising&lt;/b&gt;&lt;/i&gt;!! Brace yourself!!!&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;img src="http://4.bp.blogspot.com/-i44JHL9g2BY/Tk19gDZoy0I/AAAAAAAAA1o/zjam6Js3Emk/s1600/Screenshot-5.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5642303897787222850" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;So, the first thing we do is call &lt;b&gt;newPrompt&lt;/b&gt; (at the bottom) to obtain a fresh prompt, and then we pipe that into the function (at the top), so that we have a name, p, for the prompt. Inside that function we have the addition of 2 to a second expression, that &lt;b&gt;pushPrompt&lt;/b&gt;'s p on the stack, i.e. delimits the stack at this point. The &lt;b&gt;if&lt;/b&gt; is called inside the new context delimited by p. Now it gets hairy: The if's test expression is a &lt;b&gt;withSubCont&lt;/b&gt;, so it immediately aborts up to the outer pushPrompt and then calls the function that is its second argument with k bound to the rest of the computation between the withSubCont and the pushPrompt. What's the rest of that computation?? Well, by the &lt;b&gt;&lt;i&gt;magic&lt;/i&gt;&lt;/b&gt; of delimited control, k is now equivalent to the function &lt;b&gt;λb. if b then 3 else 4&lt;/b&gt;. This is what I meant when I said that delimited continuations allow us to abstract over control flow - we have just turned an arbitrary, dynamic control flow sequence into a function. (Well, it's not really a function, but we can use it like one.) OK, so we have aborted back up to pushPrompt, and in k we have the rest of the computation as a function. What do we do with it? Well, we call it using &lt;b&gt;pushSubCont&lt;/b&gt; once with &lt;b&gt;False&lt;/b&gt; and once with &lt;b&gt;True&lt;/b&gt; as argument, and we add the two results, giving us 7. Note that we just called the delimited continuation &lt;i&gt;&lt;b&gt;twice&lt;/b&gt;&lt;/i&gt;! We can not only abstract over arbitrary control flows, we can also call them as many times as we like. Now the whole shebang inside pushPrompt is over, and we return to the addition of 2 to our result of 7, giving us 9.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Previously: &lt;a href="http://axisofeval.blogspot.com/2011/07/some-nice-paperz.html"&gt;&lt;b&gt;papers on delimited continuations&lt;/b&gt;&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-2016653072662849308?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/2016653072662849308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=2016653072662849308&amp;isPopup=true' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2016653072662849308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2016653072662849308'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/08/notes-on-delimited-continuations.html' title='Notes on delimited continuations'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-i44JHL9g2BY/Tk19gDZoy0I/AAAAAAAAA1o/zjam6Js3Emk/s72-c/Screenshot-5.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-6902300062328477918</id><published>2011-08-18T21:35:00.005+02:00</published><updated>2011-08-18T21:42:18.106+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>A little Scheme interpreter</title><content type='html'>I've rewritten the Scheme interpreter from Kent Dybvig's dissertation &lt;a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.66.786&amp;amp;rep=rep1&amp;amp;type=pdf"&gt;&lt;i&gt;&lt;b&gt;Three Implementation Models for Scheme&lt;/b&gt;&lt;/i&gt;&lt;/a&gt; in JavaScript: &lt;a href="https://github.com/manuel/schampignon"&gt;&lt;b&gt;Schampignon&lt;/b&gt;&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think this is really a nice way to learn about implementing tail-calls and first-class continuations.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Schampignon is undocumented, because it's really just a rewrite of the Scheme code in section 3.4 of the dissertation, which explains things nicely. (Still, it took me a couple of days to figure out how it works.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My next steps will be to add delimited continuations and fexprs to the code.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-6902300062328477918?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/6902300062328477918/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=6902300062328477918&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/6902300062328477918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/6902300062328477918'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/08/little-scheme-interpreter.html' title='A little Scheme interpreter'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-9100398997635043571</id><published>2011-08-18T14:47:00.002+02:00</published><updated>2011-08-18T14:54:32.628+02:00</updated><title type='text'>Going co-nuclear</title><content type='html'>I was discussing implementation inheritance on Twitter (no really!), when it dawned on me that my discussion partner was from a different "paradigm cult", and no agreement was possible.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;John Shutt describes it nicely in his post &lt;b&gt;&lt;i&gt;&lt;a href="http://fexpr.blogspot.com/2011/03/memetic-organisms.html"&gt;Memetic Organisms&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;i&gt;The meme set carried by the [memetic] organism includes a mass of theories, some of which contradict each other.  At the center of this mass is a nucleus of theories that are supposed to be believed (part of what Kuhn called a paradigm).  Surrounding the nucleus are theories that are meant to be contrasted with the paradigm and rejected, together with memes about how to conduct the contrast; one might call this surrounding material the co-nucleus.&lt;/i&gt;&lt;/blockquote&gt; &lt;/div&gt;For the Clojurian I was talking to, implementation inheritance is co-nuclear. There's probably no way for him to accept that it has valid uses.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-9100398997635043571?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/9100398997635043571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=9100398997635043571&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/9100398997635043571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/9100398997635043571'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/08/going-co-nuclear.html' title='Going co-nuclear'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-7111477245239495807</id><published>2011-08-07T16:48:00.008+02:00</published><updated>2011-08-07T18:26:54.289+02:00</updated><title type='text'>Intellectual badass Sunday reading</title><content type='html'>&lt;blockquote&gt;"&lt;i&gt;Nerd&lt;/i&gt;? We prefer the term &lt;i&gt;intellectual badass&lt;/i&gt;." – Unknown&lt;/blockquote&gt;&lt;a href="http://developer.amd.com/afds/pages/keynote.aspx"&gt;&lt;b&gt;AMD Fusion Developer Summit Keynotes&lt;/b&gt;&lt;/a&gt;, about AMD's upcoming &lt;a href="http://vr-zone.com/articles/next-generation-gpus-amd-s-cray-on-a-chip-/13163.html"&gt;"Cray on a Chip"&lt;/a&gt;. Basically, they'll make the parallel processors (formerly known as GPUs) coherent with the brawny sequential CPUs, allowing you to &lt;b&gt;&lt;i&gt;"switch the compute" between sequential and parallel&lt;/i&gt;&lt;/b&gt;, while operating on the same data (e.g. fill an array sequentially, then switch to parallel processing to crunch the data, all in the same program - and memory space).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lists.racket-lang.org/users/archive/2010-July/040398.html"&gt;&lt;b&gt;[racket] design and use of continuation barriers&lt;/b&gt;&lt;/a&gt;, by Matthew Flatt. &lt;i&gt;"Use a continuation barrier when calling unknown code and when it's too painful to contemplate multiple instantiations of the continuation leading to the call."&lt;/i&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://lambda-the-ultimate.org/node/4321#comment-66419"&gt;&lt;b&gt;Monads and Effects is a bad marriage&lt;/b&gt;&lt;/a&gt;, by David Barbour (who is probably really a front for an army of intellectual badasses). &lt;i&gt;"Monads capture a lot of effects by default: ordering/time, identity, state, commitment, and unbounded time/space resource consumption."&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.bayfronttechnologies.com/mc_tutorial.html"&gt;Tutorial: Metacompilers Part 1&lt;/a&gt;&lt;/b&gt;, about META II, the one Alan Kay and the other VPRI folks always talk about.&lt;i&gt; "You won't really find metacompilers like META II in compiler textbooks as they are primarily concerned with slaying the dragons of the 1960s using 1970s formal theory."&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.awpi.com/Combs/Humor/microill.html"&gt;&lt;b&gt;Microsoft and the Bavarian Illuminati&lt;/b&gt;&lt;/a&gt;: "&lt;i&gt;In the Object Linking and Embedding 2.0 Programmer's Reference there is a very curious term. On page 78, the second paragraph starts with the sentence, 'In the aggregation model, this internal communication is achieved through coordination with a special instance of IUnknown interface known as the /controlling unknown/ of the aggregate.'"&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-7111477245239495807?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/7111477245239495807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=7111477245239495807&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/7111477245239495807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/7111477245239495807'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/08/intellectual-badass-sunday-reading.html' title='Intellectual badass Sunday reading'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-7655203616617220410</id><published>2011-08-06T18:32:00.003+02:00</published><updated>2011-08-06T18:34:18.061+02:00</updated><title type='text'>Linux kernel word cloud</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/-3L79bALtJHs/Tj1syakVEmI/AAAAAAAAA1g/LCor6jlUbUs/s1600/linux-word-cloud.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 220px;" src="http://2.bp.blogspot.com/-3L79bALtJHs/Tj1syakVEmI/AAAAAAAAA1g/LCor6jlUbUs/s400/linux-word-cloud.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5637781921918685794" /&gt;&lt;/a&gt;&lt;br /&gt;(click to enlarge; via @&lt;a href="https://twitter.com/#!/hexmanshu"&gt;hexmanshu&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-7655203616617220410?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/7655203616617220410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=7655203616617220410&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/7655203616617220410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/7655203616617220410'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/08/linux-kernel-word-cloud.html' title='Linux kernel word cloud'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-3L79bALtJHs/Tj1syakVEmI/AAAAAAAAA1g/LCor6jlUbUs/s72-c/linux-word-cloud.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-5502536440763929239</id><published>2011-07-31T23:09:00.010+02:00</published><updated>2011-08-01T20:47:03.933+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><title type='text'>The meaning of forms in Lisp and Kernel</title><content type='html'>&lt;span class="Apple-style-span"&gt;There are so many nice things to be learned from Lisp - and &lt;a href="http://web.cs.wpi.edu/~jshutt/kernel.html"&gt;Kernel&lt;/a&gt;.&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Take this:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;A Lisp REPL &lt;a href="http://www.lispworks.com/documentation/lw50/CLHS/Body/26_glo_l.htm#lisp_reader"&gt;reads&lt;/a&gt; &lt;a href="http://www.lispworks.com/documentation/lw50/CLHS/Body/26_glo_f.htm#form"&gt;forms&lt;/a&gt; input by the user.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;But Lisp is never content with a form alone: it always wants to &lt;i&gt;evaluate&lt;/i&gt; the form, &lt;i&gt;determine its&lt;/i&gt; &lt;i&gt;meaning&lt;/i&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;For instance, when you input a symbol form, Lisp will &lt;i&gt;not&lt;/i&gt; just return the symbol object - it will return the value of the variable binding referenced by the symbol - which is the symbol's meaning, per Lisp's rules of &lt;a href="http://www.lispworks.com/documentation/lw51/CLHS/Body/03_aba.htm"&gt;form evaluation&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;No wonder then that one of the central features of Lisp is &lt;a href="http://clhs.lisp.se/Body/s_quote.htm"&gt;quotation&lt;/a&gt; - telling Lisp &lt;i&gt;not&lt;/i&gt; to determine the meaning of a form presented to it, but rather give us the &lt;i&gt;form itself&lt;/i&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;So what's a form? A &lt;a href="http://www.lispworks.com/documentation/lw50/CLHS/Body/26_glo_f.htm#form"&gt;form is&lt;/a&gt; "&lt;span class="Apple-style-span"&gt;any object meant to be evaluated", in other words, we may treat &lt;i&gt;any&lt;/i&gt; object as a form, as something to evaluate, as something to determine the meaning of.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;Lisp's evaluation &lt;/span&gt;&lt;span class="Apple-style-span"&gt;rules &lt;/span&gt;&lt;span class="Apple-style-span"&gt;do not prescribe in any way that forms are bound to text-based representations - a form is any first-class object&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;i&gt; meant to be evaluated&lt;/i&gt;. &lt;/span&gt;&lt;span class="Apple-style-span"&gt;(And in fact, Racket, a leading Lisp implementation already supports images as forms.)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;So Lisp is chiefly concerned with determining the meaning of forms read from the user.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Macros then allow us to extend the variety of forms recognized by a Lisp, beyond the ways that mere function calls can.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Where in a function call the meaning of every operand is established automatically &lt;i&gt;before&lt;/i&gt; the function is actually called, macros have total freedom in evaluating - determining the meaning of - operands, or not evaluating them at all (as a short-circuiting AND operator may do, for example).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;But Common Lisp and Scheme macros, by their preprocessing nature (a macro call works at a time conceptually different from runtime, translating source expressions to other expressions, to be evaluated at a later time), cannot be used in a first-class fashion. For example, it is not possible to &lt;a href="http://www.lispworks.com/documentation/HyperSpec/Body/f_apply.htm"&gt;apply&lt;/a&gt; the AND macro to a list of dynamically computed values (without resorting to EVAL), like we could with a function.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;In a sense, macros of the preprocessing kind restrict our ability of determining the meaning of forms: With preprocessing macros, we may only determine the meaning of forms &lt;i&gt;available at preprocessing time&lt;/i&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;This where Kernel's &lt;i&gt;fexprs&lt;/i&gt; come in. Fexprs drop the requirement of macros to be expandable in a separate preprocessing step. Thus, we may apply the AND fexpr to a list of dynamically computed operands, for example.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;But fexprs go beyond being merely a more convenient replacement for macros. As John Shutt shows, a new lexically-scoped formulation of fexprs - as presented in Kernel - is even &lt;i&gt;more fundamental to Lisp than lambda&lt;/i&gt;. In Kernel, &lt;a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.13.3231"&gt;lambda is defined in terms of &lt;i&gt;vau&lt;/i&gt;&lt;/a&gt;, the ultimate abstraction:&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;&lt;span class="Apple-style-span"&gt;($define! $lambda&lt;br /&gt;  ($vau (formals . body) env&lt;br /&gt;     (wrap (eval (list* $vau formals #ignore body)&lt;br /&gt;                 env))))&lt;/span&gt;&lt;/pre&gt;&lt;span class="Apple-style-span"&gt;Through the power of fexprs, Kernel needs only three built-in operators (define, vau, and if) as well as some built-in functions. This is vastly simpler than any definition of Scheme! Scheme built-ins such as lambda, set! (!), define-syntax and others fall directly out of fexprs, for free, radically simplifying the implementation. But I'm rambling.&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;In essence, &lt;i&gt;fexprs liberate Lisp's ability to determine the meaning of forms&lt;/i&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;It's getting midnight (on a Sunday!), so I can't do fexprs or my excitement about them justice. But I hope this post has made you think about forms and their meanings, and to check out Kernel and share the excitement about the brave new Lisp world of fexprs.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-5502536440763929239?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/5502536440763929239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=5502536440763929239&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/5502536440763929239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/5502536440763929239'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/07/meaning-of-forms.html' title='The meaning of forms in Lisp and Kernel'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-9039747916457777945</id><published>2011-07-31T17:53:00.003+02:00</published><updated>2011-07-31T18:06:38.141+02:00</updated><title type='text'>The War Between Developers, Designers, &amp; Project Managers</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/-YXZRN1MEciw/TjV6-uMH8JI/AAAAAAAAA1I/GI7aWr2hqE0/s1600/developers.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 302px;" src="http://1.bp.blogspot.com/-YXZRN1MEciw/TjV6-uMH8JI/AAAAAAAAA1I/GI7aWr2hqE0/s400/developers.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5635545726693404818" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(&lt;a href="https://twitter.com/#!/georgeb3dr/status/97343460188762112"&gt;via&lt;/a&gt; @&lt;a href="https://twitter.com/#!/zachlendon"&gt;zachlendon&lt;/a&gt;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Previously:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-ifWgxjsIA88/TjV9cR3RuCI/AAAAAAAAA1Y/MDwNilJO_nY/s1600/lisp-programmers.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://2.bp.blogspot.com/-ifWgxjsIA88/TjV9cR3RuCI/AAAAAAAAA1Y/MDwNilJO_nY/s400/lisp-programmers.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5635548433509103650" style="cursor: pointer; width: 370px; height: 400px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/-jr-dGeAJV3Q/TjV76R0U97I/AAAAAAAAA1Q/YpwLybViFYo/s1600/ruby.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://1.bp.blogspot.com/-jr-dGeAJV3Q/TjV76R0U97I/AAAAAAAAA1Q/YpwLybViFYo/s400/ruby.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5635546749869553586" style="cursor: pointer; width: 400px; height: 263px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-9039747916457777945?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/9039747916457777945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=9039747916457777945&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/9039747916457777945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/9039747916457777945'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/07/war-between-developers-designers.html' title='The War Between Developers, Designers, &amp; Project Managers'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-YXZRN1MEciw/TjV6-uMH8JI/AAAAAAAAA1I/GI7aWr2hqE0/s72-c/developers.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-8265747020018503186</id><published>2011-07-31T14:22:00.003+02:00</published><updated>2011-07-31T14:31:42.976+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='oop'/><title type='text'>Some history</title><content type='html'>Reading the interesting &lt;a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.73.23&amp;amp;rep=rep1&amp;amp;type=pdf"&gt;&lt;i&gt;Portable and high-level access to the stack with Continuation Marks&lt;/i&gt;&lt;/a&gt;, I found the following quote about procedure calls (my emphasis):&lt;div&gt;&lt;div&gt;&lt;i&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;This [not properly tail-calling] behavior of the SECD machine, and more broadly of many compilers and evaluators, is principally a consequence of the early evolution of computers and computer languages; &lt;b&gt;procedure calls, and particularly recursive procedure calls, were added to many computer languages long after constructs like branches, jumps, and assignment. They were thought to be expensive, inefficient, and esoteric.&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Guy Steele outlined this history and disrupted the canard of expensive procedure calls, showing how inefficient procedure call mechanisms could be replaced with simple “JUMP” instructions, making the space complexity of recursive procedures equivalent to that of any other looping construct.&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;Then it gets &lt;i&gt;highly&lt;/i&gt; ironic, with a quote by Alan Kay: &lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;Though OOP came from many motivations, two were central. ... [T]he small scale one was to find a more flexible version of assignment, and then to try to eliminate it altogether.&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-8265747020018503186?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/8265747020018503186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=8265747020018503186&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/8265747020018503186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/8265747020018503186'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/07/some-history.html' title='Some history'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-3019594109532725981</id><published>2011-07-30T19:44:00.009+02:00</published><updated>2012-01-13T19:08:17.666+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><category scheme='http://www.blogger.com/atom/ns#' term='continuations'/><title type='text'>Some nice paperz on delimited continuations and first-class macros</title><content type='html'>My current obsessions are delimited continuations (see &lt;a href="http://axisofeval.blogspot.com/2011/08/notes-on-delimited-continuations.html"&gt;&lt;b&gt;my intro post&lt;/b&gt;&lt;/a&gt;) and first-class macros (fexprs). Here are some nice papers related to these topics:&lt;div&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;&lt;a href="http://www.cs.indiana.edu/~dyb/pubs/3imp.pdf"&gt; Three Implementation Models for Scheme&lt;/a&gt;&lt;/b&gt;&lt;/i&gt; is the dissertation of Kent Dybvig (of Chez Scheme fame). It contains a very nice abstract machine for (learning about) implementing a Scheme with first-class continuations. I'm currently trying to grok and implement this model, and then extend it to delimited continuations.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.72.8645&amp;amp;rep=rep1&amp;amp;type=pdf"&gt;&lt;b&gt;&lt;i&gt;A Monadic Framework for Delimited Continuations&lt;/i&gt;&lt;/b&gt;&lt;/a&gt; contains probably the most succinct description of delimited continuations (on page 3), along with a typically hair-raising example of their use.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;&lt;a href="http://www.cs.utah.edu/plt/publications/icfp07-fyff.pdf"&gt;Adding Delimited and Composable Control to a Production Programming Environment&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;. One of the authors is Matthew Flatt, so you know what to expect - a tour de force. The paper is about how Racket implements delimited control and integrates it with all the other features of Racket (dynamic-wind, exceptions, ...). Apropos, compared to Racket, Common Lisp is a lightweight language.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;i&gt;&lt;a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.63.1754&amp;amp;rep=rep1&amp;amp;type=pdf"&gt;Subcontinuations&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;. This is an early paper on delimited continuations. It also describes &lt;i&gt;control filters&lt;/i&gt;, a low level facility on top of which dynamic-wind can be implemented. Control filters are also mentioned - in passing - as a nice tool in the Racket paper (above).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://www.wpi.edu/Pubs/ETD/Available/etd-090110-124904/unrestricted/jshutt.pdf"&gt;&lt;b&gt;&lt;i&gt;Fexprs as the basis of Lisp function application or $vau: the ultimate abstraction&lt;/i&gt;&lt;/b&gt;&lt;/a&gt; and the &lt;i&gt;&lt;b&gt;&lt;a href="ftp://ftp.cs.wpi.edu/pub/techreports/pdf/05-07.pdf"&gt;Revised&lt;sup&gt;-1&lt;/sup&gt; Report on the Kernel Programming Language&lt;/a&gt;&lt;/b&gt;&lt;/i&gt;. These two are probably the two papers I would take to the desert island at the moment. I'm only a long-time apprentice of programming languages, but I know genius when I see it.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you know of any related nice papers, let me know!&lt;/div&gt;&lt;hr /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On Twitter, &lt;a href="https://twitter.com/#!/psnively"&gt;Paul Snively&lt;/a&gt; mentioned Oleg's paper &lt;b&gt;&lt;i&gt;&lt;a href="http://okmij.org/ftp/continuations/caml-shift.pdf"&gt;Delimited Control in OCaml, Abstractly and Concretely&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;, but probably only because he's mentioned in the Acknowlegdements - kidding! It's a great paper, and I'm studying it too, but unfortunately it's not really applicable to implementing delimited control in JavaScript, which is what I'm trying to do.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-3019594109532725981?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/3019594109532725981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=3019594109532725981&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3019594109532725981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3019594109532725981'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/07/some-nice-paperz.html' title='Some nice paperz on delimited continuations and first-class macros'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-8089455533928889159</id><published>2011-07-28T18:36:00.007+02:00</published><updated>2011-07-28T22:27:41.176+02:00</updated><title type='text'>Everything you always wanted to know about JavaScript...</title><content type='html'>&lt;i&gt;&lt;b&gt;...&lt;a href="http://lambda-the-ultimate.org/node/4308"&gt;but were afraid to ask Brendan Eich&lt;/a&gt;.&lt;/b&gt;&lt;/i&gt; (the whole thread, starting with &lt;a href="http://lambda-the-ultimate.org/node/4308#comment-66267"&gt;this post&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-8089455533928889159?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/8089455533928889159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=8089455533928889159&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/8089455533928889159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/8089455533928889159'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/07/everything-you-always-wanted-to-know.html' title='Everything you always wanted to know about JavaScript...'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-2926847702274136971</id><published>2011-07-21T20:34:00.020+02:00</published><updated>2011-07-28T20:57:57.259+02:00</updated><title type='text'>On the absence of EVAL in ClojureScript</title><content type='html'>&lt;div&gt;[I got bored with the original text of this post. In short: the authors of ClojureScript have taken the pragmatic approach of reusing Clojure-on-the-JVM to generate JavaScript. This means there can be no EVAL in ClojureScript. I think that's sad because Lisp is one of the finest application extension languages, and without EVAL you can't do a really extensible app. Apparently, the ClojureScript authors view the browser-side as something of an adjunct to server apps. In my view, all the action of the future will be in the browser, and not on the server.]&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-2926847702274136971?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/2926847702274136971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=2926847702274136971&amp;isPopup=true' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2926847702274136971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2926847702274136971'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/07/on-absence-of-eval-in-clojurescript.html' title='On the absence of EVAL in ClojureScript'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-5144707172636032683</id><published>2011-07-14T22:29:00.005+02:00</published><updated>2011-07-14T22:45:13.474+02:00</updated><title type='text'>Frankenprogramming</title><content type='html'>&lt;span class="Apple-style-span"&gt;&lt;a href="http://lambda-the-ultimate.org/node/4312#comment-66167"&gt;&lt;b&gt;David Barbour throws down the gauntlet&lt;/b&gt;&lt;/a&gt; to John Shutt in an already interesting and entertaining (&lt;a href="http://lambda-the-ultimate.org/node/4312#comment-66159"&gt;&lt;i&gt;"about as coherent as a 90 day weather forecast"&lt;/i&gt;&lt;/a&gt;) LtU thread:&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;John Shutt would like to break the chains of semantics, e.g. using fexprs to reach under-the-hood to wrangle and mutate the vital organs of a previously meaningful subprogram. Such a technique is workable, but I believe it leads to monolithic, tightly coupled applications that are not harmonious with nature. I have just now found a portmanteau that properly conveys my opinion of the subject: &lt;b&gt;frankenprogramming&lt;/b&gt;.&lt;/i&gt;&lt;/blockquote&gt;I'm looking forward to John's reply. In the meantime, I have to say that I like to view this in a more relaxed way. As Ehud Lamm &lt;a href="http://lambda-the-ultimate.org/classic/message7190.html#7206"&gt;said&lt;/a&gt;:&lt;div&gt;&lt;blockquote&gt;&lt;i&gt;Strict abstraction boundaries are too limiting in practice. The good news is that one man's abstraction breaking is another's language feature.&lt;/i&gt;&lt;/blockquote&gt;&lt;/div&gt;Previously, regarding fexprs: &lt;a href="http://axisofeval.blogspot.com/2011/06/john-shutts-blog.html"&gt;John Shutt's blog&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-5144707172636032683?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/5144707172636032683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=5144707172636032683&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/5144707172636032683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/5144707172636032683'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/07/frankenprogramming.html' title='Frankenprogramming'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-801347914776431804</id><published>2011-07-10T16:49:00.002+02:00</published><updated>2011-07-18T16:58:41.129+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='laws'/><title type='text'>Atwood's Law</title><content type='html'>&lt;blockquote&gt;Any application that &lt;i&gt;can&lt;/i&gt; be written in JavaScript, &lt;i&gt;will&lt;/i&gt; eventually be written in JavaScript.&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;(&lt;a href="http://www.codinghorror.com/blog/2007/07/the-principle-of-least-power.html"&gt;source&lt;/a&gt;; also: &lt;a href="http://axisofeval.blogspot.com/2011/03/dukes-law.html"&gt;Duke's Law&lt;/a&gt;)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-801347914776431804?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/801347914776431804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=801347914776431804&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/801347914776431804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/801347914776431804'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/07/atwoods-law.html' title='Atwood&apos;s Law'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-3536680708202440414</id><published>2011-07-08T16:04:00.007+02:00</published><updated>2011-07-08T16:14:13.982+02:00</updated><title type='text'>it is nice to have the power of all that useful but obsolete software out there</title><content type='html'>&lt;div style="font-family:mono; font-size:smaller"&gt;Subject: Re: Switching tasks and context&lt;br /&gt;∂08-Jul-81  0232 Nowicki at PARC-MAXC  Re: Switching tasks and context&lt;br /&gt;Date: 6 Jul &lt;b&gt;1981&lt;/b&gt; 10:32 PDT&lt;br /&gt;From: Nowicki at PARC-MAXC&lt;br /&gt;In-reply-to: JWALKER's message of Wednesday, 1 July 1981  11:52-EDT&lt;br /&gt;To: JWALKER at BBNA&lt;br /&gt;cc: WorkS at AI&lt;/div&gt;&lt;span style="font-family:mono"&gt;&lt;div&gt;&lt;span style="font-family:mono"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;[...]&lt;/span&gt;&lt;div&gt;&lt;span style="font-family:mono"&gt;The important thing is that such a tool WORKS, and I find incredibly useful. The virtual terminal uses ANSI standard escape sequences, so we can use all the tools that have been around for a long time (like the SAIL Display Service, Emacs under TOPS-20 or Unix, etc.) with NO modifications.  We are planning to use this to develop a more integrated system, but &lt;b&gt;it is nice to have the power of all that useful but obsolete software out there&lt;/b&gt;.&lt;br /&gt;&lt;/span&gt;&lt;hr /&gt;(via &lt;a href="http://chneukirchen.org:5597/trivium/"&gt;Chris&lt;/a&gt;, who's &lt;a href="http://www.saildart.org/1982/10/17/WORKS.MSG[UP,DOC]"&gt;scouring Unix history&lt;/a&gt; for us)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-3536680708202440414?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/3536680708202440414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=3536680708202440414&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3536680708202440414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3536680708202440414'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/07/it-is-nice-to-have-power-of-all-that.html' title='it is nice to have the power of all that useful but obsolete software out there'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-1692877717141048855</id><published>2011-06-29T19:30:00.001+02:00</published><updated>2011-06-30T00:18:15.210+02:00</updated><title type='text'>PL nerds: learn cryptography instead</title><content type='html'>I've never studied cryptography. So when the paper &lt;a href="http://tahoe-lafs.org/~zooko/lafs.pdf"&gt;&lt;b&gt;&lt;i&gt;Tahoe – The Least-Authority Filesystem&lt;/i&gt;&lt;/b&gt;&lt;/a&gt; fell in my lap, I was perplexed.&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Using just two primitives, &lt;a href="http://en.wikipedia.org/wiki/Symmetric-key_algorithm"&gt;secret-key&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Public-key_cryptography"&gt;public-key&lt;/a&gt; cryptography, they build &lt;a href="http://tahoe-lafs.org/trac/tahoe-lafs"&gt;an amazing solution&lt;/a&gt; to information storage. (Try to understand the two main diagrams in the paper. It's not hard, and it's &lt;i&gt;amazing&lt;/i&gt;.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Before encountering Tahoe-LAFS, cryptography was just a way to keep stuff secret to me. But cryptography also provides us with tools to &lt;b&gt;&lt;i&gt;design programs that wouldn't be possible otherwise&lt;/i&gt;&lt;/b&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-1692877717141048855?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/1692877717141048855/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=1692877717141048855&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/1692877717141048855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/1692877717141048855'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/06/pl-nerds-learn-cryptography-instead.html' title='PL nerds: learn cryptography instead'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-2652659511548814122</id><published>2011-06-27T18:35:00.003+02:00</published><updated>2011-06-28T15:28:13.576+02:00</updated><title type='text'>State of Code interview</title><content type='html'>Zef Hemel has interviewed me for his weblog, &lt;a href="http://www.stateofcode.com/"&gt;&lt;i&gt;State of Code&lt;/i&gt;&lt;/a&gt;: &lt;a href="http://www.stateofcode.com/2011/06/lisp-the-programmable-programming-language-with-manuel-simoni/"&gt;&lt;i&gt;&lt;b&gt;Lisp: The Programmable Programming Language&lt;/b&gt;&lt;/i&gt;&lt;/a&gt;.  I don't feel qualified to be the "Lisp guy", but as you know, I never leave out an opportunity to blather about PLs.&lt;div&gt;&lt;br /&gt;Zef (@&lt;a href="https://twitter.com/#!/zef"&gt;zef&lt;/a&gt;) is an academic developing &lt;a href="http://www.mobl-lang.org/"&gt;&lt;b&gt;&lt;i&gt;mobl&lt;/i&gt;&lt;/b&gt;&lt;/a&gt;, a language for mobile apps, and is now working for a web-based IDE company, so the &lt;i&gt;State of Code&lt;/i&gt; is a place to watch.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-2652659511548814122?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/2652659511548814122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=2652659511548814122&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2652659511548814122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2652659511548814122'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/06/state-of-code-interview.html' title='State of Code interview'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-647072992486871774</id><published>2011-06-22T07:26:00.006+02:00</published><updated>2011-08-20T17:11:41.011+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><title type='text'>John Shutt's blog</title><content type='html'>John Shutt now has a blog: &lt;b&gt;&lt;i&gt;&lt;a href="http://fexpr.blogspot.com/"&gt;Structural insight&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;John is pushing the envelope of Lisp with his &lt;a href="http://web.cs.wpi.edu/~jshutt/kernel.html"&gt;&lt;i&gt;&lt;b&gt;Kernel&lt;/b&gt;&lt;/i&gt;&lt;/a&gt; programming language, a &lt;i&gt;"dialect of Lisp in which everything is a first-class object"&lt;/i&gt;. And when he says &lt;i&gt;everything&lt;/i&gt;, he means it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Not content with just first-class functions and continuations, John also wants &lt;i&gt;first-class environments&lt;/i&gt; and &lt;i&gt;first-class macros&lt;/i&gt;. Some fun LtU discussions in which John participated come to mind:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;&lt;a href="http://lambda-the-ultimate.org/node/4093"&gt;Fexprs as the basis of Lisp function application; or, $vau: the ultimate abstraction&lt;/a&gt;&lt;/i&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;a href="http://lambda-the-ultimate.org/node/3640"&gt;Lisps, First-Class Special Forms, Fexprs, The Kernel Programming Language&lt;/a&gt;&lt;/i&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;a href="http://lambda-the-ultimate.org/node/3861"&gt;First-class environments. Discuss. ;)&lt;/a&gt;&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-647072992486871774?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/647072992486871774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=647072992486871774&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/647072992486871774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/647072992486871774'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/06/john-shutts-blog.html' title='John Shutt&apos;s blog'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-7978309836347185257</id><published>2011-06-16T23:04:00.003+02:00</published><updated>2011-06-17T01:09:39.048+02:00</updated><title type='text'>David Barbour's soft realtime model</title><content type='html'>David Barbour is to me one of the most important thinkers on distributed programming languages and systems.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;He frequently posts &lt;a href="http://lambda-the-ultimate.org/user/6002/track"&gt;on LtU&lt;/a&gt; and &lt;a href="http://c2.com/cgi/wiki?ReactiveDemandProgramming"&gt;on Ward's wiki&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(And he now has a &lt;a href="http://awelonblue.wordpress.com/"&gt;blog&lt;/a&gt;!)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In &lt;a href="http://lambda-the-ultimate.org/node/4289#comment-65886"&gt;this LtU post&lt;/a&gt; he describes a very interesting soft realtime programming model, reminiscent of &lt;a href="http://www.delicious.com/manuel/croquet"&gt;Croquet&lt;/a&gt;/TeaTime:&lt;/div&gt;&lt;hr /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'trebuchet ms', tahoma, verdana, arial, helvetica; border-collapse: collapse; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "&gt;&lt;i&gt;&lt;blockquote&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "&gt;I'm also using &lt;a href="http://www.erights.org/elib/concurrency/vat.html"&gt;vat semantics&lt;/a&gt; inspired from E for my &lt;a href="http://c2.com/cgi/wiki?ReactiveDemandProgramming"&gt;Reactive Demand Programming&lt;/a&gt; model, with great success.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "&gt;I'm using a temporal vat model, which has a lot of nice properties. In my model:&lt;/p&gt;&lt;ul style="list-style-type: disc; "&gt;&lt;li style="padding-bottom: 0.3em; "&gt;Each vat has a logical time (&lt;code style="font-size: 1em; "&gt;getTime&lt;/code&gt;).&lt;/li&gt;&lt;li style="padding-bottom: 0.3em; "&gt;Vats may schedule events for future times (&lt;code style="font-size: 1em; "&gt;atTime, atTPlus&lt;/code&gt;).&lt;/li&gt;&lt;li style="padding-bottom: 0.3em; "&gt;Multiple events can be scheduled within an instant (&lt;code style="font-size: 1em; "&gt;eventually&lt;/code&gt;).&lt;/li&gt;&lt;li style="padding-bottom: 0.3em; "&gt;Vats are loosely synchronized. Each vat sets a 'maximum drift' from the lead vat.&lt;/li&gt;&lt;li style="padding-bottom: 0.3em; "&gt;No vat advances past a shared clock time (typically, wall-clock). This allows for soft real-time programming.&lt;/li&gt;&lt;/ul&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "&gt;This model is designed for scalable, soft real-time programming. The constraints on vat progress give me an implicit real-time scheduler (albeit, without hard guarantees), while allowing a little drift between threads (e.g. 10 milliseconds) can achieve me an acceptable level of parallelism on a multi-core machine.&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "&gt;Further, timing between vats can be deterministic if we introduce explicit delays based on the maximum drift (i.e. send a message of the form '&lt;code style="font-size: 1em; "&gt;doSomething `atTime` T&lt;/code&gt;' where T is the sum of getTime and getMaxDrift.&lt;/p&gt;&lt;/blockquote&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "&gt;&lt;/p&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;hr /&gt;Previously: &lt;a href="http://axisofeval.blogspot.com/2010/11/why-are-objects-so-unintuitive.html"&gt;&lt;i&gt;Why are objects so unintuitive&lt;/i&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-7978309836347185257?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/7978309836347185257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=7978309836347185257&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/7978309836347185257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/7978309836347185257'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/06/david-barbours-soft-realtime-model.html' title='David Barbour&apos;s soft realtime model'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-1038003180460210597</id><published>2011-06-12T18:13:00.004+02:00</published><updated>2011-06-12T22:38:08.854+02:00</updated><title type='text'>Everything in JavaScript, JavaScript in Everything</title><content type='html'>We can now run &lt;a href="http://bellard.org/jslinux/"&gt;Linux&lt;/a&gt;, &lt;a href="https://github.com/kripken/emscripten"&gt;LLVM bitcode&lt;/a&gt;, and &lt;a href="https://github.com/jashkenas/coffee-script/wiki/List-of-languages-that-compile-to-JS"&gt;a lot of other languages&lt;/a&gt; in JavaScript.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And we can run JavaScript in everything - browsers, servers, toasters, &lt;a href="http://marijnhaverbeke.nl/cl-javascript/"&gt;Lisp&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Like IP in networking, JavaScript is becoming the &lt;b&gt;&lt;i&gt;waist in the hourglass&lt;/i&gt;&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I don't know what it means yet, but it sure is exciting.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-1038003180460210597?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/1038003180460210597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=1038003180460210597&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/1038003180460210597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/1038003180460210597'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/06/everything-in-javascript-javascript-in.html' title='Everything in JavaScript, JavaScript in Everything'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-314317644333115981</id><published>2011-06-10T13:16:00.002+02:00</published><updated>2011-06-10T13:19:25.307+02:00</updated><title type='text'>No No No No</title><content type='html'>// Note: The following is all standard-conforming C++, this is not a hypothetical language extension.&lt;br /&gt;&lt;pre&gt; assert( top( o-------o&lt;br /&gt;              |L       \&lt;br /&gt;              | L       \&lt;br /&gt;              |  o-------o&lt;br /&gt;              |  !       !&lt;br /&gt;              !  !       !&lt;br /&gt;              o  |       !&lt;br /&gt;               L |       !&lt;br /&gt;                L|       !&lt;br /&gt;                 o-------o ) == ( o-------o&lt;br /&gt;                                  |       !&lt;br /&gt;                                  !       !&lt;br /&gt;                                  o-------o ) );&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://weegen.home.xs4all.nl/eelis/analogliterals.xhtml"&gt;Multi-Dimensional Analog Literals&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-314317644333115981?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/314317644333115981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=314317644333115981&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/314317644333115981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/314317644333115981'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/06/no-no-no-no.html' title='No No No No'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-4175697133979327178</id><published>2011-06-07T17:37:00.003+02:00</published><updated>2011-06-07T17:40:25.267+02:00</updated><title type='text'>WADLER'S LAW OF LANGUAGE DESIGN</title><content type='html'>&lt;pre&gt;In any language design, the total time spent discussing&lt;br /&gt;a feature in this list is proportional to two raised to&lt;br /&gt;the power of its position.&lt;br /&gt;&lt;br /&gt;    0. Semantics&lt;br /&gt;    1. Syntax&lt;br /&gt;    2. Lexical syntax&lt;br /&gt;    3. Lexical syntax of comments&lt;br /&gt;&lt;br /&gt;(That is, twice as much time is spent discussing syntax&lt;br /&gt;than semantics, twice as much time is spent discussing&lt;br /&gt;lexical syntax than syntax, and twice as much time is&lt;br /&gt;spent discussing syntax of comments than lexical syntax.)&lt;br /&gt;&lt;/pre&gt;(&lt;a href="http://www.informatik.uni-kiel.de/~curry,/listarchive/0017.html"&gt;source&lt;/a&gt;, via &lt;a href="https://twitter.com/debasishg"&gt;Debasish Ghosh&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-4175697133979327178?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/4175697133979327178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=4175697133979327178&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/4175697133979327178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/4175697133979327178'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/06/wadlers-law-of-language-design.html' title='WADLER&apos;S LAW OF LANGUAGE DESIGN'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-1316337685986568727</id><published>2011-05-28T17:56:00.005+02:00</published><updated>2011-05-28T18:07:58.255+02:00</updated><title type='text'>Extreme software</title><content type='html'>Some programs are very successful with taking a paradigm to an extreme.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Emacs tries to represent every user interface as text. Even &lt;a href="http://1010.co.uk/gneve.html"&gt;video editing&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Plan 9 tries to use filesystem trees as APIs for all applications and OS services.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's interesting to abstract insights gained from extreme programs, and modify them.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We can ask: if Emacs is successful using plain text as user interface, what if we use hypertext?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Or: if Plan 9 is successful in using filesystem trees as APIs, what if we use &lt;a href="http://activitystrea.ms/"&gt;activity streams&lt;/a&gt;?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-1316337685986568727?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/1316337685986568727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=1316337685986568727&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/1316337685986568727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/1316337685986568727'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/05/extreme-software.html' title='Extreme software'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-4863665047942857485</id><published>2011-05-28T17:15:00.000+02:00</published><updated>2011-05-28T17:16:08.978+02:00</updated><title type='text'>Ouch</title><content type='html'>&lt;b&gt;&lt;i&gt;&lt;blockquote&gt;Few companies that installed computers to reduce the employment of clerks have realized their expectations.... They now need more, and more expensive clerks even though they call them "operators" or "programmers."&lt;/blockquote&gt;&lt;/i&gt;&lt;/b&gt; — Peter F. Drucker&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-4863665047942857485?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/4863665047942857485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=4863665047942857485&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/4863665047942857485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/4863665047942857485'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/05/ouch.html' title='Ouch'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-3991019382491877914</id><published>2011-05-18T14:12:00.008+02:00</published><updated>2011-05-18T15:12:32.440+02:00</updated><title type='text'>TermKit</title><content type='html'>I happen to think that pushing beyond plain text is one of the most important tasks for programmers today, or as Conor McBride &lt;a href="https://twitter.com/#!/pigworker/status/67718720163819520"&gt;put it&lt;/a&gt;:&lt;div&gt;&lt;i&gt;&lt;/i&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;i&gt;The real modern question for programmers is what we can do, given that we actually have computers. Editors as flexible paper won't cut it.&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;div&gt;So of course I like &lt;a href="http://acko.net/blog/on-termkit"&gt;&lt;b&gt;TermKit&lt;/b&gt;&lt;/a&gt;:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-loKQ8MJeUtk/TdO4WjC2IDI/AAAAAAAAAw0/sDWl5efm7R8/s1600/termkit-2.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://2.bp.blogspot.com/-loKQ8MJeUtk/TdO4WjC2IDI/AAAAAAAAAw0/sDWl5efm7R8/s400/termkit-2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5608028658510209074" style="cursor: pointer; width: 400px; height: 328px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;It brings back memories of &lt;a href="http://wiki.opendylan.org/wiki/view.dsp?title=Apple%20Dylan"&gt;Apple Dylan&lt;/a&gt;:&lt;/div&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-FQSeETqdlto/TdO4koqsldI/AAAAAAAAAw8/OZzhfF7Dosk/s1600/appledylan-linked-browser-panes.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 348px; height: 400px;" src="http://4.bp.blogspot.com/-FQSeETqdlto/TdO4koqsldI/AAAAAAAAAw8/OZzhfF7Dosk/s400/appledylan-linked-browser-panes.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5608028900537701842" /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;It's simple: replace plain text files with collections, and lines with objects, and you get Good Things &lt;i&gt;for free&lt;/i&gt;!&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For example: Scott McKay &lt;a href="http://groups.google.com/group/comp.lang.lisp/msg/02782906f6c4d6e8?pli=1"&gt;describes the DEUCE editor&lt;/a&gt;:&lt;/div&gt;&lt;i&gt;&lt;blockquote&gt;The editor for FunO's Dylan product -- Deuce --  is the next generation of &lt;a href="http://en.wikipedia.org/wiki/ZWEI"&gt;Zwei&lt;/a&gt; in many ways.  It has &lt;b&gt;&lt;span class="Apple-style-span"&gt;first class polymorphic lines&lt;/span&gt;&lt;/b&gt;, first class BPs [buffer pointers], and introduces the idea first class "source containers" and "source sections".  A buffer is then dynamically composed of "section nodes". This extra generality costs  in space (it takes about 2 bytes of storage for every byte in a source file, whereas gnuemacs and the LW editor takes about 1 byte), and it costs a little in performance, but in return it's much easier to build some cool features:&lt;br /&gt;&lt;br /&gt;- Multiple fonts and colors fall right out (it took me about 1 day to get this working, and most of the work for fonts was because FunO Dylan doesn't have built-in support for "rich characters", so I had to roll my own).&lt;br /&gt;&lt;br /&gt;- Graphics display falls right out (e.g., the display of a buffer can show lines that separate sections, and there is a column of icons that show where breakpoints are set, where there are compiler warnings, etc.  Doing both these things took less than 1 day, but a comparable feature in Zwei took a week.  I wonder how long it took to do the icons in Lucid's C/C++ environment, whose name I can't recall.)&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;&lt;span class="Apple-style-span"&gt;"Composite buffers" (buffers built by generating functions such as "callers of 'foo'" or "subclasses of 'window') fall right out of this design&lt;/span&gt;&lt;/b&gt;, and again, it took less than a day to do this. It took a very talented hacker more than a month to build a comparable (but non-extensible) version in Zwei for an in-house VC system, and it never really worked right.&lt;br /&gt;&lt;br /&gt;Of course, the Deuce design was driven by knowing about the sorts of things that gnuemacs and Zwei didn't get right (*).  It's so much easier to stand on other people shoulders...&lt;/blockquote&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-3991019382491877914?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/3991019382491877914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=3991019382491877914&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3991019382491877914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3991019382491877914'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/05/termkit.html' title='TermKit'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-loKQ8MJeUtk/TdO4WjC2IDI/AAAAAAAAAw0/sDWl5efm7R8/s72-c/termkit-2.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-2232701297556168759</id><published>2011-05-14T00:06:00.005+02:00</published><updated>2011-05-14T17:15:23.542+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hygiene'/><category scheme='http://www.blogger.com/atom/ns#' term='edgelisp'/><title type='text'>Secret toplevel</title><content type='html'>A somewhat arcane aspect of hygienic macro systems is the notion that macro-introduced toplevel identifiers are secret.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;An example of this in &lt;a href="https://github.com/manuel/edgelisp"&gt;EdgeLisp&lt;/a&gt;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The macro FOO expands to code that defines a variable X using DEFVAR, and prints its value:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;tt&gt;(defmacro foo () #'(progn (defvar x 1) (print x)))&lt;/tt&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;(#' is EdgeLisp's code quotation operator.)&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Using the macro has the expected effect:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;tt&gt;(foo)&lt;/tt&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;tt&gt;1&lt;/tt&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;But X isn't actually a global variable now:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;tt&gt;x&lt;/tt&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;tt&gt;; Condition: The variable x is unbound.&lt;/tt&gt;&lt;/div&gt;&lt;div&gt;&lt;tt&gt;; Restarts:&lt;/tt&gt;&lt;/div&gt;&lt;div&gt;&lt;tt&gt;; 1: #[handler [use-value]]&lt;/tt&gt;&lt;/div&gt;&lt;div&gt;&lt;tt&gt;; 2: #[handler [retry-repl-request]]&lt;/tt&gt;&lt;/div&gt;&lt;div&gt;&lt;tt&gt;; 3: #[handler [abort]]&lt;/tt&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The name X only makes sense inside the expansion of (foo). Outside, it gets transparently renamed by the hygienic macro system.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(In EdgeLisp, a UUID is attached as &lt;i&gt;&lt;a href="http://axisofeval.blogspot.com/2010/05/understanding-hygiene-part-1.html"&gt;color&lt;/a&gt;&lt;/i&gt; (or &lt;i&gt;hygiene context&lt;/i&gt;) to the identifier.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Why the secrecy of toplevel variables? Well, it's simply an extension of the notion that identifiers that introduce new variable bindings (such as those in a LET) need to be treated specially to prevent unhygienic name clashes between macro- and user-written code. This secrecy completely frees macro writers from having to care about the identifiers they choose.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(Discussion of this topic on the R7RS list: &lt;a href="http://lists.scheme-reports.org/pipermail/scheme-reports/2011-April/000434.html"&gt;Are generated toplevel definitions secret?&lt;/a&gt;)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-2232701297556168759?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/2232701297556168759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=2232701297556168759&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2232701297556168759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2232701297556168759'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/05/secret-toplevel.html' title='Secret toplevel'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-6458643037067597928</id><published>2011-05-11T00:46:00.002+02:00</published><updated>2011-05-11T00:52:56.619+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='advocacy'/><title type='text'>The why of macros</title><content type='html'>&lt;a href="http://news.ycombinator.com/item?id=645338"&gt;Good analysis&lt;/a&gt; by Vladimir Sedach:&lt;br /&gt;&lt;i&gt;&lt;blockquote&gt;The entire point of programming is automation. The question that immediately comes to mind after you learn this fact is - why not program a computer to program itself? Macros are a simple mechanism for generating code, in other words, automating programming. [...]&lt;br /&gt;&lt;br /&gt;This is also the reason why functional programming languages ignore macros. The people behind them are not interested in programming automation. [Milner] created ML to help automate proofs. The Haskell gang is primarily interested in advancing applied type theory. [...]&lt;br /&gt;&lt;br /&gt;Adding macros to ML will have no impact on its usefulness for building theorem provers. You can't make APL or Matlab better languages for working with arrays by adding macros. But as soon as you need to express new domain concepts in a language that does not natively support them, macros become essential to maintaining good, concise code. This IMO is the largest missing piece in most projects based around domain-driven design.&lt;/blockquote&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-6458643037067597928?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/6458643037067597928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=6458643037067597928&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/6458643037067597928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/6458643037067597928'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/05/why-of-macros.html' title='The why of macros'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-4500645328656796797</id><published>2011-05-10T17:15:00.002+02:00</published><updated>2011-05-10T17:20:58.573+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='edgelisp'/><title type='text'>Hygiene in EdgeLisp</title><content type='html'>&lt;a href="https://github.com/manuel/edgelisp"&gt;EdgeLisp&lt;/a&gt; is chugging along nicely. I'll soon do a proper release.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I just implemented a variant of &lt;a href="http://srfi.schemers.org/srfi-72/srfi-72.html"&gt;SRFI 72&lt;/a&gt;, that is a &lt;i&gt;&lt;b&gt;hygienic defmacro&lt;/b&gt;&lt;/i&gt;. (I wrote two articles about SRFI 72: &lt;a href="http://axisofeval.blogspot.com/2010/05/understanding-hygiene-part-1.html"&gt;part 1&lt;/a&gt; and &lt;a href="http://axisofeval.blogspot.com/2011/03/understanding-hygiene-part-2-srfi-72.html"&gt;part 2&lt;/a&gt;).&lt;/div&gt;&lt;pre&gt;(defmacro swap (x y)&lt;br /&gt; #`(let ((tmp ,x))&lt;br /&gt;     (setq ,x ,y)&lt;br /&gt;     (setq ,y tmp)))&lt;br /&gt;nil&lt;br /&gt;(defvar x 1)&lt;br /&gt;1&lt;br /&gt;(defvar tmp 2)&lt;br /&gt;2&lt;br /&gt;(swap x tmp)&lt;br /&gt;1&lt;br /&gt;x&lt;br /&gt;2&lt;br /&gt;tmp&lt;br /&gt;1&lt;br /&gt;(swap tmp x)&lt;br /&gt;1&lt;br /&gt;x&lt;br /&gt;1&lt;br /&gt;tmp&lt;br /&gt;2&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-4500645328656796797?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/4500645328656796797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=4500645328656796797&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/4500645328656796797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/4500645328656796797'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/05/hygiene-in-edgelisp.html' title='Hygiene in EdgeLisp'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-671129690247878142</id><published>2011-05-08T19:11:00.008+02:00</published><updated>2011-05-08T22:39:38.118+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='edgelisp'/><title type='text'>Compiling, linking, and loading in EdgeLisp</title><content type='html'>&lt;a href="https://github.com/manuel/edgelisp"&gt;EdgeLisp&lt;/a&gt; now has &lt;b&gt;first-class object files&lt;/b&gt; (called FASL, for Fast-Loadable) and a primitive &lt;b&gt;linker&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;Let's &lt;b&gt;compile&lt;/b&gt; a FASL from a piece of code:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;(defvar fasl (compile #'(print "foo")))&lt;br /&gt;#[fasl [{"execute":"((typeof _lisp_function_print !== \"undefined\" ? _lisp_function_print : lisp_undefined_identifier(\"print\", \"function\", undefined))(null, \"foo\"))"}]]&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(Note that EdgeLisp uses #' and #` for code quotation.)&lt;br /&gt;&lt;br /&gt;The FASL contains the compiled JavaScript code of the expression (print "foo").&lt;br /&gt;&lt;br /&gt;We can &lt;b&gt;load&lt;/b&gt; that FASL, which prints foo.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;(load fasl)&lt;br /&gt;foo&lt;br /&gt;nil&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Let's create a second FASL:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;(defvar fasl-2 (compile #'(+ 1 2)))&lt;br /&gt;#[fasl [{"execute":"((typeof _lisp_function_P !== \"undefined\" ? _lisp_function_P : lisp_undefined_identifier(\"+\", \"function\", undefined))(null, (lisp_number(\"+1\")), (lisp_number(\"+2\"))))"}]]&lt;br /&gt;&lt;br /&gt;(load fasl-2)&lt;br /&gt;3&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Using &lt;b&gt;link&lt;/b&gt; we can concatenate the FASLs, combining their effects:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;(defvar linked-fasl (link fasl fasl-2))&lt;br /&gt;(load linked-fasl)&lt;br /&gt;foo&lt;br /&gt;3&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;Compile-time effects&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fasls keep separate the runtime and the compile-time effects of code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For example, a macro definition returns nil at runtime, and does its work at compile-time (edited for readability):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span"&gt;(compile #'(defmacro foo () #'bar))&lt;br /&gt;#[fasl [&lt;br /&gt;&lt;br /&gt;execute:&lt;br /&gt;(typeof _lisp_variable_nil !== "undefined" ? _lisp_variable_nil : lisp_undefined_identifier("nil", "variable", undefined))&lt;br /&gt;&lt;br /&gt;compile:&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;((typeof _lisp_function_Nset_macro_function !== "undefined" ? _lisp_function_Nset_macro_function : lisp_undefined_identifier("%set-macro-function", "function", undefined))(null, "foo", (function(_key_, _lisp_variable_NNform){ lisp_arity_min_max(arguments.length, 2, 2); return (((typeof _lisp_function_Ncompound_apply !== "undefined" ? _lisp_function_Ncompound_apply : lisp_undefined_identifier("%compound-apply", "function", undefined))(null, (function(_key_){ lisp_arity_min_max(arguments.length, 1, 1); return (((new Lisp_identifier_form("bar")))); }), ((typeof _lisp_function_Ncompound_slice !== "undefined" ? _lisp_function_Ncompound_slice : lisp_undefined_identifier("%compound-slice", "function", undefined))(null, (typeof _lisp_variable_NNform !== "undefined" ? _lisp_variable_NNform : lisp_undefined_identifier("%%form", "variable", undefined)), (lisp_number("+1"))))))); }))) ]]&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-671129690247878142?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/671129690247878142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=671129690247878142&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/671129690247878142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/671129690247878142'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/05/compiling-linking-and-loading-in.html' title='Compiling, linking, and loading in EdgeLisp'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-7140089092111932421</id><published>2011-05-05T00:59:00.003+02:00</published><updated>2011-05-05T01:05:19.106+02:00</updated><title type='text'>Land of Lisp - The Music Video!</title><content type='html'>&lt;iframe width="425" height="349" src="http://www.youtube.com/embed/HM1Zb3xmvMc?rel=0" frameborder="0" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;div&gt;&lt;i&gt;Minimal and sleek / but still so clever you'll freak.&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;Via &lt;a href="http://brainwagon.org/2011/04/26/book-review-land-of-lisp-by-conrad-barski/"&gt;Book Review: Land of LISP, by Conrad Barski&lt;/a&gt; via &lt;a href="https://twitter.com/#!/zooko/status/65904235874758656"&gt;@zooko&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-7140089092111932421?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/7140089092111932421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=7140089092111932421&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/7140089092111932421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/7140089092111932421'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/05/land-of-lisp-music-video.html' title='Land of Lisp - The Music Video!'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/HM1Zb3xmvMc/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-4001341697608841791</id><published>2011-05-04T10:11:00.004+02:00</published><updated>2011-05-04T10:27:16.312+02:00</updated><title type='text'>Unlimited number of runtimes</title><content type='html'>Because Lisp macros are written in Lisp, there's a &lt;i&gt;&lt;b&gt;runtime at compile-time&lt;/b&gt;&lt;/i&gt;. (See this &lt;a href="http://axisofeval.blogspot.com/2010/07/whats-phase-separation-and-when-do-you.html"&gt;previous post&lt;/a&gt; for more.)&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Some Lisp compilers produce &lt;b&gt;two separate object files&lt;/b&gt; for a .lisp file: A FASL file that contains the runtime effects, and a CFASL that contains the compile-time effects (such as macro definitions).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But why stop at two object files? A single file could in fact produce any number of runtimes (FASLs).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One example where this would make sense is documentation: Imagine a DEFDOC macro (for documenting variables), whose effects take place at &lt;b&gt;&lt;i&gt;documentation-time&lt;/i&gt;&lt;/b&gt;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(defvar x 1)&lt;/div&gt;&lt;div&gt;(defdoc x "A cool variable.")&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;DEFDOC registers the documentation string "A cool variable." with X in some table, so that it can be looked up.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The FASL would contain (defvar x 1), and the &lt;i&gt;DFASL&lt;/i&gt; would contain (defdoc x "A cool variable.").&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now it's up to the programmer to decide when and if to load the DFASL: in the development environment, one would always load documentation-time, but for a packaged application maybe not. There one would only ship the FASLs, not the CFASLs and DFASLs (unless the application is intended to be programmed by users).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-4001341697608841791?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/4001341697608841791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=4001341697608841791&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/4001341697608841791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/4001341697608841791'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/05/unlimited-number-of-runtimes.html' title='Unlimited number of runtimes'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-2660703675993196077</id><published>2011-04-29T23:44:00.008+02:00</published><updated>2011-05-02T20:44:30.146+02:00</updated><title type='text'>on quotation</title><content type='html'>&lt;div&gt;Some über-obvious notes:&lt;br /&gt;&lt;br /&gt;Lisp &lt;b&gt;literals&lt;/b&gt; (booleans, numbers, strings, ...) are sometimes called &lt;i&gt;&lt;b&gt;self-evaluating&lt;/b&gt;&lt;/i&gt; or &lt;i&gt;&lt;b&gt;self-quoting&lt;/b&gt;&lt;/i&gt; objects.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is important because it brings to mind that other objects &lt;i&gt;don't&lt;/i&gt; evaluate to themselves: a &lt;b&gt;symbol&lt;/b&gt; evaluates to the value of the &lt;b&gt;variable&lt;/b&gt; it names, and a &lt;b&gt;list&lt;/b&gt; evaluates to the result of a&lt;b&gt; call&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To actually get hands on a symbol or list, we need to &lt;b&gt;quote&lt;/b&gt; it. Literals need no quoting, they're self-quoting.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;While unquoted X looks quite similar to quoted 'X, they're utterly different. X stands for &lt;i&gt;&lt;b&gt;read a variable&lt;/b&gt; from memory&lt;/i&gt;, while 'X stands for &lt;i&gt;&lt;b&gt;construct a symbol object&lt;/b&gt; with the name "X"&lt;/i&gt; (leaving interning aside).&lt;br /&gt;&lt;br /&gt;And that's really the &lt;a style="font-style: italic;" href="http://en.wikipedia.org/wiki/Use-mention_distinction"&gt;use-mention distinction&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-2660703675993196077?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/2660703675993196077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=2660703675993196077&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2660703675993196077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2660703675993196077'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/04/on-quotation.html' title='on quotation'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-2710442985041841083</id><published>2011-04-28T11:25:00.005+02:00</published><updated>2011-04-28T13:26:20.042+02:00</updated><title type='text'>A new Cambrian explosion</title><content type='html'>Three areas that seem to be exploding are new programming languages, new databases, and new content-centric networking protocols.&lt;br /&gt;&lt;br /&gt;But I think all of these developments will be dwarfed by the emergence of &lt;span style="font-weight: bold;"&gt;the browser as the unified display substrate and JavaScript as the new instruction set&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The last time we had a similar event was the introduction of the &lt;span style="font-weight: bold;"&gt;GUI in the 80's/90's&lt;/span&gt;: millions of programmers scrambled to write every imaginable application for this new system&lt;br /&gt;&lt;br /&gt;But the GUI explosion will be peanuts compared to the browser+JS explosion! Not only are there far &lt;span style="font-weight: bold;"&gt;more programmers&lt;/span&gt; today, they're also all &lt;span style="font-weight: bold;"&gt;joined by the internet&lt;/span&gt; now. And there's ubiquitous &lt;span style="font-weight: bold;"&gt;view source&lt;/span&gt;. Need I say more??&lt;br /&gt;&lt;br /&gt;Millions of programmers are scrambling &lt;span style="font-weight: bold;"&gt;right now&lt;/span&gt; to write every imaginable application for the browser+JS.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;If you ain't emittin' HTML and JS, you're gonna miss out on this once-in-a-geological-era event!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-2710442985041841083?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/2710442985041841083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=2710442985041841083&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2710442985041841083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2710442985041841083'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/04/new-cambrian-explosion.html' title='A new Cambrian explosion'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-6233286220863679684</id><published>2011-04-28T11:17:00.003+02:00</published><updated>2011-04-28T23:17:53.455+02:00</updated><title type='text'>R7RS discussion warming up</title><content type='html'>&lt;span style="font-style: italic;"&gt;I would still appreciate pointers as to how to implement this ;-) Anyone can implement Scheme, but only half a dozen people have implemented separate compilation with hygienically introduced toplevel bindings.&lt;/span&gt; — &lt;a href="http://lists.scheme-reports.org/pipermail/scheme-reports/2011-April/000520.html"&gt;Andy Wingo&lt;/a&gt; of Guile&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;For example, '幺' (U+5e7a) has Numeric_Type = 'Numeric', since the character means small or young, so it can sometimes mean 1 in some specific context (for Japanese, probably the only place it means '1' is in some Mah-jong terms.)   So, when I'm scanning a string and found that char-numeric? returns #t for a character, and that character happens to '幺' (U+5e7a), and then what I do?   It is probably a part of other word so I should treat it as an alphabetic character.  And even if I want to make use of it, I need a separate database to look up to know what number '幺' is representing.&lt;/span&gt; — &lt;a href="http://lists.scheme-reports.org/pipermail/scheme-reports/2011-April/000518.html"&gt;Shiro Kawai&lt;/a&gt; of Gauche&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-6233286220863679684?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/6233286220863679684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=6233286220863679684&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/6233286220863679684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/6233286220863679684'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/04/r7rs-discussion-heating-up.html' title='R7RS discussion warming up'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-464695029527120808</id><published>2011-04-28T03:49:00.009+02:00</published><updated>2011-04-28T04:08:58.662+02:00</updated><title type='text'>Taylor Campbell's blag</title><content type='html'>&lt;a href="http://mumble.net/%7Ecampbell/blag.txt"&gt;&lt;span style="font-weight: bold;"&gt;Taylor Campbell's blag&lt;/span&gt;&lt;/a&gt; contains many insightful posts related to programming languages, Scheme in particular.&lt;br /&gt;&lt;br /&gt;For example, he clears up my confusion about &lt;a href="http://www.nhplace.com/kent/PFAQ/unwind-protect-vs-continuations-overview.html"&gt;UNWIND-PROTECT vs Continuations&lt;/a&gt;:&lt;br /&gt;&lt;pre&gt;The difference [to DYNAMIC-WIND] is in the intent implied by the use&lt;br /&gt;of UNWIND-PROTECT that if control cannot re-enter the protected&lt;br /&gt;extent, the protector can be immediately applied when control exits&lt;br /&gt;the protected extent even if no garbage collection is about&lt;br /&gt;to run finalizers.&lt;br /&gt;&lt;br /&gt;Note that one cannot in general reconcile&lt;br /&gt;&lt;br /&gt;(1) needing to release the resource immediately after control exits&lt;br /&gt;the extent that uses it, and&lt;br /&gt;&lt;br /&gt;(2) enjoying the benefits of powerful control abstractions such as&lt;br /&gt;inversion of control.&lt;br /&gt;&lt;br /&gt;However, if (1) is relaxed to&lt;br /&gt;&lt;br /&gt;(1') needing to release the resource immediately after control&lt;br /&gt;/returns normally from/ the extent that uses it,&lt;br /&gt;&lt;br /&gt;then one can reconcile (1') and (2) by writing&lt;br /&gt;&lt;br /&gt;(CALL-WITH-VALUES (LAMBDA () &amp;lt;resource-usage&amp;gt;)&lt;br /&gt;  (LAMBDA RESULTS&lt;br /&gt;    &amp;lt;resource-release&amp;gt;&lt;br /&gt;    (APPLY VALUES RESULTS))), or simply&lt;br /&gt;&lt;br /&gt;(BEGIN0 &amp;lt;resource-usage&amp;gt; &amp;lt;resource-release&amp;gt;)&lt;br /&gt;&lt;br /&gt;using the common name BEGIN0 for this idiom.  (In Common Lisp, this&lt;br /&gt;is called &lt;a href="http://clhs.lisp.se/Body/m_prog1c.htm"&gt;PROG1&lt;/a&gt;.)&lt;/pre&gt;(And Dorai Sitaram &lt;a href="http://www.ccs.neu.edu/home/dorai/uwcallcc/uwcallcc.html"&gt;says&lt;/a&gt;: UNWIND-PROTECT "cannot have a canonical, once-and-for-all specification in Scheme, making it important to allow for multiple library solutions".)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-464695029527120808?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/464695029527120808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=464695029527120808&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/464695029527120808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/464695029527120808'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/04/taylor-campbells-blag.html' title='Taylor Campbell&apos;s blag'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-3787413758600555880</id><published>2011-04-27T22:30:00.024+02:00</published><updated>2011-04-28T01:00:58.097+02:00</updated><title type='text'>What's a condition system and why do you want one?</title><content type='html'>This post attempts to explain how Lisp &lt;em&gt;condition systems&lt;/em&gt; surpass ordinary &lt;em&gt;exception handling&lt;/em&gt;.  Condition systems &lt;em&gt;don't unwind the stack by default&lt;/em&gt; and thus allow computations to be &lt;em&gt;restarted&lt;/em&gt;, which is a useful tool.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Exception handling&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;try {&lt;br /&gt;  throw new Exception();&lt;br /&gt;catch (Exception e) {&lt;br /&gt;  ... // handler code&lt;br /&gt;}&lt;/pre&gt;Everybody knows what this exception handling code in Java does: the THROW searches for a CATCH clause (a &lt;span style="font-style: italic;"&gt;handler&lt;/span&gt;) that catches subclasses of Exception, unwinds the stack, and calls the handler code with E bound to the exception object.&lt;br /&gt;&lt;br /&gt;At the moment the exception is thrown, the stack looks like this:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;... // outside stack&lt;/li&gt;&lt;li&gt;TRY/CATCH(Exception e)&lt;/li&gt;&lt;li&gt;... // middle stack&lt;/li&gt;&lt;li&gt;THROW new Exception()&lt;/li&gt;&lt;/ul&gt;There's an &lt;span style="font-style: italic;"&gt;outside stack&lt;/span&gt; that doesn't concern us. The &lt;span style="font-style: italic;"&gt;middle stack&lt;/span&gt; is the stack between the TRY/CATCH and the THROW, which is actually empty in this example, but usually contains a whole lotta function calling going on.&lt;br /&gt;&lt;br /&gt;Before the handler is called, the stack is unwound:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;... // outside stack&lt;/li&gt;&lt;li&gt; TRY/CATCH(Exception e)&lt;/li&gt;&lt;li style="color: rgb(255, 0, 0);"&gt;&lt;strike&gt;... // middle stack&lt;/strike&gt;&lt;/li&gt;&lt;li style="color: rgb(255, 0, 0);"&gt;&lt;strike&gt;THROW new Exception()&lt;/strike&gt;&lt;/li&gt;&lt;/ul&gt;When the handler is called, the stack looks like this:&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;... // outside stack&lt;/li&gt;&lt;li&gt; TRY/CATCH(Exception e)&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;... // handler code&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Condition systems&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Condition systems&lt;/span&gt; in the Lisp family are based on the fundamental insight that &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;calling&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt; a handler&lt;/span&gt; can be decoupled from &lt;span style="font-style: italic; font-weight: bold;"&gt;unwinding the stack&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Imagine the following:&lt;br /&gt;&lt;pre&gt;try {&lt;br /&gt;  throw new Exception();&lt;br /&gt;} &lt;span style="color: rgb(51, 204, 0);"&gt;handle&lt;/span&gt;(Exception e) {&lt;br /&gt;  ... // handler code&lt;br /&gt;}&lt;/pre&gt;We've added a new keyword to Java, HANDLE. HANDLE is just like CATCH, except that the stack is not unwound when an Exception is thrown.&lt;br /&gt;&lt;br /&gt;With this new keyword, the stack looks like this when the handler is called:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;... // outside stack&lt;/li&gt;&lt;li&gt;TRY/HANDLE(Exception e)&lt;/li&gt;&lt;li&gt;... // middle stack&lt;/li&gt;&lt;li&gt;THROW new Exception()&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;... // handler code&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; The handler runs &lt;span style="font-style: italic;"&gt;inside&lt;/span&gt; the THROW statement (Common Lisp would say, during the &lt;a href="http://clhs.lisp.se/Body/26_glo_d.htm#dynamic_extent"&gt;&lt;span style="font-style: italic;"&gt;dynamic extent&lt;/span&gt;&lt;/a&gt; of the THROW).&lt;br /&gt;&lt;br /&gt;For many exceptions it makes sense to simply unwind the stack, like ordinary exception handling does. But for some exceptions, we gain a lot of power from the non-unwinding way condition systems enable.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Restarts&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;One of the most interesting aspects of not automatically unwinding the stack when an exception occurs is that the we can &lt;span style="font-style: italic;"&gt;restart&lt;/span&gt; the computation that raised an exception.&lt;br /&gt;&lt;br /&gt;Let's imagine two primitive API functions: &lt;span style="font-weight: bold;"&gt;GETVAL and SETVAL read and write a VAL variable&lt;/span&gt;.&lt;br /&gt;&lt;pre&gt;Object val = null;&lt;br /&gt;Object getVal() { return val; }&lt;br /&gt;void setVal(Object newVal) { val = newVal; }&lt;/pre&gt;Now we want to add the contract that &lt;span style="font-weight: bold;"&gt;GETVAL should never return null&lt;/span&gt;. When VAL is NULL, and GETVAL is called then an exception is raised:&lt;br /&gt;&lt;pre&gt;Object getVal() {&lt;br /&gt;  if (val == null) throw new NoValException();&lt;br /&gt;  else return val;&lt;br /&gt;}&lt;/pre&gt;A user of GETVAL may &lt;span style="font-weight: bold;"&gt;install a handler&lt;/span&gt; like this:&lt;br /&gt;&lt;pre&gt;try {&lt;br /&gt;  getVal();&lt;br /&gt;} handle (NoValException e) { // note use of HANDLE, not CATCH&lt;br /&gt;  ... // handler code&lt;br /&gt;}&lt;/pre&gt;When GETVAL() is called and VAL is null, an exception is thrown, our handler gets called, and the stack looks like this:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;... // outside stack&lt;br /&gt;&lt;/li&gt;&lt;li&gt;TRY/HANDLE(NoValException e)&lt;/li&gt;&lt;li&gt;getVal()&lt;br /&gt;&lt;/li&gt;&lt;li&gt;THROW new NoValException()&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;... // handler code&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;As you can see, our handler for NoValException runs, and the exception "isn't over yet", because the stack hasn't been unwound.&lt;br /&gt;&lt;br /&gt;Thanks to the non-unwinding nature of condition systems, an application may decide to simply &lt;span style="font-weight: bold;"&gt;use a default value&lt;/span&gt;, when GETVAL is called and VAL is null.&lt;br /&gt;&lt;br /&gt;We do this using &lt;span style="font-style: italic;"&gt;restarts&lt;/span&gt;, which are simply an &lt;span style="font-style: italic;"&gt;idiomatic use&lt;/span&gt; of non-unwinding exceptions:&lt;sup&gt;&lt;a href="#fn1"&gt;(1)&lt;/a&gt;&lt;/sup&gt;&lt;br /&gt;&lt;br /&gt;We rewrite GETVAL to &lt;span style="font-weight: bold;"&gt;provide a restart&lt;/span&gt; for using a value:&lt;br /&gt;&lt;pre&gt;Object getVal() {&lt;br /&gt;  &lt;span style="color: rgb(51, 204, 0);"&gt;try {&lt;/span&gt;&lt;br /&gt;    if (val == null) throw new NoValException();&lt;br /&gt;    else return val;&lt;br /&gt;  &lt;span style="color: rgb(51, 204, 0);"&gt;} catch (UseValRestart r) {&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(51, 204, 0);"&gt;return r.getVal();&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(51, 204, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;}&lt;/pre&gt;GETVAL can be &lt;span style="font-style: italic;"&gt;restarted&lt;/span&gt; by throwing a USEVALRESTART whose value will be returned by GETVAL.  (Note that we use CATCH and not HANDLE to install the handler for the restart.) &lt;br /&gt;&lt;br /&gt;In the application:&lt;br /&gt;&lt;pre&gt;try {&lt;br /&gt;  getVal();&lt;br /&gt;} handle (NoValException e) {&lt;br /&gt;  &lt;span style="color: rgb(51, 204, 0);"&gt;throw new UseValRestart("the default value");&lt;/span&gt;&lt;br /&gt;}&lt;/pre&gt;(The USEVALRESTART is simply a condition/exception that can be constructed with a value as argument, and offers a single method GETVAL to read that value.)&lt;br /&gt;&lt;br /&gt;Now, when GETVAL() is called and VAL is null, the stack looks like this:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;... // outside stack&lt;br /&gt;&lt;/li&gt;&lt;li&gt;TRY/HANDLE(NoValException e)&lt;/li&gt;&lt;li&gt;getVal()&lt;/li&gt;&lt;li&gt;TRY/CATCH(UseValRestart r) [1]&lt;br /&gt;&lt;/li&gt;&lt;li&gt;THROW new NoValException()&lt;/li&gt;&lt;li&gt;THROW new UseValRestart("the default value") [2]&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The restart at [2] bubbles up, and is returned by the TRY/CATCH for the restart at [1], which means that GETVAL returns "the default value":&lt;br /&gt;&lt;ul&gt;&lt;li&gt;... // outside stack&lt;br /&gt;&lt;/li&gt;&lt;li&gt;TRY/HANDLE(NoValException e)&lt;/li&gt;&lt;li&gt;getVal()&lt;/li&gt;&lt;li&gt;TRY/CATCH(UseValRestart r)&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;strike&gt;THROW new NoValException()&lt;/strike&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;strike&gt;THROW new UseValRestart("the default value")&lt;/strike&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;return r.getVal(); // "the default value"&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;A simple extension would be to offer a restart for letting the user &lt;span style="font-weight: bold;"&gt;interactively choose a value&lt;/span&gt;:&lt;br /&gt;&lt;pre&gt;Object getVal() {&lt;br /&gt;  &lt;span style="color: rgb(51, 204, 0);"&gt;try {&lt;/span&gt;&lt;br /&gt;    if (val == null) throw new NoValException();&lt;br /&gt;    else return val;&lt;br /&gt;  } catch (UseValRestart r) {&lt;br /&gt;    return r.getVal();&lt;br /&gt;  &lt;span style="color: rgb(51, 204, 0);"&gt;} catch (LetUserChooseValRestart r) {&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(51, 204, 0);"&gt;return showValDialog();&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(51, 204, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;}&lt;/pre&gt;This assumes a function SHOWVALDIALOG that interactively asks the user for a value, and returns that value. The application can now decide to use a default value or let the user choose a value.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Summary&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The ability to &lt;span style="font-style: italic;"&gt;restart&lt;/span&gt; a computation is gained by decoupling &lt;span style="font-style: italic;"&gt;calling a handler&lt;/span&gt; from &lt;span style="font-style: italic;"&gt;unwinding the stack&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;We have introduced a new keyword HANDLE, that's like CATCH, but doesn't unwind the stack (HANDLE and CATCH are analogous, but not equal, to Common Lisp's &lt;a href="http://clhs.lisp.se/Body/m_handle.htm"&gt;handler-bind&lt;/a&gt; and &lt;a href="http://clhs.lisp.se/Body/m_hand_1.htm"&gt;handler-case&lt;/a&gt;, respectively).&lt;br /&gt;&lt;br /&gt;HANDLE is used to act from inside the THROW statement.  We have used this to implement restarts, a stylized way to use exceptions.&lt;br /&gt;&lt;br /&gt;I hope this post makes clear the difference between ordinary exception handling, and Lisp &lt;span style="font-style: italic;"&gt;condition systems&lt;/span&gt;, all of which feature restarts in one form or another.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Further reading:&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://groups.google.com/group/comp.lang.dylan/browse_thread/thread/82ccceeddec10289"&gt;A tale of restarts&lt;/a&gt; - comp.lang.dylan message by Chris Double (&lt;em&gt;"This is a "I'm glad I used Dylan" story..."&lt;/em&gt;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.nhplace.com/kent/Papers/Exceptional-Situations-1990.html"&gt;Exceptional Situations In Lisp&lt;/a&gt; and &lt;a href="http://www.nhplace.com/kent/Papers/Condition-Handling-2001.html"&gt;Condition Handling in the Lisp Language Family&lt;/a&gt; - increasingly detailed papers by Kent Pitman&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Footnotes:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="fn1"&gt;(1) This is inspired by Dylan.  Common Lisp actually treats conditions and restarts separately.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-3787413758600555880?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/3787413758600555880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=3787413758600555880&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3787413758600555880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3787413758600555880'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/04/whats-condition-system-and-why-do-you.html' title='What&apos;s a condition system and why do you want one?'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-6518849838380177583</id><published>2011-04-26T19:14:00.002+02:00</published><updated>2011-04-26T19:19:10.523+02:00</updated><title type='text'>Lisp hype danger</title><content type='html'>&lt;img src="http://3.bp.blogspot.com/-FaPanYxG3kQ/Tbb-c7xD4-I/AAAAAAAAAwY/H3n5z00Xsjg/s400/lisplogo_warning2_256.png" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;Yesterday, "Lisp was dead".&lt;br /&gt;&lt;br /&gt;Today, Lispers are asked to &lt;a href="http://www.winestockwebdesign.com/Essays/Lisp_Curse.html"&gt;&lt;span style="font-style: italic;"&gt;"reproduce their pre-AI Winter achievements"&lt;/span&gt;&lt;/a&gt; and there's talk of &lt;a href="http://www.johndcook.com/blog/2011/04/26/the-myth-of-the-lisp-genius/"&gt;&lt;span style="font-style: italic;"&gt;"Lisp geniuses"&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I sense danger in the hype cycle!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-6518849838380177583?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/6518849838380177583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=6518849838380177583&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/6518849838380177583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/6518849838380177583'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/04/lisp-hype-danger.html' title='Lisp hype danger'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-FaPanYxG3kQ/Tbb-c7xD4-I/AAAAAAAAAwY/H3n5z00Xsjg/s72-c/lisplogo_warning2_256.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-2286306879619382724</id><published>2011-04-26T13:16:00.005+02:00</published><updated>2011-04-26T13:27:17.414+02:00</updated><title type='text'>Hypercode</title><content type='html'>I just saw &lt;a href="http://emilis.github.com/2011/04/12/usefullnes-of-inventing-languages.html"&gt;this use of HTML lists and tables for syntax&lt;/a&gt;, and I liked it. I think that HTML is the future of all UIs, thus also of PLs.&lt;br /&gt;&lt;br /&gt;The possibilities of using HTML instead of plain text are huge, and I wish that the syntax-obsessed would focus on HTML instead of plain text.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-2286306879619382724?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/2286306879619382724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=2286306879619382724&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2286306879619382724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2286306879619382724'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/04/hypercode.html' title='Hypercode'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-644720604239075876</id><published>2011-04-25T17:04:00.004+02:00</published><updated>2011-04-25T19:58:10.322+02:00</updated><title type='text'>Original Dylan Manual</title><content type='html'>Thanks to the Wayback Machine, I just discovered the original 1992 Dylan manual: &lt;a style="font-weight: bold; font-style: italic;" href="http://replay.web.archive.org/20070927124444/http://oop.rosweb.ru/dylan/book.annotated/contents.html"&gt;Dylan (TM) -- An object-oriented dynamic language&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Back then, Dylan still had S-expression syntax, making its CL and Scheme heritage much more obvious.&lt;br /&gt;&lt;br /&gt;If you want to see dynamic object-oriented PL &lt;span style="font-style: italic;"&gt;design&lt;/span&gt; (as opposed to &lt;span style="font-style: italic;"&gt;trial and error&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;plucking out of thin air&lt;/span&gt;, or other popular approaches) this is one of the few places to look.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;(Here's &lt;a href="http://amigos.rdsathene.org/other/prefix-dylan/book.annotated/contents.html"&gt;another URL&lt;/a&gt; for the manual.)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-644720604239075876?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/644720604239075876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=644720604239075876&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/644720604239075876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/644720604239075876'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/04/original-dylan-manual.html' title='Original Dylan Manual'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-5649557110930134881</id><published>2011-04-21T15:04:00.011+02:00</published><updated>2011-05-14T16:56:07.073+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='edgelisp'/><title type='text'>EdgeLisp progress</title><content type='html'>My hobby Lisp-&amp;gt;JS compiler, &lt;span style="font-style: italic;"&gt;&lt;a href="https://github.com/manuel/edgelisp"&gt;EdgeLisp&lt;/a&gt;&lt;/span&gt; (formerly known as &lt;span style="font-style: italic;"&gt;CyberLisp&lt;/span&gt;) just passed a major milestone: using multiple dispatch, a numeric tower (provided by Danny Yoo's &lt;a href="https://github.com/dyoo/js-numbers"&gt;js-numbers&lt;/a&gt;), and inline JavaScript, I'm able to write the &lt;code&gt;&amp;gt;&lt;/code&gt; generic function as follows:&lt;br /&gt;&lt;pre&gt;(defgeneric &amp;gt; (a b))&lt;br /&gt;(defmethod &amp;gt; ((a number) (b number))&lt;br /&gt;#{ jsnums.greaterThan(~a, ~b) #})&lt;br /&gt;&lt;/pre&gt;Checking it out at the &lt;a href="http://manuel.github.com/edgelisp/repl.html"&gt;REPL&lt;/a&gt;:&lt;br /&gt;&lt;pre&gt;(&amp;gt; 200000000000000000000000000000000000000000 100000000000000000000000000000000000000000)&lt;br /&gt;#t&lt;br /&gt;&lt;/pre&gt;Yay!&lt;br /&gt;&lt;br /&gt;EdgeLisp is &lt;span style="font-weight: bold;font-size:180%;"&gt;FAR&lt;/span&gt; from usable by anyone but me, but at this point I just had to blog about it. You can check it out &lt;a href="https://github.com/manuel/edgelisp"&gt;here&lt;/a&gt; if you want.&lt;br /&gt;&lt;br /&gt;Disclaimer: docs are outdated, and the project is in rapid flux.&lt;br /&gt;&lt;br /&gt;The more I work on this, the more I respect anybody who's produced a usable PL. The sheer amount of work is unbelievable. :)&lt;br /&gt;&lt;br /&gt;Props also to Douglas Crockford's &lt;a href="https://github.com/douglascrockford/JSON-js"&gt;json.js&lt;/a&gt; and Chris Double's &lt;a href="https://github.com/doublec/jsparse"&gt;jsparse&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-5649557110930134881?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/5649557110930134881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=5649557110930134881&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/5649557110930134881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/5649557110930134881'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/04/edgelisp-progress.html' title='EdgeLisp progress'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-681898375460574344</id><published>2011-03-30T11:52:00.004+02:00</published><updated>2011-03-30T12:04:09.643+02:00</updated><title type='text'>Truth IS stranger than fiction</title><content type='html'>An &lt;a href="http://news.ycombinator.com/item?id=2380044"&gt;amazing look back at Java's early days&lt;/a&gt;, by Chuck McManis on HN:&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;Tcl was the 'language to beat' amongst the new language products. Self was the 'language like no other' (or a totally new way to express what you wanted to a computer). Java was the 'language that re-used code'. C++ was kind of a joke (remember this was the late 80's, early 90's) since it took a perfectly acceptable language, C, and made writing code harder, more error prone, and less likely to produce correct code (all true at the time).&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Tcl was a language of rapid expression and Java was a language which was safer, in part, because it enforced a certain level of correctness (type safety, no pointer arithmetic, Etc.).&lt;div&gt;&lt;br /&gt;Tcl had a "huge" installed base of developers, Java had zero developers and hoped to have 10 or 20K eventually.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Bert Sutherland (the guy running Sun Labs and Ivan's brother) got everyone in a room and said "We're going to have a 'language' day, and each of you gets to present why you think your language should exist." the issue was of course that Sun had only so much budget and we had no business reason for developing any new languages.&lt;br /&gt;Surprisingly to some, Tcl 'won' that evaluation. Self was going to continue because Bill could self fund it if he wanted to, and Tcl had the developer base and momentum. The decision was taken to scrap the remains of the Java team (called the Live Oak project at the time) at the end of the Fiscal Year (June 30th, 1995). We were all set to be 're-deployed' which was Sun code for 'find a new job inside of Sun or we'll lay you off.'&lt;/div&gt;&lt;div&gt;&lt;br /&gt;What happened next was unexpected. James Gosling, with Kim Polese's help, had convinced the lawyers to allow us to release the source code for 'free' (very un-Sun like) so that we could at least point at something we had done on our resumes. The requirement was that we have a trademarkable name for it (which I believe was, in part, to prevent Apple or Microsoft from re-publishing it as their own thing). We dropped Alpha 1.1 (we had secretly released Alpha 1.0 in February) on March 23rd. Kim sent out a press release to some folks. (not sure if she used PR Newswire or not) The Mercury News put it on the front page, they got a quote from Marc Andresson over at Netscape that it was cool. When I went to the WWW conference 2.0 (as in second conference :-) in Darmstadt Germany two weeks later, everyone wanted to talk about it. I manually downloaded and installed it on all the Sparcstation 20's that the sales office had brought to the conference and gave a quick set of talking points to the sales guys. When I got back there was a storm because folks like Ed Zander were demanding to know why they hadn't been briefed before we announced it, Phil Sampire(sp?) was complaining that people kept calling the sales office to get their sales droid to come out and talk about it and they had no marketing material and no prep. May press conference was already queued up as the SparcStation 20 / Firewall-One launch event, the SS20 got the boot and they replaced it with the Java 'launch'. I spent a crazy couple of weeks creating a completely Java home page for Sun (had I known it was a portent of all flash sites to come I might have shot myself right then and there :-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Everyone 'forgot' about how they were going to flush the team and instead everyone came out of the woodwork to claim they had supported it all along, SunSoft, SunLabs, and Sun Interactive (which had the only financial success with it at the time, competing against the Time Warner VOD bids). An entirely new 'planet' was born, called JavaSoft and the rest is history.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;What Java gave Sun at that point in time was a credible threat against Microsoft. The threat was that the new desktop was the browser, and the way you coded for the browser was Java. Tcl didn't play in that space, and to their credit I don't think the Tcl folks were willing to go there just to ride the buzz.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Java's wake grew to eclipse the other language efforts and Sun never looked back.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-681898375460574344?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/681898375460574344/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=681898375460574344&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/681898375460574344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/681898375460574344'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/03/truth-is-stranger-than-fiction.html' title='Truth IS stranger than fiction'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-3557579597267623447</id><published>2011-03-29T19:21:00.004+02:00</published><updated>2011-07-18T16:57:23.272+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='laws'/><title type='text'>Duke's Law</title><content type='html'>&lt;a href="http://groups.google.com/group/pilud/msg/2137d941ba5b175a"&gt;Raoul Duke&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;As soon as somebody brings in a reference to xah lee, somebody else has to call somebody a Nazi, and then somebody else has to invoke the spirit of john harrop when he was an ocaml instead of F# bigot, etc. etc.&lt;/i&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-3557579597267623447?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/3557579597267623447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=3557579597267623447&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3557579597267623447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3557579597267623447'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/03/dukes-law.html' title='Duke&apos;s Law'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-2327531001839812281</id><published>2011-03-29T17:44:00.007+02:00</published><updated>2011-03-31T22:56:35.834+02:00</updated><title type='text'>Syntax puns considered harmful (well, not really)</title><content type='html'>Schemers use the word "syntax" to mean at least two (and maybe even three) different things:&lt;div&gt;&lt;ul&gt;&lt;li&gt;in DEFINE-SYNTAX and LET-SYNTAX, syntax means &lt;i&gt;&lt;b&gt;macro expander&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;in SYNTAX and QUASISYNTAX, syntax means &lt;i&gt;&lt;b&gt;code&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;in BEGIN-FOR-SYNTAX, syntax means &lt;i&gt;&lt;b&gt;compile-time&lt;/b&gt;&lt;/i&gt; (although it's debatable whether this use of syntax is really different from the first one)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;There is a certain elegance in that, but in the end it's also a bit silly.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And it's problematic, as the (awesome) paper &lt;a href="http://www.ccs.neu.edu/scheme/pubs/pldi11-thacff.pdf"&gt;&lt;i&gt;Languages as Libraries&lt;/i&gt;&lt;/a&gt; shows: because LET-SYNTAX is already taken to mean "locally bind a &lt;i&gt;macro expander&lt;/i&gt;", they have to use &lt;i&gt;WITH&lt;/i&gt;-SYNTAX to mean "locally bind a &lt;i&gt;piece of code&lt;/i&gt;".&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-2327531001839812281?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/2327531001839812281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=2327531001839812281&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2327531001839812281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2327531001839812281'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/03/syntax-puns-considered-harmful.html' title='Syntax puns considered harmful (well, not really)'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-686067870549710749</id><published>2011-03-28T22:19:00.006+02:00</published><updated>2011-03-28T22:34:35.257+02:00</updated><title type='text'>Don't diss Java - Be Happy</title><content type='html'>&lt;img style="width: 255px; height: 200px;" src="http://2.bp.blogspot.com/-TmucWse6cyg/TZDvddGCCwI/AAAAAAAAAvs/Bwq1wP2JWOs/s400/duke.gif" border="0" alt="" id="BLOGGER_PHOTO_ID_5589230426871958274" /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;On the occasion of Gosling joining Google, it's Java diss time again. But most Java criticism doesn't take its raison d'être into account:&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;We were after the C++ programmers. We managed to drag a lot of them about halfway to Lisp. Aren't you happy? — &lt;a href="http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg04045.html"&gt;Guy Steele&lt;/a&gt;&lt;/i&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;Java has many faults. But most of them are there &lt;i&gt;by design&lt;/i&gt;. That's not something many language designers can claim.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Java was a Trojan Horse, designed to slip in a modicum of dynamic features without C++'ers getting suspicious.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That whole dynamic-language-in-the-mainstream thing may have never happened without Java.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Aren't you happy?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-686067870549710749?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/686067870549710749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=686067870549710749&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/686067870549710749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/686067870549710749'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/03/dont-diss-java-be-happy.html' title='Don&apos;t diss Java - Be Happy'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-TmucWse6cyg/TZDvddGCCwI/AAAAAAAAAvs/Bwq1wP2JWOs/s72-c/duke.gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-5802292307780185234</id><published>2011-03-28T19:07:00.000+02:00</published><updated>2011-03-28T19:07:32.467+02:00</updated><title type='text'>Computational Trinitarianism</title><content type='html'>Given that software is so utterly confusing, it's often helpful to bring in metaphors from other areas, Christianity in this case: &lt;b&gt;&lt;i&gt;&lt;a href="http://existentialtype.wordpress.com/2011/03/27/the-holy-trinity/"&gt;The Holy Trinity&lt;/a&gt;&lt;/i&gt;&lt;/b&gt; from Bob Harper's excellent &lt;a href="http://existentialtype.wordpress.com/"&gt;Existential Type&lt;/a&gt;:&lt;br /&gt;&lt;i&gt;&lt;blockquote&gt;The Christian doctrine of trinitarianism states that there is one God that is manifest in three persons, the Father, the Son, and the Holy Spirit, who together form the Holy Trinity.   The doctrine of computational trinitarianism holds that computation manifests itself in three forms: proofs of propositions, programs of a type, and mappings between structures.  These three aspects give rise to three sects of worship: Logic, which gives primacy to proofs and propositions; Languages, which gives primacy to programs and types; Categories, which gives primacy to mappings and structures.  The central dogma of computational trinitarianism holds that Logic, Languages, and Categories are but three manifestations of one divine notion of computation.  There is no preferred route to enlightenment: each aspect provides insights that comprise the experience of computation in our lives.&lt;/blockquote&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-5802292307780185234?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/5802292307780185234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=5802292307780185234&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/5802292307780185234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/5802292307780185234'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/03/computational-trinitarianism.html' title='Computational Trinitarianism'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-4539373402106533366</id><published>2011-03-28T03:04:00.005+02:00</published><updated>2011-03-28T03:17:58.138+02:00</updated><title type='text'>OOP, again and again and again</title><content type='html'>&lt;i&gt;Nothing&lt;/i&gt; gets LtU's juices flowing like a good old OOP discussion.  It starts with a harmless &lt;i&gt;&lt;a href="http://lambda-the-ultimate.org/node/4235#comment-64963"&gt;&lt;b&gt;"OO is anti-modular? Really?"&lt;/b&gt;&lt;/a&gt;&lt;/i&gt; and runs into the right margin very quickly.  It's worth a read.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In that thread there's also &lt;a href="http://lambda-the-ultimate.org/node/4235#comment-65081"&gt;a quote describing OOP&lt;/a&gt; that's very close to my POV, by Jonathan Aldrich:&lt;/div&gt;&lt;blockquote&gt;&lt;i&gt;building dynamic dispatch into the language ... is the one thing that separates languages commonly considered "OO" from those that are not&lt;/i&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;Previously: &lt;i&gt;&lt;a href="http://axisofeval.blogspot.com/2010/11/why-are-objects-so-unintuitive.html"&gt;Why are objects so unintuitive&lt;/a&gt;.&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-4539373402106533366?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/4539373402106533366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=4539373402106533366&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/4539373402106533366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/4539373402106533366'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/03/oop-again-and-again-and-again.html' title='OOP, again and again and again'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-3854318897393154159</id><published>2011-03-07T21:12:00.004+01:00</published><updated>2011-03-07T21:19:34.624+01:00</updated><title type='text'>That explains it</title><content type='html'>&lt;div&gt;&lt;a href="http://coding.derkeiler.com/Archive/Lisp/comp.lang.lisp/2005-07/msg01432.html"&gt;Kent Pitman&lt;/a&gt;:&lt;/div&gt;&lt;blockquote&gt;&lt;i&gt;I certainly sat in lots of Scheme design meetings where I pushed for obvious things like branch cuts, error handling, and other "useful" things and was told that such things would ... make the language "too useful" [thus meaning too many people would flock to it and it would be the end of the designers' ability to do the things to the language that _they_ wanted to do].&lt;/i&gt;&lt;/blockquote&gt;Seriously though, this shows that the forces behind Scheme are far from obvious.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-3854318897393154159?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/3854318897393154159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=3854318897393154159&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3854318897393154159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3854318897393154159'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/03/that-explains-it.html' title='That explains it'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-6807275021856466109</id><published>2011-03-07T19:32:00.017+01:00</published><updated>2011-03-08T02:44:07.160+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hygiene'/><title type='text'>Understanding Hygiene (part 2) -- SRFI 72</title><content type='html'>My critically acclaimed &lt;a href="http://axisofeval.blogspot.com/2010/05/understanding-hygiene-part-1.html"&gt;&lt;b&gt;&lt;i&gt;Understanding Hygiene (part 1)&lt;/i&gt;&lt;/b&gt;&lt;/a&gt; contains the absolute baseline necessary for understanding hygienic macros.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This post is about my understanding of André van Tonder's &lt;b&gt;&lt;a href="http://srfi.schemers.org/srfi-72/srfi-72.html"&gt;SRFI 72&lt;/a&gt;&lt;/b&gt; - a specific way of implementing hygiene, which differs from more widely used hygienic systems such as the venerable &lt;tt&gt;syntax-case&lt;/tt&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It must be said that hygiene is still &lt;a href="http://okmij.org/ftp/papers/Dirty-Macros-talk.pdf"&gt;an area of active research&lt;/a&gt;. &lt;a href="http://okmij.org/ftp/Scheme/macros.html#syntax-rule-dark-corner"&gt;There be dragons&lt;/a&gt;. Nevertheless, van Tonder is quite confident of his design, going so far as calling it "improved hygiene". David Herman, who wrote &lt;a href="http://www.ccs.neu.edu/home/dherman/research/papers/dissertation.pdf"&gt;the &lt;strike&gt;book&lt;/strike&gt;dissertation on the theory of hygienic macros&lt;/a&gt; is &lt;a href="http://twitter.com/#!/littlecalculist/status/28485942067068928"&gt;skeptical&lt;/a&gt;. Anton van Straaten makes some &lt;a href="http://lambda-the-ultimate.org/node/1342#comment-15283"&gt;mediatory points&lt;/a&gt;. Matthew Flatt raises even more &lt;a href="http://www.r6rs.org/r6rs-editors/2006-March/001082.html"&gt;mind-bending questions&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That said, for a hygiene noob like me, SRFI 72 seems to be an elegant and workable design. I wrote a &lt;a href="https://github.com/manuel/ell"&gt;half-assed Lisp-&gt;C compiler&lt;/a&gt; that contains a SRFI 72 inspired macro system (here's &lt;a href="https://github.com/manuel/ell/blob/master/t/srfi-72.lisp"&gt;a test from SRFI 72 in my Lisp&lt;/a&gt; that works -- phew) and the experience was quite pleasurable. Of the couple thousand lines of C in the system, only &lt;i&gt;a couple dozen&lt;/i&gt; or so deal with hygiene.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Basically, what SRFI 72 says is this: when you create a piece of code using the code constructors syntax or quasisyntax, e.g.&lt;/div&gt;&lt;div&gt;&lt;nobr&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;/nobr&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;(syntax (let ((x 1)) (foo x)))&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;the identifiers in there (let, x, foo) get a fresh hygiene context (or "color"). Thus they won't conflict with identifiers of another color -- such as those created by somebody else (e.g. another macro, or the user's source). That was the easy part.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Additionally, SRFI 72 makes such pieces of code obey a discipline that is similar to lexical scoping. That is the meaning of 72's money quote that van Tonder repeats multiple times, in the hope of hammering his point home:&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;i&gt;the evaluation of any nested, unquoted &lt;b&gt;syntax&lt;/b&gt; or &lt;b&gt;quasisyntax&lt;/b&gt; forms counts as part of the evaluation of an enclosing &lt;b&gt;quasisyntax&lt;/b&gt;.&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;Say we have some piece of silly code, like:&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;(quasisyntax (bla bla bla ,(some-unquoted-stuff (lambda () (quasisyntax (bla bla bla))))))&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;The outer quasisyntax constructs/quotes the piece of code. Then the "," unquotes and we call some contrived function that happens to take a lambda as argument. Then, inside the lambda there's another quasisyntax, so we're quoted again. The contrived unquoted stuff and the lambda don't matter. What matters is that there's an inner quasisyntax &lt;i&gt;lexically&lt;/i&gt; embedded in the outer quasisyntax.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, SRFI 72's money quote tells us that the inner quasisyntax's bla's &lt;i&gt;have the same color&lt;/i&gt; as the outer quasisyntax's bla's. Why? Because the inner quasisyntax is lexically nested in the outer quasisyntax, and like a lexical variable binding, the outer quasisyntax's color is "inherited" down to the inner quasisyntax.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This took me a looooooooooooooooooong while to figure out, and I hope that this post will help those trying to understand SRFI 72.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Questions?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-6807275021856466109?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/6807275021856466109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=6807275021856466109&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/6807275021856466109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/6807275021856466109'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/03/understanding-hygiene-part-2-srfi-72.html' title='Understanding Hygiene (part 2) -- SRFI 72'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-1930454181269083647</id><published>2011-03-01T16:51:00.004+01:00</published><updated>2011-03-01T17:09:03.056+01:00</updated><title type='text'>Language design criticism = art criticism (?)</title><content type='html'>A &lt;a href="http://lambda-the-ultimate.org/node/4210#comment-64695"&gt;comment by Sean McDirmid&lt;/a&gt; on LtU is spinning off into a nice PL design discussion:&lt;blockquote&gt;&lt;i&gt;We should only critique designs like we critique art, I like this and I don't like that, made from the perspective of another person's tastes. C++ is an example of a language that has a controversial rather than poor design, some people find it ugly while others find it beautiful. A good design is simply a language designed by a good designer, and it might not suit your tastes but you should appreciate it for what it is, right?&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;div&gt;&lt;i&gt;I got into some arguments recently over Scala. That I was critical of Scala and compared it to C++ led someone to think I was a Scala hater, while nothing could be farther from the truth. People tend to get very emotional about their languages (or paradigm) of choice. A good discussion involves acknowledging our biases and being objective about our and others' opinions.&lt;/i&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-1930454181269083647?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/1930454181269083647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=1930454181269083647&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/1930454181269083647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/1930454181269083647'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/03/language-design-criticism-art-criticism.html' title='Language design criticism = art criticism (?)'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-9204419640266466372</id><published>2011-02-26T12:21:00.002+01:00</published><updated>2011-02-26T12:25:53.507+01:00</updated><title type='text'>Applied Types</title><content type='html'>Chris Double is again &lt;b&gt;&lt;a href="http://www.bluishcoder.co.nz/2011/02/26/reading-data-from-a-file-in-ats.html"&gt;exploring ATS&lt;/a&gt;&lt;/b&gt;, a language with a very advanced type system:&lt;blockquote&gt;&lt;i&gt;ATS did save me from some errors in my larger program that this snippet can be used to demonstrate:&lt;/i&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;The read call must not read more data than the size of the buffer allows.&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;The conversion to a C string in-place means we need to read one less than the size of the buffer.&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;The file must be closed after use.&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;i&gt;All these issues resulted in compile time errors. [!]&lt;/i&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-9204419640266466372?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/9204419640266466372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=9204419640266466372&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/9204419640266466372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/9204419640266466372'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/02/applied-types.html' title='Applied Types'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-426538746656506312</id><published>2011-02-24T02:16:00.003+01:00</published><updated>2011-02-24T10:43:30.118+01:00</updated><title type='text'>Emscripten</title><content type='html'>&lt;blockquote&gt;&lt;i&gt;This is CPython, the standard Python implementation, compiled from C to JavaScript using Emscripten, &lt;a href="http://syntensity.com/static/python.html"&gt;running in your browser&lt;/a&gt; (without any plugins).&lt;/i&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;Highly sick.&lt;/div&gt;&lt;blockquote&gt;&lt;i&gt;&lt;a href="http://code.google.com/p/emscripten/"&gt;&lt;b&gt;Emscripten&lt;/b&gt;&lt;/a&gt; is an LLVM-to-JavaScript compiler. It takes LLVM bitcode (which can be generated from C/C++, using llvm-gcc or clang, or any other language that can be converted into LLVM) and compiles that into JavaScript, which can be run on the web (or anywhere else JavaScript can run).&lt;/i&gt;&lt;/blockquote&gt;[So &lt;i&gt;will&lt;/i&gt; we run Emacs in X11 in the browser??]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-426538746656506312?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/426538746656506312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=426538746656506312&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/426538746656506312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/426538746656506312'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/02/emscripten.html' title='Emscripten'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-8680484583698304746</id><published>2011-02-19T23:29:00.004+01:00</published><updated>2011-02-19T23:32:40.220+01:00</updated><title type='text'>Wittgenstein for programmers</title><content type='html'>Harrison Ainsworth's &lt;a href="http://www.hxa.name/notes/note-hxa7241-20110219T1113Z.html"&gt;&lt;i&gt;&lt;b&gt;Wittgenstein for programmers&lt;/b&gt;&lt;/i&gt;&lt;/a&gt; is an awesome project. And very quotable:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;i&gt;Where a proposition describes the world, a program constructs the imagination.&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;i&gt;The limits of our programming-languages mean the limits of our imagination.&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;i&gt;What can be designed at all can be designed precisely. What is unknown we must leave uncoded.&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-8680484583698304746?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/8680484583698304746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=8680484583698304746&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/8680484583698304746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/8680484583698304746'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/02/wittgenstein-for-programmers.html' title='Wittgenstein for programmers'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-4721207786382552190</id><published>2011-02-19T23:18:00.005+01:00</published><updated>2011-02-19T23:25:20.868+01:00</updated><title type='text'>Browsers will let PLs break free from plain text</title><content type='html'>Programs really aren't plain text. Or they shouldn't be.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But until now there was no way out.  OSes come with Ed, and &lt;a href="http://www.gnu.org/fun/jokes/ed.msg.html"&gt;Ed is the standard text editor&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But pretty soon, we'll want to do development in our browsers.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Do we really want to port our 1960's plain text infrastructure to browsers? Surely the answer must be a resounding ``No!''&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Reinventing integrated development environments in the browser will make it possible to ditch plain text, and switch to the multimedial representations our programs deserve.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finally.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-4721207786382552190?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/4721207786382552190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=4721207786382552190&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/4721207786382552190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/4721207786382552190'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/02/browsers-will-let-pls-break-free-from.html' title='Browsers will let PLs break free from plain text'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-8305619688138298821</id><published>2011-02-16T21:58:00.002+01:00</published><updated>2011-02-16T22:07:50.863+01:00</updated><title type='text'>Free as in Freedom</title><content type='html'>&lt;div&gt;Vladimir Sedach &lt;a href="http://twitter.com/#!/vsedach/status/37970152687534080"&gt;just tweeted&lt;/a&gt; something dear to my heart:&lt;/div&gt;&lt;blockquote&gt;&lt;b&gt;&lt;i&gt;Arguing that the #GPL is restricting your freedom is exactly the same as arguing that the &lt;a href="http://en.wikipedia.org/wiki/Thirteenth_Amendment_to_the_United_States_Constitution"&gt;13th Amendment&lt;/a&gt; is restricting your freedom.&lt;/i&gt;&lt;/b&gt;&lt;/blockquote&gt;&lt;div&gt;Go GNU!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;BTW, I'm now also a twit at @&lt;a href="http://twitter.com/msimoni"&gt;msimoni&lt;/a&gt; and like to get in touch with all PL enthusiasts out there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-8305619688138298821?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/8305619688138298821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=8305619688138298821&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/8305619688138298821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/8305619688138298821'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/02/free-as-in-freedom.html' title='Free as in Freedom'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-5009688405743370088</id><published>2011-02-16T16:26:00.006+01:00</published><updated>2011-02-16T17:23:11.638+01:00</updated><title type='text'>Dear Lazyweb: RMS on namespace management</title><content type='html'>I remember reading an article about RMS some time ago, where he says that a module system/namespace management for Emacs Lisp is not something he finds important.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I find this interesting because Linus essentially &lt;a title="post by Linus Torvalds on C's simplicity" href="http://www.realworldtech.com/forums/index.cfm?action=detail&amp;amp;id=110618&amp;amp;threadid=110549&amp;amp;roomid=2"&gt;said the same thing&lt;/a&gt; wrt C.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you know which article this is, please be so kind and post it in the comments, or &lt;a href="mailto:msimoni@gmail.com"&gt;send me a mail&lt;/a&gt;. Thanks!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(Edit: See also &lt;i&gt;&lt;a href="http://lambda-the-ultimate.org/node/3991"&gt;How important is language support for namespace management?&lt;/a&gt;&lt;/i&gt; on LtU.)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-5009688405743370088?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/5009688405743370088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=5009688405743370088&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/5009688405743370088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/5009688405743370088'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/02/dear-lazyweb-rms-on-namespace.html' title='Dear Lazyweb: RMS on namespace management'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-2837339248863671785</id><published>2011-01-28T13:30:00.004+01:00</published><updated>2011-01-28T13:36:02.051+01:00</updated><title type='text'>The LISP עץ החיים</title><content type='html'>&lt;a href="http://zahardzhan.github.com/2011/lisp.html"&gt;&lt;img style="width: 225px; height: 400px;" src="http://3.bp.blogspot.com/_kakNmBjOGaA/TUK3EIJa3-I/AAAAAAAAAuQ/ahZCdHQpYUY/s400/symbolic-tree-of-early-lispers.png" alt="" id="BLOGGER_PHOTO_ID_5567213370917707746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Plain awesome!&lt;br /&gt;&lt;br /&gt;(&lt;a href="http://3.bp.blogspot.com/_kakNmBjOGaA/TUK3EIJa3-I/AAAAAAAAAuQ/ahZCdHQpYUY/s1600/symbolic-tree-of-early-lispers.png"&gt;cached copy&lt;/a&gt; in case the original site goes down)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-2837339248863671785?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/2837339248863671785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=2837339248863671785&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2837339248863671785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2837339248863671785'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/01/lisp-tree-of-life.html' title='The LISP עץ החיים'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kakNmBjOGaA/TUK3EIJa3-I/AAAAAAAAAuQ/ahZCdHQpYUY/s72-c/symbolic-tree-of-early-lispers.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-6251737265500671969</id><published>2011-01-26T14:07:00.007+01:00</published><updated>2011-01-29T02:59:27.327+01:00</updated><title type='text'>Proglangs are machines, not media</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kakNmBjOGaA/TUAenK_uBCI/AAAAAAAAAuI/SG9nEfSgBlU/s1600/hilti.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 252px;" src="http://1.bp.blogspot.com/_kakNmBjOGaA/TUAenK_uBCI/AAAAAAAAAuI/SG9nEfSgBlU/s400/hilti.jpg" alt="" id="BLOGGER_PHOTO_ID_5566482797745275938" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've &lt;a href="http://axisofeval.blogspot.com/2010/12/quick-what-does-this-machine-do.html"&gt;blogged&lt;/a&gt; about this before, but I think it's worth stressing again:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Programming languages should not be viewed as &lt;span style="font-weight: bold;"&gt;media&lt;/span&gt;, but as &lt;span style="font-weight: bold;"&gt;machines&lt;/span&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I first had this intuition when learning Common Lisp: CL is like a big &lt;span style="font-style: italic;"&gt;program&lt;/span&gt; (i.e. an object, a machine), that's configured and used through Lisp code.&lt;br /&gt;&lt;br /&gt;This has the nice side-effect of vindicating Lisp's built-in uglyness: who cares what a machine looks like, as long as it's the best for the job?&lt;br /&gt;&lt;br /&gt;(Thanks to Harrison Ainsworth for the &lt;a href="http://www.hxa.name/notes/note-hxa7241-20101218T2158Z.html"&gt;initial inspiration&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;[Edit: Ah well, I guess I pushed the publish button too quick. Of course, PLs &lt;span style="font-style: italic;"&gt;are&lt;/span&gt; media. But that's obvious. I think it's important to also look at their object, machine aspects.]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-6251737265500671969?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/6251737265500671969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=6251737265500671969&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/6251737265500671969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/6251737265500671969'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/01/proglangs-are-machines-not-media.html' title='Proglangs are machines, not media'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kakNmBjOGaA/TUAenK_uBCI/AAAAAAAAAuI/SG9nEfSgBlU/s72-c/hilti.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-4996612344861182679</id><published>2011-01-23T17:46:00.002+01:00</published><updated>2011-01-23T17:52:48.075+01:00</updated><title type='text'>Maniacal, religious dedication to code beauty</title><content type='html'>It's hard to keep source code "beautiful".&lt;br /&gt;&lt;br /&gt;I think the only way it can work is to be dedicated like Zen monks cleaning their monastery - even one speck of dreck is too much.&lt;br /&gt;&lt;br /&gt;The best example I know is Jonathan Bachrach's &lt;a href="http://people.csail.mit.edu/jrb/goo/goo.htm"&gt;GOO&lt;/a&gt; (which also has a lot of other qualities). The code in there is phenomenally clean and consistent, and looks funny and artful to boot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-4996612344861182679?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/4996612344861182679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=4996612344861182679&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/4996612344861182679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/4996612344861182679'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/01/maniacal-religious-dedication-to-code.html' title='Maniacal, religious dedication to code beauty'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-3603460494952141692</id><published>2011-01-20T23:29:00.002+01:00</published><updated>2011-01-20T23:33:58.375+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lowlevel'/><title type='text'>The dark, dark, dark art of unwinding the stack</title><content type='html'>Ian Lance Taylor, the author of the gold linker and the GCC version of the Go language, has written a nice mini-series on how to unwind the stack:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.airs.com/blog/archives/460"&gt;.eh_frame&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.airs.com/blog/archives/462"&gt;.eh_frame_hdr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.airs.com/blog/archives/464"&gt;.gcc_except_table&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;This is wizard-level material, and it probably helps to have the ELF and DWARF specs handy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-3603460494952141692?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/3603460494952141692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=3603460494952141692&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3603460494952141692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/3603460494952141692'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/01/dark-dark-dark-art-of-unwinding-stack.html' title='The dark, dark, dark art of unwinding the stack'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-275683133970462408</id><published>2011-01-09T13:02:00.001+01:00</published><updated>2011-01-09T13:04:56.447+01:00</updated><title type='text'>A Lisp slogan</title><content type='html'>&lt;blockquote style="font-style: italic;"&gt;Lisp is the worst programming language, except all the others that have been tried.&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-275683133970462408?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/275683133970462408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=275683133970462408&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/275683133970462408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/275683133970462408'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/01/lisp-slogan.html' title='A Lisp slogan'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-2796682996715963122</id><published>2011-01-06T13:47:00.007+01:00</published><updated>2011-01-06T14:30:28.486+01:00</updated><title type='text'>Curing PL Anxiety</title><content type='html'>Some years ago I was in a state that I now discover in many other people on the web, and which I term "PL anxiety". It is characterized by a constant insecurity about which PL is &lt;span style="font-style: italic;"&gt;the best&lt;/span&gt;, which one to learn, how &lt;a href="http://shootout.alioth.debian.org/"&gt;"fast"&lt;/a&gt; each one is, whether PG is really right, etc etc.&lt;br /&gt;&lt;br /&gt;In retrospective, my way out of this was a four-pronged approach:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;(1) The Breadwinner PL&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You should know one language that's reasonably popular where you live, and which will always land you a job. In the past that meant C++, C, Java, C#, and maybe Perl and PHP, but these days you can probably also get away with Python, Ruby, JavaScript, or Scala.&lt;br /&gt;&lt;br /&gt;What's important about the breadwinner PL is that you know its semantics and its standard library &lt;span style="font-style: italic;"&gt;by heart&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;(2) The C PL&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Infinitely many good things come to you by learning C, because your OS is written in it. Studying C, you'll learn awesome stuff, like how to handle SIGSEGV, &lt;a href="http://agner.org/optimize/"&gt;exploit your branch predictor&lt;/a&gt;, write a language runtime, and &lt;a href="http://lambda-the-ultimate.org/node/3474"&gt;what a linker is&lt;/a&gt;, for example.&lt;br /&gt;&lt;br /&gt;The more you learn about C, the more you'll learn about a wide array of services that are already provided to you by your OS and &lt;a href="http://gcc.gnu.org/onlinedocs/gcc-3.2.3/gcc/C-Extensions.html"&gt;compiler&lt;/a&gt;. And C is fun and simple to boot, and will give you the warm fuzzy feeling that comes from building things (almost) from the ground up.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;(3) The Romantic PLs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;These are languages that you really like and if you're &lt;span style="font-style: italic;"&gt;really&lt;/span&gt; lucky, might one day get paid for using. You don't have to make a choice - learn them all. They all have their pros and cons, and &lt;a href="http://axisofeval.blogspot.com/2010/06/letter-to-young-pl-enthusiast.html"&gt;in the end you'll have to roll your own, anyhow&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;(4) The Other Interesting PLs Out There&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Also keep an eye on olden golden PLs and newcomers to the scene, even if you're never going to use them: they may blow your mind, and that's what you really should be looking for. &lt;a href="http://lambda-the-ultimate.org/node/4088"&gt;Ωmega&lt;/a&gt; is a good example.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;The Real World&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I've come to start new non-hobby projects in my breadwinner language, because it's the most convenient, I know it by heart, all my problems have already been encountered and hopefully solved by somebody else, there are tons of libraries, and PLs seem to matter very little for many projects (and if they matter, you can always Greenspun it).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Motivation&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The thing that keeps me motivated learning more about PLs are PLs themselves. I learned C writing Lisp-&gt;C compilers, for example. I'm learning about dependent types because I'd like to implement a PL that has them. It's weird, but works for me.&lt;br /&gt;&lt;br /&gt;HTH.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-2796682996715963122?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/2796682996715963122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=2796682996715963122&amp;isPopup=true' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2796682996715963122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2796682996715963122'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/01/curing-pl-anxiety.html' title='Curing PL Anxiety'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-2674570671824821338</id><published>2011-01-06T12:55:00.002+01:00</published><updated>2011-01-06T13:09:20.441+01:00</updated><title type='text'>On Python and Ruby</title><content type='html'>I often like to make snide remarks at Python and Ruby, because ... well, because they're not Lisp.&lt;br /&gt;&lt;br /&gt;To offset this a bit I'd like to say what I find good and impressive about them:&lt;br /&gt;&lt;br /&gt;Python seems to be a great language for &lt;span style="font-style: italic;"&gt;describing algorithms&lt;/span&gt;. For example, &lt;a href="http://lists.canonical.org/pipermail/kragen-hacks/"&gt;Kragen's hacks&lt;/a&gt; abound with samples of Python code that is simply wonderful to read, and seems like exactly the way to go.&lt;br /&gt;&lt;br /&gt;Ruby is to be congratulated for demonstrating once and for all that dynamically-typed, semi-functional, object-oriented programming is a fun and useful paradigm for &lt;span style="font-style: italic;"&gt;systems scripting&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-2674570671824821338?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/2674570671824821338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=2674570671824821338&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2674570671824821338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/2674570671824821338'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/01/on-python-and-ruby.html' title='On Python and Ruby'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722310642266356003.post-8712522511256138789</id><published>2011-01-02T16:09:00.018+01:00</published><updated>2011-09-04T23:46:33.579+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><title type='text'>Why Lisp is a Big Hack (And Haskell is Doomed to Succeed)</title><content type='html'>Note: This post presents my thinking as of the time it was written. Presently, I may be thinking something else entirely.&lt;br /&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;em&gt;I fear that Haskell is doomed to succeed.&lt;/em&gt; — Tony Hoare&lt;/blockquote&gt;I &lt;span style="color:red;"&gt;♥&lt;/span&gt; Lisp. I think it's the best tool we have, at the moment, for many applications.&lt;br /&gt;&lt;br /&gt;I don't really love Haskell that much, but I track its progress with awe. (When I say &lt;span style="font-style: italic;"&gt;Haskell&lt;/span&gt;, I'm not only speaking about Haskell per se, but also about all the FP languages in its halo, like Ωmega, Agda, Epigram, ...)&lt;br /&gt;&lt;br /&gt;And when I look at Haskell, it seems obvious to me that it's out to eat Lisp's lunch. In fact, eat all other languages' lunches.&lt;br /&gt;&lt;br /&gt;The gist of this post is: &lt;span style="font-style: italic; font-weight: bold;"&gt;In the not-so-far future, Haskell will be able to do everything Lisp can do now (and more), but in an adjustably-safe, statically-verified manner.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;What do I mean by that?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Adjustably-safe&lt;/span&gt;: In this mythical, not yet-existing, but clearly on-the-horizon "Haskell", you'll be able to choose how much safety you want. You'll have "knobs" for increasing or decreasing compile-time checks for any property and invariant you desire. Or don't desire. You'll be able to switch between Lisp-style dynamic typing, Haskell-style static typing, and probably even C-style weak/no-typing. In the same program.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Statically-verified&lt;/span&gt;: Haskell is clearly moving towards &lt;a href="http://axisofeval.blogspot.com/2010/10/notes-on-dependent-types.html"&gt;dependent typing&lt;/a&gt;, which in theory, allows the expression of &lt;span style="font-style: italic;"&gt;arbitrary invariants&lt;/span&gt; that are maintained statically, without having to run the program. Dependent typing is the weirdest and most &lt;span style="font-style: italic;"&gt;awesome&lt;/span&gt; thing to expect of programming, this side of quantum computers.&lt;br /&gt;&lt;br /&gt;Lisp, as it stands, can't do any of that, and won't be able to do any of that. That's simply a fact. Why? Because it's coming at the problem from the wrong direction. Trying to graft an interesting type system or verification onto Lisp is simply too heroic and ill-specified a task. Lisp starts with ultimate freedom/unsafety, and you can't constrain it. Haskell starts with ultimate bondage/safety, and then, piece by piece, adds that freedom back. On a theoretically well-founded basis.&lt;br /&gt;&lt;br /&gt;Right now, Lisp has certain advantages. As a command or scripting language where ultimate dynamism is desired (Emacs), it's still clearly superior. But Haskell is encroaching on its habitat from all sides, just like it's encroaching on the habitats of all other languages. Right now it may appear pointy-headed and harmless. But I think it's unstoppable, and doomed to succeed.&lt;br /&gt;&lt;br /&gt;How does that make Lisp a big hack? If my theory is right, then once Haskell will be able to &lt;span style="font-style: italic;"&gt;do everything Lisp can do now&lt;/span&gt; (and more), all the while maintaining &lt;span style="font-style: italic;"&gt;adjustable safety&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;static verification&lt;/span&gt;, I think it will be justified to call Lisp a big hack - because it &lt;span style="font-style: italic;"&gt;lacks the possibility of this safety and verification, in principle&lt;/span&gt;. (Of course you have to subscribe to the idea that this safety and verification is something that's good and superior. I do.)&lt;br /&gt;&lt;br /&gt;(&lt;a href="http://news.ycombinator.com/item?id=2062436"&gt;HN&lt;/a&gt;, &lt;a href="http://www.reddit.com/r/programming/comments/evbyu/why_lisp_is_a_big_hack_and_haskell_is_doomed_to/?sort=confidence"&gt;Reddit&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722310642266356003-8712522511256138789?l=axisofeval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://axisofeval.blogspot.com/feeds/8712522511256138789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5722310642266356003&amp;postID=8712522511256138789&amp;isPopup=true' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/8712522511256138789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722310642266356003/posts/default/8712522511256138789'/><link rel='alternate' type='text/html' href='http://axisofeval.blogspot.com/2011/01/why-lisp-is-big-hack-and-haskell-is.html' title='Why Lisp is a Big Hack (And Haskell is Doomed to Succeed)'/><author><name>Manuel Simoni</name><uri>http://www.blogger.com/profile/07840673741485280526</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>18</thr:total></entry></feed>
