<?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-8255220546902369433</id><updated>2012-02-01T08:50:31.249+01:00</updated><category term='Slime'/><category term='lisp slime'/><category term='Lisp'/><title type='text'>Contra serpentem lapsum memoriae.</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://trittweiler.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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>24</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8255220546902369433.post-8862803766074676834</id><published>2011-12-07T11:18:00.001+01:00</published><updated>2011-12-07T11:18:34.443+01:00</updated><title type='text'>Xmas wish: generate depends.mk from .asd file</title><content type='html'>Touting a little Xmas wish into the snowy intertubes: Many kudos to anyone who writes a little tool to generate a &lt;span style="font-family: courier new;"&gt;depends.mk&lt;/span&gt; Makefile from an &lt;span style="font-family: courier new;"&gt;.asd&lt;/span&gt; file. (Similar to &lt;span style="font-family: courier new;"&gt;gcc&lt;/span&gt;'s &lt;span style="font-family: courier new;"&gt;-M&lt;/span&gt; / &lt;span style="font-family: courier new;"&gt;-MM&lt;/span&gt; flags.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8255220546902369433-8862803766074676834?l=trittweiler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trittweiler.blogspot.com/feeds/8862803766074676834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8255220546902369433&amp;postID=8862803766074676834' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/8862803766074676834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/8862803766074676834'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/2011/12/xmas-wish-generate-dependsmk-from-asd.html' title='Xmas wish: generate depends.mk from .asd file'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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-8255220546902369433.post-3075498147379281042</id><published>2011-12-01T18:27:00.007+01:00</published><updated>2011-12-01T20:43:24.665+01:00</updated><title type='text'>A Conditional Situations Function API Pattern</title><content type='html'>&lt;a href="http://www.teclo.net"&gt;I haven't written for a long time&lt;/a&gt;, and before &lt;a href="http://www.quicklisp.org"&gt;Zach&lt;/a&gt; is going to weep my occasional mumblings from &lt;a href="http://planet.lisp.org"&gt;Planet Lisp&lt;/a&gt;, I thought I better sit down and share some API pattern that I have grown fond of.&lt;br /&gt;&lt;br /&gt;The pattern addresses conditional code paths in a function's execution, in particular exceptional situations. Typically, there are the following ways you want to deal with a conditional situation:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;  return a caller-specific value,&lt;/li&gt;&lt;li&gt;  signal an error as a structured way to transfer control,&lt;/li&gt;&lt;li&gt;  signal a warning or log a message and continue execution,&lt;/li&gt;&lt;li&gt;  signal a warning or log a message and return from execution,&lt;/li&gt;&lt;li&gt;  ignore the conditional situation and just continue execution,&lt;/li&gt;&lt;li&gt;  or perform some arbitrary caller-specific action.&lt;/li&gt;&lt;/ul&gt;Using the pattern, we will be able to express all those ways conveniently and concisely in the call to the function.&lt;br /&gt;&lt;br /&gt;As illustrative example throughout this posting, we will use &lt;span style="font-family:courier new;"&gt;JOIN-THREAD&lt;/span&gt;. (It was the recent update of &lt;a href="http://www.sbcl.org"&gt;SBCL&lt;/a&gt;'s &lt;span style="font-family:courier new;"&gt;JOIN-THREAD&lt;/span&gt; that reminded me on this pattern.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;JOIN-THREAD&lt;/span&gt; waits until the passed thread finishes its execution and returns the values of evaluating the last form in the thread. There are two exceptional situations involved:&lt;br /&gt;&lt;ol&gt;&lt;li&gt; as one does not necessarily want to wait forever, a caller can specify a timeout that might expire;&lt;/li&gt;&lt;li&gt; the thread might not have finished gracefully.&lt;/li&gt;&lt;/ol&gt;The pattern I want to introduce would make it have the following function interface:&lt;br /&gt;&lt;blockquote  style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;pre&gt;(join-thread thread &amp;amp;key timeout on-timeout on-failure)&lt;/pre&gt;&lt;/span&gt;&lt;/blockquote&gt;Where &lt;span style="font-family:courier new;"&gt;ON-TIMEOUT&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;ON-FAILURE&lt;/span&gt; can be either functions taking a condition object, or a non-function value that would essentially be interpreted as if &lt;span style="font-family:courier new;"&gt;(CONSTANTLY &amp;lt;the-value&amp;gt;)&lt;/span&gt; was passed.&lt;br /&gt;&lt;br /&gt;The code invoking the &lt;span style="font-family:courier new;"&gt;ON-TIMEOUT&lt;/span&gt; callback might be written as follows:&lt;span style="font-family: courier new;font-size:85%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;blockquote style="font-family: courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;pre&gt;(if (functionp on-timeout)&lt;br /&gt;    (return-from join-thread (funcall on-timeout &amp;lt;timeout condition&amp;gt;))&lt;br /&gt;    (return-from join-thread on-timeout))&lt;/pre&gt;&lt;/span&gt;&lt;/blockquote&gt;Notice that the callback is invoked with a Condition object. Notice further that it's invoked in a tail position of the function being defined. This is true for exceptional situations; in the broader case of conditional situations, the function will usually continue further after having invoked the callback. (Passing a non-function value should result in returning that value even in the case of a mere conditional situations; it makes writing tests much easier that purport to exercise exactly that code path.)&lt;br /&gt;&lt;br /&gt;Despite being an exceptional situation (i.e. just continuing is usually impossible), we might still want to provide the caller the ability to proceed further by using Common Lisp's restart system. E.g. to allow a caller to just plainly continue and hang on waiting on the thread forever, we could have written:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;pre&gt;(if (functionp on-timeout)&lt;br /&gt;    (with-simple-restart (continue "Ignore timeout, hang on thread ~S." thread)&lt;br /&gt;      (return-from join-thread (funcall on-timeout &amp;lt;timeout condition&amp;gt;)))&lt;br /&gt;    (return-from join-thread on-timeout))&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;And we can already express a variety of different behaviours. To simply return &lt;span style="font-family:courier new;"&gt;:TIMEOUT&lt;/span&gt; when the timeout expires, we call &lt;span style="font-family:courier new;"&gt;JOIN-THREAD&lt;/span&gt; as follows:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;pre&gt;(join-thread &amp;lt;thread&amp;gt; ... :on-timeout ':timeout)&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;To signal an error on timeout, we call &lt;span style="font-family:courier new;"&gt;JOIN-THREAD&lt;/span&gt; as follows:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;pre&gt;(join-thread &amp;lt;thread&amp;gt; ... :on-timeout #'error) ; this should probably be the default&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;To turn the timeout into a mere warning, it is unfortunately not enough to simply pass &lt;span style="font-family:courier new;"&gt;#'WARN&lt;/span&gt; because &lt;span style="font-family:courier new;"&gt;WARN&lt;/span&gt; is specified to require a condition of subtype Warning.&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;pre&gt;(join-thread &amp;lt;thread&amp;gt; ... :on-timeout #'warn)  ; caveat: won't do&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;This restriction on &lt;span style="font-family:courier new;"&gt;WARN&lt;/span&gt; is superfluous but it's there, and we can always define our own variant:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;pre&gt;(declaim (inline alert))&lt;br /&gt;(defun alert (datum &amp;amp;rest args)&lt;br /&gt;  (let ((condition (apply #'coerce-to-condition datum args)))&lt;br /&gt;    (if (not (typep condition 'warning))&lt;br /&gt;        (cl:warn "~A" condition)&lt;br /&gt;        (cl:warn condition))))&lt;br /&gt;&lt;br /&gt;(join-thread &amp;lt;thread&amp;gt; ... :on-timeout #'alert)&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;Notice that the above call will display a message on timeout and return &lt;span style="font-family:courier new;"&gt;NIL&lt;/span&gt;. To display a message (or log it using some arbitrary log mechanism) and go on waiting, we could use the following functions:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;pre&gt;(declaim (inline invoke-and-continue))&lt;br /&gt;(defun invoke-and-continue (function condition)&lt;br /&gt;  (funcall function condition)&lt;br /&gt;  (continue condition)&lt;br /&gt;  (error "BUG: could not find a CONTINUE restart for condition ~S." condition))&lt;br /&gt;&lt;br /&gt;(defun alert+continue (condition)&lt;br /&gt;  (invoke-and-continue #'alert condition))&lt;br /&gt;&lt;br /&gt;(defun logg+continue (condition)&lt;br /&gt;  (invoke-and-continue #'logg condition))&lt;br /&gt;&lt;br /&gt;(join-thread &amp;lt;thread&amp;gt; ... :on-timeout #'alert+continue)&lt;br /&gt;(join-thread &amp;lt;thread&amp;gt; ... :on-timeout #'logg+continue)&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;Another example would be &lt;span style="font-family:courier new;"&gt;ALERT+RESIGNAL&lt;/span&gt; which will resignal the condition. This can be useful during debugging when you want to display a condition's underlying message stemming from a certain function call that a handler higher up might catch -- just add &lt;span style="font-family:courier new;"&gt;:ON-TIMEOUT #'ALERT+RESIGNAL&lt;/span&gt; to the call.&lt;br /&gt;&lt;br /&gt;If desired, one could add&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;pre&gt;(defvar *timeout-behaviour* #'error)&lt;br /&gt;(defvar *failure-behaviour* #'error)&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;and make &lt;span style="font-family:courier new;"&gt;:ON-TIMEOUT&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;:ON-FAILURE&lt;/span&gt; default to these variables.&lt;br /&gt;&lt;br /&gt;So what's nice about this pattern?&lt;br /&gt;&lt;br /&gt;After all the CL equivalent would be&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;pre&gt;(handler-bind ((timeout #'alert+continue))&lt;br /&gt;   (join-thread &amp;lt;thread&amp;gt; ...))&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;or&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;pre&gt;(handler-case (join-thread &amp;lt;thread&amp;gt; ...)&lt;br /&gt;   (timeout () :timeout))&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;which may not be as concise but surely is not overly verbose either.&lt;br /&gt;&lt;br /&gt;A couple of things.&lt;br /&gt;&lt;br /&gt;For one, it's essentially Continuation Passing Style for exceptional situations which can be exactly what you want occasionally. Also the return-a-value case does not involve signaling a condition or an extra function call - which can make a difference. Likewise, handling an exceptional situation does not involve a non-local exit; just a function call and a local exit.&lt;br /&gt;&lt;br /&gt;And another thing, it serves as a window of opportunity to document the exceptional situations in the function's docstring, and of course, it helps remembering these situations during automatic lambda list display.&lt;br /&gt;&lt;br /&gt;And it's easier to change between different behaviours as it does not require changing a &lt;span style="font-family:courier new;"&gt;HANDLER-BIND&lt;/span&gt; to a &lt;span style="font-family:courier new;"&gt;HANDLER-CASE&lt;/span&gt; or vice versa, or having to add a &lt;span style="font-family:courier new;"&gt;BLOCK&lt;/span&gt; for explicit transfer of control out of a handler.&lt;br /&gt;&lt;br /&gt;And, as mentioned before, the conciseness of the return-a-value case is very handy when writing tests.&lt;br /&gt;&lt;br /&gt;It also makes code read more like prose. (He said, handwavingly&lt;span style="font-family:courier new;"&gt;^W&lt;/span&gt;sternly.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8255220546902369433-3075498147379281042?l=trittweiler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trittweiler.blogspot.com/feeds/3075498147379281042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8255220546902369433&amp;postID=3075498147379281042' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/3075498147379281042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/3075498147379281042'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/2011/12/conditional-situations-function-api.html' title='A Conditional Situations Function API Pattern'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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-8255220546902369433.post-1454102886281374313</id><published>2011-03-27T20:20:00.004+02:00</published><updated>2011-03-27T20:41:11.402+02:00</updated><title type='text'>Use case for Restart-Bind</title><content type='html'>It's always a good day when you find a perfect use case for one Common&lt;br /&gt;Lisp's less used operators. Lately I had the pleasure to find a good&lt;br /&gt;opportunity for &lt;span style="font-family:courier new;"&gt;RESTART-BIND&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I've written a network simulator in a couple of  hundreds lines of&lt;br /&gt;Common Lisp (not counting our basic protocol and  miscanellous stack)&lt;br /&gt;to emulate mobile IP networks. We use it to review that our &lt;a href="http://teclo.net/products/sambal/"&gt;mobile&lt;br /&gt;broadband accelerator&lt;/a&gt; is behaving the way we want it to behave. We&lt;br /&gt;also use it in a complete virtual setup using UML instances for our&lt;br /&gt;test suite as well as for the lab in our office.&lt;br /&gt;&lt;br /&gt;For determinism  purposes I wanted to be able to reseed the&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;*RANDOM-STATE*&lt;/span&gt; to its initial value by some means. And it turned out&lt;br /&gt;that &lt;span style="font-family:courier new;"&gt;RESTART-BIND&lt;/span&gt; is just the right thing for that job:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;&lt;pre&gt;(defun simulator (... &amp;amp;key (seed #xDEADBEEF) ...)&lt;br /&gt; (let ((*random-state* (sb-ext:seed-random-state seed)))&lt;br /&gt;   (restart-bind&lt;br /&gt;       ((reseed #'(lambda ()&lt;br /&gt;                    (setf *random-state* (sb-ext:seed-random-state seed)))&lt;br /&gt;         :report-function&lt;br /&gt;           (formatter "Reseed *RANDOM-STATE* with initial :SEED value.")))&lt;br /&gt;     ...)))&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/blockquote&gt;You can reseed manually by interrupting the network simulator and&lt;br /&gt;using the &lt;span style="font-family:courier new;"&gt;RESEED&lt;/span&gt; restart, or you can reseed programmatically (e.g.&lt;br /&gt;periodically after a certain time of inactivity) by&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(invoke-restart 'reseed)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Can you feel that warm and fuzzy feeling? Just the right thing. :-)&lt;br /&gt;&lt;br /&gt;PS.&lt;br /&gt;&lt;br /&gt;Other fun note about restarts and &lt;span style="font-family:courier new;"&gt;RESTART-BIND&lt;/span&gt;. If you squint your&lt;br /&gt;eyes, you will discover that restarts are essentially nothing else&lt;br /&gt;than dynamically scoped local functions, and &lt;span style="font-family:courier new;"&gt;RESTART-BIND&lt;/span&gt; is basically&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;DYNAMIC-FLET&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8255220546902369433-1454102886281374313?l=trittweiler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trittweiler.blogspot.com/feeds/1454102886281374313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8255220546902369433&amp;postID=1454102886281374313' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/1454102886281374313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/1454102886281374313'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/2011/03/use-case-for-restart-bind.html' title='Use case for Restart-Bind'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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-8255220546902369433.post-7004647767540924302</id><published>2010-08-08T14:15:00.004+02:00</published><updated>2010-08-08T14:33:33.134+02:00</updated><title type='text'>What I'm up to lately</title><content type='html'>Long time no update.&lt;br /&gt;&lt;br /&gt;For the last few months I've become rather silent not only on the planet.lisp blogosphere but pretty much on the whole Common Lisp open source world. The reason for that is that since the beginning of the year I've become proud part of a hot telecom startup. Right after having had a big rush to finish my &lt;a href="http://common-lisp.net/%7Etrittweiler/bachelor-thesis.pdf"&gt;bachelor thesis&lt;/a&gt; in one go.&lt;br /&gt;&lt;br /&gt;I've spent the last three months hacking in Malaysia, mostly in Kuala Lumpur, though sugared with occasional visits to tropical islands to keep sanity above a reasonable threshold. I now just arrived on the West coast of Sweden (reasonably close by to Gothenborg) where we're going to spend the next month at as we're told August to be lovely around there.&lt;br /&gt;&lt;br /&gt;You bet what we're hacking in. Yes, that's right, we're doing funky TCP/IP related optimization and analysis in that dead, slow language. And I can tell you it's marvellous! It's a whole different experience if you can just make use of the language without being constrained like you usually are when developing open source libraries. We don't have to try to keep the number of dependencies small. We don't have to care about package name collisions. For example, we have a package named &lt;span style="font-family:courier new;"&gt;FMT&lt;/span&gt; containing functions to be used in format strings via &lt;span style="font-family:courier new;"&gt;~/FMT:FOO/&lt;/span&gt;. Common Lisp is definitively a very nice language for actual product development. And it shows that is has been used for that while it was designed.&lt;br /&gt;&lt;br /&gt;Of course, there's more that makes my time so incredibly marvellous: having pleasure to work with bright and, I think, famous guys, like that &lt;a href="http://fresh.homeunix.net/%7Eluke/misc/portugal.jpg"&gt;pseudo-german&lt;/a&gt; hacker poster boy &lt;span style="font-weight: bold;"&gt;Luke Gorrie&lt;/span&gt;, the omniscient &lt;span style="font-weight: bold;"&gt;Stelian Ionescu&lt;/span&gt;, homeless dude &lt;span style="font-weight: bold;"&gt;Ties Stuij&lt;/span&gt; of &lt;a href="http://stix.to/"&gt;stix.to&lt;/a&gt; fame, the Erlang celebrity &lt;span style="font-weight: bold;"&gt;Sean Hinde&lt;/span&gt;, business genius &lt;span style="font-weight: bold;"&gt;Jane Walerud&lt;/span&gt;, and &lt;a href="http://www.flickr.com/photos/klaus-harbo/452975484/"&gt;That Clever Statistics Guy&lt;/a&gt;. Also seeing different parts of the world, meeting kind people of different cultures, and developing sellable products and thus having customers to care about.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/tiezemans/4822354771/#/photos/tiezemans/4822354771/lightbox/"&gt;Fun. &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Lots of it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8255220546902369433-7004647767540924302?l=trittweiler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trittweiler.blogspot.com/feeds/7004647767540924302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8255220546902369433&amp;postID=7004647767540924302' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/7004647767540924302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/7004647767540924302'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/2010/08/what-im-up-to-lately.html' title='What I&apos;m up to lately'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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-8255220546902369433.post-1097870103385730766</id><published>2010-03-06T10:54:00.003+01:00</published><updated>2010-03-06T11:12:58.437+01:00</updated><title type='text'>Slime tidbits (2010-03-06): Slime &amp; ECL</title><content type='html'>Together with Juan Jose Garcia-Ripoll, I worked on improving the integration of ECL into Slime.&lt;br /&gt;&lt;br /&gt;He did a tremendous job on the ECL side adding all the stuff that's needed for a well-working swank backend,  so if you're going to try out ECL with Slime, and are pleasantly surprised, please direct most of the gratitude towards him.&lt;br /&gt;&lt;br /&gt;I threw out backwards compatibility, and you really have to get the &lt;a href="http://sourceforge.net/news/?group_id=30035&amp;amp;id=283573"&gt;10.3.1 release&lt;/a&gt; otherwise the CVS of Slime will refuse to compile. There's no point in artificially maintaining backwards compatibility for something which barely worked.&lt;br /&gt;&lt;br /&gt;Most noteworthy is the fact that you can now &lt;span style="font-family:courier new;"&gt;M-.&lt;/span&gt; all the way down, that is not just into the Lisp source base of ECL, but also into the C source base. And because it's based on &lt;span style="font-family:courier new;"&gt;TAGS&lt;/span&gt; file, &lt;span style="font-family:courier new;"&gt;M-.&lt;/span&gt; (and &lt;span style="font-family:courier new;"&gt;M-*&lt;/span&gt;) will continue to work once in a &lt;span style="font-family:courier new;"&gt;.c&lt;/span&gt; file. &lt;a href="http://common-lisp.net/%7Etrittweiler/tmp/slime-ecl-mdot-into-c-source.gif"&gt;For illustration, I created an animated screenshot.&lt;/a&gt; (Blogspot seems to convert uploaded images into the PNG format which is the reason that I have to externally link to animated gifs rather than include them into by blog posting proper.)&lt;br /&gt;&lt;br /&gt;There's of course still stuff to do:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;storing arglist information for user-written functions&lt;/li&gt;&lt;li&gt;storing source-location information for each method of a gf&lt;br /&gt;&lt;/li&gt;&lt;li&gt;introspection into C objects&lt;/li&gt;&lt;/ul&gt;Especially the last thing would be rather cool. And while I think the first two items are on Juanjo's agenda, the last item needs some brave hero looking for fame and glory. In case you want to volunteer, drop a mail to the ECL mailing list!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8255220546902369433-1097870103385730766?l=trittweiler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trittweiler.blogspot.com/feeds/1097870103385730766/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8255220546902369433&amp;postID=1097870103385730766' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/1097870103385730766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/1097870103385730766'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/2010/03/slime-tidbits-2010-03-06-slime-ecl.html' title='Slime tidbits (2010-03-06): Slime &amp; ECL'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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-8255220546902369433.post-3162056663378999945</id><published>2010-03-05T12:20:00.012+01:00</published><updated>2010-03-05T16:56:52.250+01:00</updated><title type='text'>Slime tidbits (2010-03-05)</title><content type='html'>In December 2009, Stas Boukarev and myself added some really cool stuff to the slime-asdf contrib, and while I've always wanted to blog about it, I just haven't come around doing so.&lt;br /&gt;&lt;ul&gt;&lt;li&gt; &lt;span style="font-family:courier new;"&gt;M-x slime-load-system&lt;/span&gt; (&lt;span style="font-family:courier new;"&gt;,load-system&lt;/span&gt;): Compile and load an ASDF system; that command currently hooks into the Slime compilation-notes machinery, so compilation notes, warnings, etc. will be collected and will end up in the &lt;span style="font-family:courier new;"&gt;*SLIME Compilation*&lt;/span&gt; buffer. This command has always been there, I just mention it for sake of completeness.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;M-x slime-open-system&lt;/span&gt; (&lt;span style="font-family:courier new;"&gt;,open-system&lt;/span&gt;): Open all the files specified in the system.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;M-x slime-isearch-system&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;M-x slime-rgrep-system&lt;/span&gt;: Run the command isearch and rgrep respectively on all the files specified in a system. That is particularly useful if &lt;span style="font-family:courier new;"&gt;slime-edit-definitions&lt;/span&gt; (&lt;span style="font-family:courier new;"&gt;M-.&lt;/span&gt;) and &lt;span style="font-family:courier new;"&gt;slime-edit-uses&lt;/span&gt; (&lt;span style="font-family:courier new;"&gt;M-?&lt;/span&gt;) won't do.&lt;br /&gt;&lt;br /&gt;In case of &lt;span style="font-family:courier new;"&gt;slime-rgrep-system&lt;/span&gt;, the commands &lt;span style="font-family:courier new;"&gt;next-error&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;previous-error&lt;/span&gt; will jump through the matches in the &lt;span style="font-family:courier new;"&gt;*grep*&lt;/span&gt; buffer. I bound those commands to &lt;span style="font-family:courier new;"&gt;F11&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;F12&lt;/span&gt;, though by default they're also bound to &lt;span style="font-family:courier new;"&gt;M-g p&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;M-g n&lt;/span&gt; (also &lt;span style="font-family:courier new;"&gt;C-x `&lt;/span&gt;).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;M-x slime-query-replace-system&lt;/span&gt;: Poor man's refactoring tool; run &lt;span style="font-family:courier new;"&gt;query-replace&lt;/span&gt; on all the specified files in a system. See this &lt;a href="http://common-lisp.net/%7Etrittweiler/tmp/slime-query-replace-system.gif"&gt;animated screenshot&lt;/a&gt; for an exemplary run. (Animated gif was generated on behalf of Zach Beane's &lt;a href="http://www.xach.com/lisp/skippy/"&gt;Skippy&lt;/a&gt; library!)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;M-x slime-query-replace-system-and-dependents&lt;/span&gt;: Like the former function, but also run &lt;span style="font-family:courier new;"&gt;query-replace&lt;/span&gt; on all the files of all systems depending on the user-queried system.&lt;/li&gt;&lt;/ul&gt;The latter two functions are really useful if you're past the initial state of something -- your system already grew to multiple files -- but still away from finishing and so you often want to rename identifier and slightly change APIs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8255220546902369433-3162056663378999945?l=trittweiler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trittweiler.blogspot.com/feeds/3162056663378999945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8255220546902369433&amp;postID=3162056663378999945' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/3162056663378999945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/3162056663378999945'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/2010/03/slime-tidbits-2010-03-05.html' title='Slime tidbits (2010-03-05)'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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-8255220546902369433.post-7651458065322758190</id><published>2009-11-12T18:19:00.003+01:00</published><updated>2009-11-12T18:26:33.467+01:00</updated><title type='text'>Munich Lisp Talk, 10th November 2009</title><content type='html'>Last Tuesday, I gave short &lt;a href="http://common-lisp.net/%7Etrittweiler/talks/sequence-iterators-2009.pdf"&gt;talk&lt;/a&gt; about a library I have been writing on: &lt;a href="http://common-lisp.net/project/sequence-iterators/"&gt;&lt;span style="font-weight: bold;"&gt;Sequence Iterators&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;The library is perhaps a bit misnamed because at the moment, it's really a convenience layer on top of iterators. It's supposed to provide tools to make writing functions that operate on sequences convenient, and yet not blatantly inefficient.&lt;br /&gt;&lt;br /&gt;I'd be very much interested in feedback regarding rough corners if you find a case to apply the library. If you want to give it a shot, there's a file "&lt;span style="font-family:courier new;"&gt;more-sequence-functions.lisp&lt;/span&gt;" which contain prototypes of useful sequence function for which I haven't yet had the time to write them.&lt;br /&gt;&lt;br /&gt;Please notice that the library is still work in progress.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8255220546902369433-7651458065322758190?l=trittweiler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trittweiler.blogspot.com/feeds/7651458065322758190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8255220546902369433&amp;postID=7651458065322758190' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/7651458065322758190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/7651458065322758190'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/2009/11/munich-lisp-talk-10th-november-2009.html' title='Munich Lisp Talk, 10th November 2009'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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-8255220546902369433.post-6343824420997746758</id><published>2009-10-31T19:10:00.002+01:00</published><updated>2009-10-31T19:13:57.862+01:00</updated><title type='text'>Looking for a Lisp project?</title><content type='html'>You're an intermediate to the Common Lisp language and are desperately looking for a practical project to try your Lisp skills at?  You're longing for fame and glory?&lt;br /&gt;&lt;br /&gt;If that's the case, I have something for you:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;  write a library to access the &lt;a href="https://help.launchpad.net/API"&gt;Web API&lt;/a&gt; provided by &lt;a href="https://launchpad.net/"&gt;launchpad&lt;/a&gt;,&lt;/li&gt;&lt;li&gt;afterwards, using that library, make it possible to conveniently add and update tickets in a (not yet existing) bug tracker for &lt;a href="http://common-lisp.net/project/clbuild/"&gt;clbuild&lt;/a&gt;. The tickets are supposed to add/update repository urls.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Sounds interesting? If so, drop me a mail.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8255220546902369433-6343824420997746758?l=trittweiler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trittweiler.blogspot.com/feeds/6343824420997746758/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8255220546902369433&amp;postID=6343824420997746758' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/6343824420997746758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/6343824420997746758'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/2009/10/looking-for-lisp-project.html' title='Looking for a Lisp project?'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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-8255220546902369433.post-6832175413874876608</id><published>2009-10-24T13:34:00.004+02:00</published><updated>2009-10-24T14:02:58.861+02:00</updated><title type='text'>SLIME tidbits (2009-10-24)</title><content type='html'>&lt;ul&gt;&lt;li&gt;To quickly find out the "revision" of your slime checkout, you can now use &lt;span style="font-family:courier new;"&gt;M-x slime-changelog-date&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Sometimes, e.g. due to character encoding confusion, the Emacs side of Slime can be brought to a dysfunctional state. &lt;span style="font-family:courier new;"&gt;M-x slime-reset&lt;/span&gt; will hopefully get you back to business.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Restarts as shown in the Slime Debugger are now numbered reversely. The advantage is that often-existing restarts will now very likely get associated with the same number as you can see on the screenshot below. (Remember that the numeric keys are mapped to invoke the  corresponding restarts.) This may mean that you have to invalidate some of your muscle memory -- notice that often-needed restarts do come with a static,  symbolic mapping, i.e. &lt;span style="font-family:courier new;"&gt;q&lt;/span&gt; to abort to toplevel, &lt;span style="font-family:courier new;"&gt;a&lt;/span&gt; to invoke the most recently established  &lt;span style="font-family:courier new;"&gt;abort &lt;/span&gt;restart, and &lt;span style="font-family:courier new;"&gt;c&lt;/span&gt; to invoke a &lt;span style="font-family:courier new;"&gt;continue&lt;/span&gt; restart.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XshvghKxGuU/SuLsekF87II/AAAAAAAAACA/AK-XbtOZohw/s1600-h/slime-restart-numbering.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 161px; height: 200px;" src="http://3.bp.blogspot.com/_XshvghKxGuU/SuLsekF87II/AAAAAAAAACA/AK-XbtOZohw/s200/slime-restart-numbering.png" alt="" id="BLOGGER_PHOTO_ID_5396135313372146818" border="0" /&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;Commands which open an Xref buffer (in particular &lt;span style="font-family:courier new;"&gt;M-?&lt;/span&gt;) do not select that buffer anymore. Instead, you're now supposed to use the commands &lt;span style="font-family:courier new;"&gt;C-M-.&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;C-M-,&lt;/span&gt; to cycle through the entries in the Xref buffer from within your source buffer. That's more ergonomic from my experience. The intended key sequence is: &lt;span style="font-family:courier new;"&gt;M-?&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;C-M-.&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;C-x 1&lt;/span&gt; frob &lt;span style="font-family:courier new;"&gt;C-M-.&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;C-x 1&lt;/span&gt; frob etc.&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_XshvghKxGuU/SuLslI3_1yI/AAAAAAAAACI/opQtTtIHu6U/s1600-h/slime-c-m-dot.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 174px; height: 200px;" src="http://4.bp.blogspot.com/_XshvghKxGuU/SuLslI3_1yI/AAAAAAAAACI/opQtTtIHu6U/s200/slime-c-m-dot.png" alt="" id="BLOGGER_PHOTO_ID_5396135426324944674" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XshvghKxGuU/SuLsplosJuI/AAAAAAAAACQ/dHnHaw7QM7U/s1600-h/slime-c-m-comma.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 174px; height: 200px;" src="http://3.bp.blogspot.com/_XshvghKxGuU/SuLsplosJuI/AAAAAAAAACQ/dHnHaw7QM7U/s200/slime-c-m-comma.png" alt="" id="BLOGGER_PHOTO_ID_5396135502764844770" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8255220546902369433-6832175413874876608?l=trittweiler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trittweiler.blogspot.com/feeds/6832175413874876608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8255220546902369433&amp;postID=6832175413874876608' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/6832175413874876608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/6832175413874876608'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/2009/10/slime-tidbits-2009-10-24.html' title='SLIME tidbits (2009-10-24)'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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/_XshvghKxGuU/SuLsekF87II/AAAAAAAAACA/AK-XbtOZohw/s72-c/slime-restart-numbering.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8255220546902369433.post-6008804405525759344</id><published>2009-10-21T16:53:00.005+02:00</published><updated>2009-10-21T18:10:02.119+02:00</updated><title type='text'>SLIME tidbits (2009-10-21)</title><content type='html'>Stas Boukarev just comitted two useful new commands to CVS: &lt;span style="font-family:courier new;"&gt;slime-open-system&lt;/span&gt;, and &lt;span style="font-family:courier new;"&gt;slime-browse-system&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_XshvghKxGuU/St8x1y0BIpI/AAAAAAAAABk/3aSOyDj6rRg/s1600-h/slime-open-system.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 168px; height: 200px;" src="http://2.bp.blogspot.com/_XshvghKxGuU/St8x1y0BIpI/AAAAAAAAABk/3aSOyDj6rRg/s200/slime-open-system.png" alt="" id="BLOGGER_PHOTO_ID_5395085678855922322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;As you can see on the above screenshot, &lt;span style="font-family:courier new;"&gt;M-x slime-open-system&lt;/span&gt;, or alternatively the REPL shortcut &lt;span style="font-family:courier new;"&gt;,open-system&lt;/span&gt;, will open all the files listed in a system's &lt;span style="font-family:courier new;"&gt;.asd&lt;/span&gt; file. Optionally, it'll also load the system if it's not already loaded.&lt;br /&gt;&lt;br /&gt;And on the screenshot below, you can see &lt;span style="font-family:courier new;"&gt;M-x slime-browse-system&lt;/span&gt; (or &lt;span style="font-family:courier new;"&gt;,browse-system&lt;/span&gt; at the REPL, respectively) which will open the directory a system's &lt;span style="font-family:courier new;"&gt;.asd&lt;/span&gt; file lays in using dired.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XshvghKxGuU/St8yFgsfABI/AAAAAAAAABs/gfQYOW90kPY/s1600-h/slime-browse-system.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 168px; height: 200px;" src="http://3.bp.blogspot.com/_XshvghKxGuU/St8yFgsfABI/AAAAAAAAABs/gfQYOW90kPY/s200/slime-browse-system.png" alt="" id="BLOGGER_PHOTO_ID_5395085948870393874" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8255220546902369433-6008804405525759344?l=trittweiler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trittweiler.blogspot.com/feeds/6008804405525759344/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8255220546902369433&amp;postID=6008804405525759344' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/6008804405525759344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/6008804405525759344'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/2009/10/slime-tidbits-2009-10-21.html' title='SLIME tidbits (2009-10-21)'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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/_XshvghKxGuU/St8x1y0BIpI/AAAAAAAAABk/3aSOyDj6rRg/s72-c/slime-open-system.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8255220546902369433.post-976552970288353895</id><published>2009-10-18T19:49:00.002+02:00</published><updated>2009-10-18T20:19:05.960+02:00</updated><title type='text'>#0AFFFF</title><content type='html'>Common Lisp is a wonderfully complex language, and probably no matter how long you've been studying it, you'll always find a thing you didn't know before.&lt;br /&gt;&lt;br /&gt;What, for example, do you think &lt;span style="font-family:courier new;"&gt;#0AFFFF&lt;/span&gt; represents?&lt;br /&gt;&lt;br /&gt;Perhaps you're thinking of the color &lt;span style="color: rgb(10, 255, 255);"&gt;turquoise&lt;/span&gt; represented as a hexadecimal RGB value?&lt;br /&gt;&lt;br /&gt;Well, witness for yourself:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;CL-USER&gt; (setf *read-base* 16)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;16&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CL-USER&gt; #0AFFFF&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;#0A65535&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;(Bonus point if you know how to restore &lt;span style="font-family:courier new;"&gt;*READ-BASE*&lt;/span&gt; to a value of 10 again.)&lt;br /&gt;&lt;br /&gt;Still no idea?&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;CL-USER&gt; (type-of *)&lt;br /&gt;(SIMPLE-ARRAY T NIL)&lt;/blockquote&gt;Right, &lt;span style="font-family:courier new;"&gt;#0AFOO&lt;/span&gt; is literal syntax for &lt;span style="font-family:courier new;"&gt;(make-array nil :initial-element 'foo)&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;And, yeah, even though Common Lisp is surely a complex beast, it's at the same time very well engineered. Witness thus:&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;CL-USER&gt; (defvar *a*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(make-array nil :initial-element 41))&lt;br /&gt;*A*&lt;br /&gt;CL-USER&gt; (incf (aref *a*))&lt;br /&gt;42&lt;br /&gt;CL-USER&gt; *a*&lt;br /&gt;#0A42&lt;br /&gt;&lt;/blockquote&gt;And if you want to see really quirky stuff, take a look at &lt;a href="http://www.advogato.org/person/crhodes/diary.html?start=45"&gt;strings with an element-type of nil&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8255220546902369433-976552970288353895?l=trittweiler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trittweiler.blogspot.com/feeds/976552970288353895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8255220546902369433&amp;postID=976552970288353895' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/976552970288353895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/976552970288353895'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/2009/10/0affff.html' title='#0AFFFF'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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-8255220546902369433.post-9036457204094348019</id><published>2009-10-10T12:45:00.003+02:00</published><updated>2009-10-10T12:52:08.904+02:00</updated><title type='text'>ANN: Named-Readtables 0.9</title><content type='html'>The &lt;a href="http://common-lisp.net/project/editor-hints/"&gt;editor-hints&lt;/a&gt; project is pleased to announce &lt;span style="font-weight: bold;"&gt;Named-Readtables&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;What are Named-Readtables?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It's a library a) to help you to organize your readtable hacks,  and b) to help your development environment to deal with these hacks. For detailed information see &lt;a href="http://common-lisp.net/project/editor-hints/darcs/named-readtables/doc/named-readtables.html#what_are_named-readtables?"&gt;What are Named-Readtables?&lt;/a&gt; in the documentation.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Foretaste&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;DEFREADTABLE&lt;/span&gt; (analogously to &lt;span style="font-family:courier new;"&gt;DEFPACKAGE&lt;/span&gt;) can be used to specify the content of a readtable.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;IN-READTABLE&lt;/span&gt; (analogously to &lt;span style="font-family:courier new;"&gt;IN-PACKAGE&lt;/span&gt;) can be used to specify what readtable should be used while compiling a &lt;span style="font-family:courier new;"&gt;.lisp&lt;/span&gt; file.&lt;br /&gt;&lt;br /&gt;Named-Readtables has an API very much inspired by the existing API of packages. But see &lt;a href="http://common-lisp.net/project/editor-hints/darcs/named-readtables/doc/named-readtables.html#important_api_idiosyncrasies"&gt;Important API idiosyncrasies&lt;/a&gt; in the documentation.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Documentation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; See &lt;a href="http://common-lisp.net/project/editor-hints/darcs/named-readtables/doc/named-readtables.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Download&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span style="font-family:courier new;"&gt;darcs get http://common-lisp.net/project/editor-hints/darcs/named-readtables/&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Release Notes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The release was tagged as 0.9 even though it's actually pretty much a 1.0. Experience tells that no matter how much you try to polish a piece of software, there will be two to three issues. The 1.0 will wait for these issues be reported.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Implementations&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; The library has been tested on SBCL, CCL, Clisp, ABCL (head), ECL, Allegro 8.1, Lispworks 5.1.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8255220546902369433-9036457204094348019?l=trittweiler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trittweiler.blogspot.com/feeds/9036457204094348019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8255220546902369433&amp;postID=9036457204094348019' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/9036457204094348019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/9036457204094348019'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/2009/10/ann-named-readtables-09.html' title='ANN: Named-Readtables 0.9'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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-8255220546902369433.post-8346016846623255631</id><published>2009-09-21T21:59:00.003+02:00</published><updated>2009-09-21T22:15:28.115+02:00</updated><title type='text'>Slime-sprof</title><content type='html'>Stas Boukarev polished up &lt;a href="http://jsnell.iki.fi/"&gt;Juho Snellman&lt;/a&gt;'s slime patch which nicely integrates &lt;a href="http://www.sbcl.org/manual/Statistical-Profiler.html#Statistical-Profiler"&gt;SBCL's statistical profiler&lt;/a&gt; into Slime, turned it into a proper contrib (&lt;span style="font-family: courier new; font-weight: bold;"&gt;slime-sprof&lt;/span&gt;) and committed it to CVS. The patch dates back as far as &lt;a href="http://jsnell.iki.fi/blog/archive/2005-08-29.html"&gt;2005&lt;/a&gt;, with an update in &lt;a href="http://jsnell.iki.fi/blog/archive/2006-05-14-statistical-allocation-profiler-for-sbcl.html"&gt;2006&lt;/a&gt;, and I'm glad that it eventually turned up into Slime itself.&lt;br /&gt;&lt;br /&gt;Here's the link to the documentation &lt;a href="http://common-lisp.net/%7Esboukarev/slime/slime_002dsprof.html"&gt;explaining how to use it&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Thanks Juho and Stas!&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Up-to-date screenshot by Stas:&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_XshvghKxGuU/SrfdGTfLckI/AAAAAAAAABM/4V6WwSJpc2Y/s1600-h/stassats-sprof.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 120px;" src="http://2.bp.blogspot.com/_XshvghKxGuU/SrfdGTfLckI/AAAAAAAAABM/4V6WwSJpc2Y/s200/stassats-sprof.png" alt="" id="BLOGGER_PHOTO_ID_5384014979924718146" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Earlier screenshot by Juho:&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.iki.fi/jsnell/blog/stc/slime-sprof-thumb.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 338px; height: 430px;" src="http://www.iki.fi/jsnell/blog/stc/slime-sprof-thumb.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8255220546902369433-8346016846623255631?l=trittweiler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trittweiler.blogspot.com/feeds/8346016846623255631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8255220546902369433&amp;postID=8346016846623255631' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/8346016846623255631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/8346016846623255631'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/2009/09/slime-sprof.html' title='Slime-sprof'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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/_XshvghKxGuU/SrfdGTfLckI/AAAAAAAAABM/4V6WwSJpc2Y/s72-c/stassats-sprof.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8255220546902369433.post-9184760301474851979</id><published>2009-09-20T16:31:00.005+02:00</published><updated>2009-09-20T17:00:14.853+02:00</updated><title type='text'>SLIME tidbits (2009-09-20)</title><content type='html'>Today I'll write about a very recent new addition: &lt;span style="font-family:courier new;"&gt;slime-edit-uses&lt;/span&gt; bound to the keys &lt;span style="font-weight: bold;font-family:courier new;" &gt;M-?&lt;/span&gt; and &lt;span style="font-weight: bold;font-family:courier new;" &gt;M-_&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;It is the logical counterpart to &lt;span style="font-family:courier new;"&gt;slime-e&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;dit-de&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;finition&lt;/span&gt; (&lt;span style="font-family:courier new;"&gt;M-.&lt;/span&gt;) .&lt;br /&gt;&lt;br /&gt;Basically, it's nothing more than a wrapper around the already existing Xref commands (&lt;span style="font-family:courier new;"&gt;slime-who-ca&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;lls&lt;/span&gt;, etc.) but it's a pleasure to use because a) it's just one key binding which does all instead of a multitude of different special-purpose bindings, and b) it's an easy binding (&lt;span style="font-family:courier new;"&gt;M-?&lt;/span&gt; vs. &lt;span style="font-family:courier new;"&gt;C-c C-w KEY&lt;/span&gt;) and obvious as well (right next to M-. its counterpart.)&lt;br /&gt;&lt;br /&gt;What does it do? Well see for yourself:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;on functions, it'll show a list of all call sites.&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_XshvghKxGuU/SrZBgHrDZVI/AAAAAAAAAA0/03HjgrnSVhk/s1600-h/slime-M-_-calls.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 160px; height: 200px;" src="http://4.bp.blogspot.com/_XshvghKxGuU/SrZBgHrDZVI/AAAAAAAAAA0/03HjgrnSVhk/s200/slime-M-_-calls.png" alt="" id="BLOGGER_PHOTO_ID_5383562424639251794" border="0" /&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;on macros, it'll show a list of the sites the macro is expanded.&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_XshvghKxGuU/SrZB35j0LnI/AAAAAAAAAA8/gp4QV8eVu_M/s1600-h/slime-M-_-macroexpand.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 160px; height: 200px;" src="http://4.bp.blogspot.com/_XshvghKxGuU/SrZB35j0LnI/AAAAAAAAAA8/gp4QV8eVu_M/s200/slime-M-_-macroexpand.png" alt="" id="BLOGGER_PHOTO_ID_5383562833167658610" border="0" /&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;on special variables, it'll list all the places the variable is set, bound, or referenced.&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XshvghKxGuU/SrZCKfTlO5I/AAAAAAAAABE/DjEg4uOFpes/s1600-h/slime-M-_-binds.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 160px; height: 200px;" src="http://3.bp.blogspot.com/_XshvghKxGuU/SrZCKfTlO5I/AAAAAAAAABE/DjEg4uOFpes/s200/slime-M-_-binds.png" alt="" id="BLOGGER_PHOTO_ID_5383563152537762706" border="0" /&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;on classes, it'll show a list of methods that specialize on that class. &lt;span style="font-size:85%;"&gt;(no screenshot)&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Of course, the usual disclaimer applies: The quality of this feature highly depends on how much Xref information your implementation is able to store.&lt;br /&gt;&lt;br /&gt;Now, for me this begets the following question: How easy would it be to make SBCL collect Xref data during the build of itself?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8255220546902369433-9184760301474851979?l=trittweiler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trittweiler.blogspot.com/feeds/9184760301474851979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8255220546902369433&amp;postID=9184760301474851979' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/9184760301474851979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/9184760301474851979'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/2009/09/slime-tidbits-2009-09-20.html' title='SLIME tidbits (2009-09-20)'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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/_XshvghKxGuU/SrZBgHrDZVI/AAAAAAAAAA0/03HjgrnSVhk/s72-c/slime-M-_-calls.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8255220546902369433.post-463904527438680260</id><published>2009-09-05T19:38:00.002+02:00</published><updated>2009-09-05T19:47:34.515+02:00</updated><title type='text'>WANTED: trivial without-package-locks</title><content type='html'>Has anyone written a trivial wrapper definition for &lt;span style="font-family: courier new;"&gt;WITHOUT-PACKAGE-LOCKS&lt;/span&gt; ?&lt;br /&gt;&lt;br /&gt;"Trivial" as in &lt;a href="http://common-lisp.net/project/trivial-utf-8/"&gt;trivial-utf8&lt;/a&gt;, &lt;a href="http://common-lisp.net/project/trivial-backtrace/"&gt;trivial-backtrace&lt;/a&gt;,&lt;a href="http://www.cliki.net/trivial-garbage"&gt; trivial-garbage&lt;/a&gt;, &lt;a href="http://common-lisp.net/project/trivial-shell/"&gt;trivial-shell&lt;/a&gt;, &lt;a href="http://common-lisp.net/project/trivial-timeout/"&gt;trivial-timeout&lt;/a&gt;, et cetera perge perge.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8255220546902369433-463904527438680260?l=trittweiler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trittweiler.blogspot.com/feeds/463904527438680260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8255220546902369433&amp;postID=463904527438680260' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/463904527438680260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/463904527438680260'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/2009/09/wanted-trivial-without-package-locks.html' title='WANTED: trivial without-package-locks'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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-8255220546902369433.post-6204403226496550789</id><published>2009-07-25T17:34:00.003+02:00</published><updated>2009-07-25T17:56:41.748+02:00</updated><title type='text'>Common Lisp &amp; Vim</title><content type='html'>Nagging about how preposterous it is to be forced to learn Emacs, is no more.&lt;br /&gt;&lt;br /&gt;Frank Duncan has been working on &lt;a href="http://nekthuth.com/"&gt;Nekthuth&lt;/a&gt;, a Vim plugin for Common Lisp. While it's not completely prime time right now, it certainly looks very promising. Definitively, the most feature-full plugin I've seen so far.&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now if you're one of those few lost souls who just do not want to find absolution in the &lt;a href="http://www.dina.dk/%7Eabraham/religion/"&gt;Church of Emacs&lt;/a&gt;, take a look at it and give Frank a hand, or two.  For example, make it use Slime's SWANK-BACKEND, not the server, just the portability layer.&lt;br /&gt;&lt;br /&gt;Alternatives: &lt;a href="http://bitfauna.com/projects/cusp/"&gt;Cusp&lt;/a&gt;, a plugin for Eclipse. &lt;a href="http://phil.nullable.eu/"&gt;ABLE&lt;/a&gt;, a standalone text editor written in Common Lisp.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8255220546902369433-6204403226496550789?l=trittweiler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trittweiler.blogspot.com/feeds/6204403226496550789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8255220546902369433&amp;postID=6204403226496550789' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/6204403226496550789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/6204403226496550789'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/2009/07/common-lisp-vim.html' title='Common Lisp &amp; Vim'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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-8255220546902369433.post-2513328434153481477</id><published>2009-06-20T22:18:00.002+02:00</published><updated>2009-06-20T22:54:12.421+02:00</updated><title type='text'>Erik Naggum, RIP.</title><content type='html'>&lt;span style="font-family:courier new;"&gt;&lt;pre&gt;&lt;span style="font-size:100%;"&gt;It's sad but seems to be true: &lt;a href="http://www.open-voip.com/blogs/blog1/2009/06/20/erik-naggum-1965-2009-rip"&gt;Erik Naggum was found dead in his home&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Last September, I wrote him a mail to thank him for the wealth of postings&lt;br /&gt;he had contributed to comp.lang.lisp and for the impact they had on me.&lt;br /&gt;I now feel incredibly glad I did that as I had always postponed doing so&lt;br /&gt;for years.&lt;br /&gt;&lt;br /&gt;Following is his response.&lt;br /&gt;&lt;br /&gt;RIP, Erik. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;* Tobias C. Rittweiler (2008-09-19 00:37)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt; for a long time I've wanted to send an e-mail to express the&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt; gratitude I feel for the countless usenet postings that you have&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt; written in your comp.lang.lisp history. Now I finally came around&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt; doing so:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;It’s been quite a while since I posted my last article to c.l.l, but&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;very warm and welcome messages like yours still keep coming in at a&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;rate of about one a week. It amazes me.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt; Thank you for the time and energy you spent in writing so many&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt; sophisticated and thought-provocating articles. I never understood&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt; where you drew this massive amount of energy and the will to&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt; continue from, considering the feedback you received back at that&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt; time.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Even when I was posting at a high rate, I received more mail from&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;those who appreciated what I had posted. I needed that encouragement&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;and knowing that despite the increasing amount of insanity on the&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;newsgroup, lots of people were reading what I wrote with a positive&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;attitude. However, there are some people whose evil ways are truly&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;destructive, and those are the moralists and the punishers who are&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;utterly unable to produce anything good at all, but all the more&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;hell-bent on making others pay for such things as not living up to&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;their expectations, doing what they think is right, etc, and I drew a&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;considerable amount of energy from my life-long desire to rid the&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;planet of moralists and punishers. It may sound contradictory, but I&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;hold that the use of force and violence and the lesser evils of&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;moralizing and punishment should only be used to prevent any of them,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;never to seek any other goal: Telling a moralist that moralizing is&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;wrong, punishing those who punish others, using force and violence to&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;stop those who initiate the use of force and violence — you get the&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;picture — is the right thing to do. Unfortunately, this gets the&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;moralizers and punishers all worked up, and they prove that they&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;really are the psychopaths they only appeared to be when someone had&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;the gall to do something against /their/ desires. So even though my&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;general outlook on life went under-appreciated, namely that &lt;/span&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;if you&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;know what other people should have done in the past, you never have&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;any clue what you or anyone else ought to do in the future, and if you&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;are concerned with what you yourself ought to do in the future, you&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;generally leave other people alone to figure out what /they/ ought to do&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;in the future, too&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;, lots of people picked up on the positive message:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Exposing moralists and punishers for what they really are —&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;psychopaths — does a great service to any community who suffers from&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;their pernicious effects. Of course, if you are a horribly bad person&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;like that, you can only see others as reflections of yourself, and you&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;never understand why anyone would want to moralize against or punish&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;/you/, because part and parcel of being rabidly insane is never being&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;able to see yourself from the outside, and you think insane thoughts&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;like “How /dare/ anyone moralize against or punish /me/, when I‘m the sole&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;moral authority in the whole Universe and everyone, everywhere have a&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;moral duty to behave the way /I/ tell them!”. Or, in other words&lt;/span&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;, people&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;who partition the world population into “the good” and “the bad”&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;always make the mistake of believing that they fall into the “the&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;good” partition&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;, when they are actually among the very few that are&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;truly evil: No monumental evil act in the history of mankind has been&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;committed by anyone who thought of themselves as “evil” — on the&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;contrary, the worse the (objective) evil, the more the perpetrator was&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;completely convinced of the goodness of himself and of his&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;“purification”. So when the newsgroup became plagued by the evil kind&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;of moron that has nothing to contributed and no rewards for anyone&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;doing the right thing, but only harm and punishment for those who do&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;the wrong thing in their eyes, it was time to quit. Had I had even&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;more energy, I could have stayed, but I had ran out of steam fighting&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;false accusations, which is another one of those hallmarks of truly&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;evil people who think nothing of harming the innocent in their crusade&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;against the “evildoers”. It turns out, as any study of history will&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;show, that those accused by moralists and punishers are always&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;innocent. That’s why we need courts, so those who accuse are not the&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;ones to decide on the guilt and the punishment. Stupid people tend not&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;to grasp this fact, and only see courts as means of letting people&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;they “know” are guilty avoid punishment.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt; And I particularly mean your non-technical contributions. I read all&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt; those now already several years ago when I was sixteen if I'm&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt; remembering correctly. I recall how I was shocked at the tone you&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt; used, and the aggression you seemed to feel towards people, as I&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt; grew up in feel-good communities myself. [The postings] made me value&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt; technical expertise and competence over civil masquerade, and they&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt; revealed how the latter can sometimes even impair the communication&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt; for the former.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;Civility and politeness are extremely useful tools in communication&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;with people who are more wrong than right, but of very little use with&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;people who are vastly more right than wrong.&lt;/span&gt;&lt;span style="font-family: courier new;"&gt; This counter-intuitive&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;observation comes directly from the fact that we simply do not need&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;civil and polite ways of telling people that they are right about&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;something. So the people who have most to gain from civility and&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;politeness are people who know they are and intend to /stay/ wrong while&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;they force everybody else hold their tongues. That may have been a&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;very good way of building societies before /anyone/ was usually right&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;about anything. It is only in the twentieth century that a sizable&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;fraction of the population had any means to know whether they were in&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;the right or in the wrong to begin with. Before we invented the&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;concept of the real world, everybody lived their entire lives in their&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;own emotional world. After science and technology invented the concept&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;of the real world and of truth as correspondence between thoughts and&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;reality, the internal, private world turned out to be /untrue/ almost&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;all the time. These days, &lt;/span&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;I keep telling people that you only /really/&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;grow up and become a human being (as opposed to a mere animal) when&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;you realize that most of what you think and almost all you feel is&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;/wrong/&lt;/span&gt;&lt;span style="font-family: courier new;"&gt; and every person, however smart or highly esteemed by their&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;peers, is utterly and completely incapable of determining where they&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;are right among all this wrongness on their own. We tend to believe we&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;are mostly right, however, and only notice when the consequences of&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;our actions contradict our best expectations. Now, there are many&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;areas of life where there /is/ no way to sort right from wrong, and it&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;would certainly be impolite to point out an error that was only&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;relative to our own personal values, which is where the impoliteness&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;of moralizing comes in, but &lt;/span&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;modern man enjoys a growing number of&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;areas where we can unequivocally sort right from wrong, and then it is&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;impolite /not/ to point out an error&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;, for that means we let someone&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;believe something that will cause them harm, or at least undesired&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;consequences, later on. This means that in the areas of life where&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;people are mostly wrong, it is indeed a good thing to be civil and&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;polite all the time, as one wouldn’t want others constantly to point&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;out one’s own mistakes, either, but in the many areas where it is&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;possible to be right, and positively harmful to be wrong, allowing&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;people to hold on to false beliefs in order to protect their feelings&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;is really, really bad for everyone. The key, therefore, is knowing&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;which areas can and which still cannot tell right from wrong. &lt;/span&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;It is my&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;firm position that no areas of science, technology, engineering,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;mathematics, and allied disciplines such as medicine, are proper&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;arenas for politeness and civility. If people are wrong and are&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;spreading dis- or misinformation in these fields, everybody hurts&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;because it becomes that much harder to know right from wrong.&lt;/span&gt;&lt;span style="font-family: courier new;"&gt; However,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;in areas where no one can really tell, such as ethics, politics,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;fashion, etc, even though we may have pretty good ideas and&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;communities who /choose/ a particular set of beliefs, it behooves people&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;to be humble and civil and polite because fighting with people who are&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;wrong, but believe they are right, yet there are no means to prove&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;that, would be extremely tiresome, as it became on c.l.l when people&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;who stopped thinking about issues where we /can/ decide right from&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;wrong, started to bother everyone with their /personal/ problems when&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;others disagreed with them.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt; In retrospect, I'm pretty sure that you helped me become the&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt; individuum I am now.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;I’m very pleased to hear that, and particularly that you took the time&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;to write and tell me. I wish you the best of luck for the future!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Best regards, Erik Naggum&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;--&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Member of AAAI AAAS ACM AMS APS ASA ASL IEEE IMS MAA NYAS PSA SIAM USENIX&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;The United States of America still symbolizes individualism, rationality,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;and intellectual achievement to me — even though most Americans disagree.&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8255220546902369433-2513328434153481477?l=trittweiler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trittweiler.blogspot.com/feeds/2513328434153481477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8255220546902369433&amp;postID=2513328434153481477' title='48 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/2513328434153481477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/2513328434153481477'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/2009/06/erik-naggum-rip.html' title='Erik Naggum, RIP.'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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>48</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8255220546902369433.post-1397237092805346757</id><published>2009-05-14T20:15:00.010+02:00</published><updated>2009-05-14T20:50:34.224+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp slime'/><title type='text'>SLIME tidbits (2009-05-14)</title><content type='html'>First a small addendum: In my &lt;a href="http://trittweiler.blogspot.com/2009/05/slime-tidbits-2009-05-02.html"&gt;previous blog entry&lt;/a&gt; I demonstrated the improved font-lock magic in Slime to shadow forms suppressed by reader conditionals. Anyone who succumbed to the temptation and updated their Slime checkout, should really update to today's &lt;span style="font-family:courier new;"&gt;HEAD&lt;/span&gt;. There has been a couple of issues which have been fixed meanwhile.&lt;br /&gt;&lt;br /&gt;In this blog posting I'll demonstrate my work on Slime's&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;inspector&lt;/span&gt; for &lt;span style="font-family:courier new;"&gt;STANDARD-OBJECTs&lt;/span&gt;. Previously it looked like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XshvghKxGuU/SgxjAtamJgI/AAAAAAAAAAc/gLO8zhEpc_o/s1600-h/slime-inspector-old.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 172px; height: 200px;" src="http://3.bp.blogspot.com/_XshvghKxGuU/SgxjAtamJgI/AAAAAAAAAAc/gLO8zhEpc_o/s200/slime-inspector-old.png" alt="" id="BLOGGER_PHOTO_ID_5335748522369492482" border="0" /&gt;&lt;/a&gt;I always found the &lt;span style="font-family:courier new;"&gt;[set value]&lt;/span&gt; and&lt;span style="font-family:courier new;"&gt; [make unbound]&lt;/span&gt;buttons after each slot entry pretty distracting, if not to say annoying. So I spent some time to replace them with a checklist as follows:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_XshvghKxGuU/SgxkCwOMdeI/AAAAAAAAAAk/40qtu8p4J-c/s1600-h/slime-inspector-new-1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 170px; height: 200px;" src="http://2.bp.blogspot.com/_XshvghKxGuU/SgxkCwOMdeI/AAAAAAAAAAk/40qtu8p4J-c/s200/slime-inspector-new-1.png" alt="" id="BLOGGER_PHOTO_ID_5335749656994149858" border="0" /&gt;&lt;/a&gt;Quite cool that you can do this with Slime's inspector! Notice that I did &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; have to touch a single Elisp code line for all this.&lt;br /&gt;&lt;br /&gt;You may have noticed the new &lt;span style="font-family:courier new;"&gt;[group slots by inheritance]&lt;/span&gt; button: by default the slots are sorted alphabetically by their name. After pressing this button, however, the slots will be grouped according to the class they were inherited from. Or in CLOS terminology: according to the class they're direct slots of.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_XshvghKxGuU/SgxlSlT49fI/AAAAAAAAAAs/0MM7zYSV6JQ/s1600-h/slime-inspector-new-2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 170px; height: 200px;" src="http://1.bp.blogspot.com/_XshvghKxGuU/SgxlSlT49fI/AAAAAAAAAAs/0MM7zYSV6JQ/s200/slime-inspector-new-2.png" alt="" id="BLOGGER_PHOTO_ID_5335751028454782450" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8255220546902369433-1397237092805346757?l=trittweiler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trittweiler.blogspot.com/feeds/1397237092805346757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8255220546902369433&amp;postID=1397237092805346757' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/1397237092805346757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/1397237092805346757'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/2009/05/slime-tidbits-2009-05-14.html' title='SLIME tidbits (2009-05-14)'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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/_XshvghKxGuU/SgxjAtamJgI/AAAAAAAAAAc/gLO8zhEpc_o/s72-c/slime-inspector-old.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8255220546902369433.post-5193286172340882195</id><published>2009-05-02T11:46:00.002+02:00</published><updated>2009-05-02T12:48:12.349+02:00</updated><title type='text'>SLIME tidbits (2009-05-02)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XshvghKxGuU/SfwXgkha0WI/AAAAAAAAAAM/RDjWrqsT2S8/s1600-h/slime-font-lock-magic.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 256px; height: 320px;" src="http://3.bp.blogspot.com/_XshvghKxGuU/SfwXgkha0WI/AAAAAAAAAAM/RDjWrqsT2S8/s320/slime-font-lock-magic.png" alt="" id="BLOGGER_PHOTO_ID_5331161907226923362" border="0" /&gt;&lt;/a&gt;Since a long time SLIME tries to highlight forms specially that are suppressed due to reader conditionals.&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt; That feature has never worked reliably for me; sometimes such forms were highlighted, but most often not. And even if they were highlighted, redisplay (or rather refontification) would often remove the highlighting again.&lt;br /&gt;&lt;br /&gt;While resuming to work on my &lt;a href="http://common-lisp.net/%7Etrittweiler/darcs/editor-hints/named-readtables/"&gt;named-readtables&lt;/a&gt; library -- which includes a little bit of portability glue --, I became annoyed^W intrigued enough to take a look at the cause of this non-deterministic behaviour.&lt;br /&gt;&lt;br /&gt;The issue took more effort than I'd have initially expected. But as you can see from the screen shot, it should be fixed now. It shows the &lt;span style="font-family: courier new;"&gt;FINALIZE&lt;/span&gt; function from the &lt;a href="http://www.cliki.net/trivial-garbage"&gt;trivial-garbage&lt;/a&gt; project. (I hope planet.lisp reader will be able to see the image, too.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8255220546902369433-5193286172340882195?l=trittweiler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trittweiler.blogspot.com/feeds/5193286172340882195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8255220546902369433&amp;postID=5193286172340882195' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/5193286172340882195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/5193286172340882195'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/2009/05/slime-tidbits-2009-05-02.html' title='SLIME tidbits (2009-05-02)'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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/_XshvghKxGuU/SfwXgkha0WI/AAAAAAAAAAM/RDjWrqsT2S8/s72-c/slime-font-lock-magic.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8255220546902369433.post-5392974864704042370</id><published>2009-01-03T23:01:00.004+01:00</published><updated>2009-01-04T23:57:47.342+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Slime'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><title type='text'>SLIME tidbits (2009-01-03)</title><content type='html'>&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;When you update to &lt;span style="font-family:courier new;"&gt;HEAD&lt;/span&gt; make sure you enable the &lt;span style="font-family:courier new;"&gt;slime-repl&lt;/span&gt; contrib, otherwise you'll be stuck to an old-school inferior-lisp REPL, only.&lt;br&gt; &lt;span style="font-style: italic;"&gt;Recommended&lt;/span&gt;: Use the &lt;span style="font-family:courier new;"&gt;slime-fancy&lt;/span&gt; meta contrib which enables various useful features you'll probably enjoy.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;C-u C-c C-c&lt;/span&gt; &lt;span style="font-family:verdana;"&gt;will compile the defun at point with maximum &lt;/span&gt;&lt;span style="font-weight: bold;font-family:verdana;" &gt;debug&lt;/span&gt;&lt;span style="font-family:verdana;"&gt; optimization setting. (SBCL only so far.)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Bleeding edge feature:&lt;/span&gt; &lt;span style="font-weight: bold;font-family:courier new;" &gt;M-- C-c C-c&lt;/span&gt; &lt;span style="font-family:verdana;"&gt;will compile the defun at point with maximum &lt;/span&gt;&lt;span style="font-weight: bold;font-family:verdana;" &gt;speed&lt;/span&gt;&lt;span style="font-family:verdana;"&gt; optimization setting (still SBCL only.) This is very useful to benefit from SBCL's type inference and elicit compiler notes.&lt;/span&gt;&lt;br /&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/8255220546902369433-5392974864704042370?l=trittweiler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trittweiler.blogspot.com/feeds/5392974864704042370/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8255220546902369433&amp;postID=5392974864704042370' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/5392974864704042370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/5392974864704042370'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/2009/01/slime-tidbits-2009-03-01.html' title='SLIME tidbits (2009-01-03)'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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-8255220546902369433.post-8749951157827474026</id><published>2009-01-03T00:37:00.009+01:00</published><updated>2009-01-03T01:13:21.537+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><title type='text'>On the order of macro expansions</title><content type='html'>&lt;span style="font-family:verdana;"&gt;Just a moment ago, I was able to dig out a definitive answer for an old question of mine: Can one expect macros to be expanded in the order they textually appear in a source file?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Answer: No, you cannot.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;The expectation originated in Common Lisp's evaluation model (&lt;a href="http://www.lispworks.com/documentation/HyperSpec/Body/03_ab.htm"&gt;CLHS 3.1.2&lt;/a&gt;) which can be described to be basically top-down, left-to-right (&lt;a href="http://www.lispworks.com/documentation/HyperSpec/Body/03_ababc.htm"&gt;CLHS 3.1.2.1.2.3&lt;/a&gt;).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;That expectation was short-sighted, though, as processing and evaluating are two differen things. And, indeed, item #6 in &lt;a href="http://www.lispworks.com/documentation/HyperSpec/Body/03_bca.htm"&gt;CLHS 3.2.3.1&lt;/a&gt; specifies:&lt;/span&gt;&lt;br /&gt;&lt;blockquote  style="font-family:verdana;"&gt;Note that top level forms are processed in the order in which they textually appear in the file and that each top level form read by the compiler is processed before the next is read. &lt;span style="font-style: italic;"&gt;However, the order of processing (including macro expansion) of subforms&lt;/span&gt; that are not top level forms and the order of further compilation &lt;span style="font-style: italic;"&gt;is unspecified&lt;/span&gt; as long as Common Lisp semantics are preserved.&lt;/blockquote&gt; &lt;span style="font-family:verdana;"&gt;Which makes perfect sense as it allows compilers to do transformations on the Lisp source code before or along macroexpansion.&lt;br /&gt;&lt;br /&gt;For example, &lt;a href="http://www.lispworks.com/documentation/HyperSpec/Body/s_unwind.htm#unwind-protect"&gt;&lt;span style="font-family:courier new;"&gt;UNWIND-PROTECT&lt;/span&gt;&lt;/a&gt; could be a macro turning&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;      (unwind-protect (protected-form)&lt;br /&gt;      &amp;nbsp;&amp;nbsp;(cleanup-form1)&lt;br /&gt;      &amp;nbsp;&amp;nbsp;(cleanup-form2))&lt;/span&gt;&lt;/blockquote&gt;into&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt; (let ((cleanup-thunk #'(lambda () (cleanup-form1) (cleanup-form2))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(declare (dynamic-extent cleanup-thunk))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(%establish-unwind-guard cleanup-thunk)&lt;br /&gt;&amp;nbsp;&amp;nbsp;(protected-form)&lt;br /&gt;&amp;nbsp;&amp;nbsp;(funcall cleanup-thunk) ; no unwinding happened&lt;br /&gt;&amp;nbsp;&amp;nbsp;(%remove-unwind-guard))&lt;/blockquote&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8255220546902369433-8749951157827474026?l=trittweiler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trittweiler.blogspot.com/feeds/8749951157827474026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8255220546902369433&amp;postID=8749951157827474026' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/8749951157827474026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/8749951157827474026'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/2009/01/just-moment-ago-i-was-able-to-dig-out.html' title='On the order of macro expansions'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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-8255220546902369433.post-3197780968613743516</id><published>2008-12-22T22:32:00.005+01:00</published><updated>2008-12-23T00:05:40.610+01:00</updated><title type='text'>On the relationship of (LAMBDA (...) ...) and #'(LAMBDA (...) ...).</title><content type='html'>&lt;span style="font-family:trebuchet ms;"&gt;People frequently ask about the difference between &lt;span style="font-family:courier new;"&gt;(LAMBDA (...) ...)&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;#'(LAMBDA (...) ...)&lt;/span&gt;. Saying there is no difference is, however, an oversimplifcation that leaves out some details from the Common Lisp standard.&lt;br /&gt;&lt;br /&gt;In an evaluated context, the relationship between the two forms can be described accurately by saying that &lt;a href="http://www.lispworks.com/documentation/HyperSpec/Body/m_lambda.htm"&gt;&lt;span style="font-family:courier new;"&gt;LAMBDA&lt;/span&gt;&lt;/a&gt; is actually a macro that expands the first form into the second one.&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;blockquote&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:courier new;"&gt;(defmacro lambda (&amp;amp;whole whole args &amp;amp;body body)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:courier new;"&gt; &amp;nbsp;&amp;nbsp;(declare (ignore args body))&lt;br /&gt;&amp;nbsp;&amp;nbsp;`#',whole)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;/span&gt;It follows that in an evaluated context, the two forms are thus completely synonymous. Note that the form involving &lt;a href="http://www.lispworks.com/documentation/HyperSpec/Body/s_fn.htm"&gt;&lt;span style="font-family:courier new;"&gt;FUNCTION&lt;/span&gt;&lt;/a&gt; is strictly more primitive, and is what causes the creation of a &lt;a href="http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_l.htm#lexical_closure"&gt;lexical closure&lt;/a&gt; eventually.&lt;br /&gt;&lt;br /&gt;Howsoever, there are some unevaluated contexts in which you're only allowed to use the former, but not the latter form:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;  The &lt;span style="font-family:courier new;"&gt;CAR&lt;/span&gt; of a form must usually be a symbol, naming the function, macro, or special operator that is supposed to be invoked.&lt;/span&gt;&lt;br /&gt;&lt;p  style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;As a special exception to that rule (historically for ISLISP compatibility), the CAR of a form can also be&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;(LAMBDA (...) ...)&lt;/span&gt;.&lt;/p&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;((lambda (x) (* x x)) 2) ==&gt; 4&lt;/span&gt;&lt;/blockquote&gt;See &lt;a style="font-family: trebuchet ms;" href="http://www.lispworks.com/documentation/HyperSpec/Body/03_abab.htm"&gt;CLHS section 3.1.2.1.2&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The &lt;span style="font-family:courier new;"&gt;:interactive&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;:report&lt;/span&gt;, and &lt;span style="font-family:courier new;"&gt;:test&lt;/span&gt; arguments of a clause in &lt;a href="http://www.lispworks.com/documentation/HyperSpec/Body/m_rst_ca.htm#restart-case"&gt;&lt;span style="font-family:courier new;"&gt;RESTART-CASE&lt;/span&gt;&lt;/a&gt; take &lt;span style="font-family:courier new;"&gt;(LAMBDA (...) ...)&lt;/span&gt;, but not &lt;span style="font-family:courier new;"&gt;#'(LAMBDA (...) ...)&lt;/span&gt; forms.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Likewise for the &lt;span style="font-family:courier new;"&gt;:report&lt;/span&gt; option of &lt;a href="http://www.lispworks.com/documentation/HyperSpec/Body/m_defi_5.htm#define-condition"&gt;&lt;span style="font-family:courier new;"&gt;DEFINE-CONDITION&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Likewise for the &lt;span style="font-family:courier new;"&gt;:print-function&lt;/span&gt;, and &lt;span style="font-family:courier new;"&gt;:print-object&lt;/span&gt; options of &lt;a href="http://www.lispworks.com/documentation/HyperSpec/Body/m_defstr.htm#defstruct"&gt;&lt;span style="font-family:courier new;"&gt;DEFSTRUCT&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8255220546902369433-3197780968613743516?l=trittweiler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trittweiler.blogspot.com/feeds/3197780968613743516/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8255220546902369433&amp;postID=3197780968613743516' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/3197780968613743516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/3197780968613743516'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/2008/12/on-relationship-of-lambda-and-lambda.html' title='On the relationship of (LAMBDA (...) ...) and #&apos;(LAMBDA (...) ...).'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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-8255220546902369433.post-3606307972114943888</id><published>2008-12-12T11:30:00.004+01:00</published><updated>2008-12-12T11:37:41.245+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><title type='text'>About this blog</title><content type='html'>&lt;span style="font-family: verdana;"&gt;The purpose of my blog is to share the knowledge I have acquired over the last 4 years I've been learning Common Lisp. Even after (almost) 4 years, I wouldn't dare to assert to know the language in its entirety; there are still major areas I'm only superficially familiar with.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;My rationale behind this endeavor is two-fold.&lt;/span&gt;&lt;br /&gt;&lt;ul style="font-family: verdana;"&gt;&lt;li&gt;  On one hand, I want to offer a ressource for people that already have experience with Common Lisp to gain even more thorough understanding of the language---so they can ascent to the next level so to speak.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-family: verdana;"&gt;&lt;li&gt;  On the other hand, I want to preserve information for myself. The human mind is generally not capable of keeping too many details for a long period of time around. Hence, I'd like to use this blog as a swapping device for stuff I once spent time on.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;I'll start with a series about writing macros correctly---correctly as in consistently to how the macros in the Common Lisp standard behave. There are lot more issues involved in writing correct macros than the widely known problems of unwanted variable capture, and multiple evaluation.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;I'm looking forward to comments about the upcomming postings, and to suggestions for things to write about. You can always reach me via e-mail (trittweiler, common-lisp, net.)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="font-family: courier new;"&gt;-T.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8255220546902369433-3606307972114943888?l=trittweiler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trittweiler.blogspot.com/feeds/3606307972114943888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8255220546902369433&amp;postID=3606307972114943888' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/3606307972114943888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/3606307972114943888'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/2008/12/about-this-blog.html' title='About this blog'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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-8255220546902369433.post-5850046208169199094</id><published>2008-12-05T23:34:00.006+01:00</published><updated>2008-12-12T11:30:24.922+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Slime'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><title type='text'>Slime Talk 2008</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-family:verdana;"&gt;Last Wednesday, I gave a talk to the &lt;/span&gt;&lt;a style="font-family: verdana;" href="http://common-lisp.net/pipermail/munich-lisp/"&gt;Munich Lisp Group&lt;/a&gt;&lt;span style="font-family:verdana;"&gt; about &lt;/span&gt;&lt;a style="font-family: verdana;" href="http://common-lisp.net/project/slime/"&gt;SLIME&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;, the Superior Lisp Interaction Mode for Emacs. An perfect opportunity for opening my blog!&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;The presentation can be found at&lt;br /&gt;&lt;a href="http://common-lisp.net/%7Etrittweiler/slime-talk-2008.pdf"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://common-lisp.net/%7Etrittweiler/slime-talk-2008.pdf"&gt;&lt;span style="font-family:verdana;"&gt;http://common-lisp.net/~trittweiler/slime-talk-2008.pdf&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;It was an honor to see that so many people (about 25), partly from very far abroad!, showed up to see myself talk about the stuff I hacked over the past two years. The age distribution was also very diverse, from early twenties to mid forties, I guess. I was especially pleased to notice that the average age drifted more towards the younger end than to the older one.&lt;br /&gt;&lt;br /&gt;The background of all the people was also very diverse, and very fascinating. As the resonance of the talk has been very positive (thanks all!), it was decided to regularly uphold such meetings in the future. If you're close to Munich, go, and subscribe to the mailinglist!&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: right;"&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-family:courier new;"&gt;      -T.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&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/8255220546902369433-5850046208169199094?l=trittweiler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/5850046208169199094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8255220546902369433/posts/default/5850046208169199094'/><link rel='alternate' type='text/html' href='http://trittweiler.blogspot.com/2008/12/last-wednesday-i-gave-talk-to-munich.html' title='Slime Talk 2008'/><author><name>trittweiler</name><uri>http://www.blogger.com/profile/10359647852202967805</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></entry></feed>
