<?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-1648420720867048126</id><updated>2012-02-16T18:28:23.562-08:00</updated><category term='ubuntu linux lisp sbcl sdl'/><category term='lisp cl-sql odbcunix freetds'/><category term='Domain-Driven Design'/><category term='asdf'/><category term='windows xp'/><category term='sbcl'/><category term='lisp postgresql postmodern'/><category term='ubuntu lisp sbcl slime emacs karmic'/><category term='cells-gtk'/><category term='weblocks'/><category term='cusp'/><category term='lisp'/><category term='lisp sbcl core save'/><category term='Lightswitch ConnectionString'/><category term='lisp emacs sbcl ubuntu'/><category term='uninstall'/><title type='text'>Bits of Info</title><subtitle type='html'>Primarily technical blog on Lisp, .NET, C# development.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>25</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-2234358411624410733</id><published>2011-11-04T08:52:00.000-07:00</published><updated>2011-11-04T08:52:09.500-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lightswitch ConnectionString'/><title type='text'>Changing Connection String in Lightswitch</title><content type='html'>This has been annoying me on my work with Lightswitch, great tool for building business applications. Finally I found this information on a forum. It didn't get a high score there, but it was spot on.&lt;br /&gt;&lt;br /&gt;With you want to change the connection strings in debug/release mode, search for Web.Config in project tree under the ServerGenerated folder. There you will find the connection string that is used by Lightswitch in design time.&lt;br /&gt;&lt;br /&gt;You will have to close and reopen the solution so the change takes effect...&lt;br /&gt;&lt;br /&gt;Thanks to Nehemiah Willis post at: &lt;a href="http://social.msdn.microsoft.com/Forums/en/lightswitchgeneral/thread/53aef43c-e24f-4359-ad0c-0efe5625916e"&gt;Original forum post&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1648420720867048126-2234358411624410733?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/2234358411624410733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=2234358411624410733' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/2234358411624410733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/2234358411624410733'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2011/11/changing-connection-string-in.html' title='Changing Connection String in Lightswitch'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-628862424865759324</id><published>2011-07-22T13:03:00.000-07:00</published><updated>2011-07-22T13:03:34.506-07:00</updated><title type='text'>Company Logo</title><content type='html'>&lt;p&gt;I am finally in the process of starting my own business. Today, I received the logo/brand name. Here it is.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img border="0" height="102" width="320" src="http://3.bp.blogspot.com/-uaN2WoXxUZg/TinWrW4C7NI/AAAAAAAABxE/unzKwqgHN7k/s320/artefinal%2Bmarca%2Bcriterion%2B-%2B21-07-2011.png" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I am obviously biased, but I think it looks great.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1648420720867048126-628862424865759324?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/628862424865759324/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=628862424865759324' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/628862424865759324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/628862424865759324'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2011/07/company-logo.html' title='Company Logo'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-uaN2WoXxUZg/TinWrW4C7NI/AAAAAAAABxE/unzKwqgHN7k/s72-c/artefinal%2Bmarca%2Bcriterion%2B-%2B21-07-2011.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-2510472969916287373</id><published>2011-02-17T15:16:00.000-08:00</published><updated>2011-02-17T15:16:15.777-08:00</updated><title type='text'>Quicklisp is great!</title><content type='html'>After a long time not doing anything Lisp, I decided to check my installation just to see if my code was still OK. It turns out that something was broken with my libraries and its dependencies. &lt;br /&gt;&lt;br /&gt;The everyday in Lisp programming.&lt;br /&gt;&lt;br /&gt;This time I decided to go look for something different and decided to give Quicklisp a try.&lt;br /&gt;Just for the record, if you haven't tried it yet. Try it now. It exceeded all my expectations.&lt;br /&gt;&lt;br /&gt;I was able to get an old project ready in less than 5min with all the right libraries up and running.&lt;br /&gt;&lt;br /&gt;So, thank you Zach Beane, for Quicklisp!&lt;br /&gt;&lt;br /&gt;Check it out at: http://www.quicklisp.org/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1648420720867048126-2510472969916287373?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/2510472969916287373/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=2510472969916287373' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/2510472969916287373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/2510472969916287373'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2011/02/quicklisp-is-great.html' title='Quicklisp is great!'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-1514513345777363013</id><published>2010-05-13T06:27:00.000-07:00</published><updated>2010-05-13T06:30:12.543-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>Lisp style</title><content type='html'>&lt;p&gt;Consider the following snippets of code:&lt;/p&gt;&lt;code&gt;&lt;br /&gt;(let ((probed-path)&lt;br /&gt;(not-found t))&lt;br /&gt;(dolist (registry-expression asdf:*central-registry*) &lt;br /&gt;(when not-found &lt;br /&gt;(setf probed-path (eval registry-expression)))&lt;br /&gt;(when (probe-file (merge-pathnames "asd-library.asd" probed-path)) &lt;br /&gt;(setf not-found nil)))&lt;br /&gt;probed-path)&lt;br /&gt;&lt;br /&gt;(first (remove-if #'null &lt;br /&gt;(mapcar #'(lambda (x) &lt;br /&gt;(when (probe-file &lt;br /&gt;(merge-pathnames "asd-library.asd" (eval x))) &lt;br /&gt;(eval x))) &lt;br /&gt;asdf:*central-registry*)))&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;Both codes perform the same task. The first one is more like a procedural/imperative code in style than the more functional second one.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;By the way, they return the path for a registered library. It is not very useful since ADSF provides the same thing easily with a single function call:&lt;br /&gt;&lt;/p&gt;&lt;code&gt;(asdf:system-relative-pathname :asd-library "")&lt;code&gt;&lt;br /&gt;&lt;p&gt;But I like to get back to it as a reference of lisp styles.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1648420720867048126-1514513345777363013?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/1514513345777363013/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=1514513345777363013' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/1514513345777363013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/1514513345777363013'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2010/05/lisp-style.html' title='Lisp style'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-8140894988986951241</id><published>2010-04-29T01:59:00.000-07:00</published><updated>2010-04-29T01:59:22.655-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp postgresql postmodern'/><title type='text'>How to make Postmodern ignore incomplete mapped DAO</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;div&gt;Yesterday I was working with a database using Postmodern (http://marijn.haverbeke.nl/postmodern/) and I ran into an issue trying to adding a column to one of my databases.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;According to its current implementation, postmodern raises an error if the DAO and the table scheme are not matching. In order words, the DAO class must have all fields from the table it maps to.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In a real world environment, a web application running live for example, it might not be acceptable to bring the application down just because a new column was added to the table it uses.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sometimes, depending on the database design, a table can contain information from several DAO's, specially if they have a parent-child object relationship.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In order to remove this validation from postmodern allowing you to have DAO's mapping to a subset of the fields of a table all it is needed is a little patch on the postmodern table.lisp file on the function as follows:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;(defun dao-row-reader (class)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;"Defines a row-reader for objects of a given class."&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;(row-reader (query-fields)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(let ((column-map (append *custom-column-writers* (dao-column-map class))))&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;(loop :while (next-row)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:collect (let ((instance (allocate-instance class)))&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (loop :for field :across query-fields&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :for writer := (cdr (assoc (field-name field) column-map :test #'string=))&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :do (etypecase writer&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;b&gt;(null (next-field field))&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (symbol (setf (slot-value instance writer) (next-field field)))&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (function (funcall writer instance (next-field field)))))&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (initialize-instance instance)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; instance)))))&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Compare with the current version code where if the field is not found it raises an error:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;(defun dao-row-reader (class)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;"Defines a row-reader for objects of a given class."&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;(row-reader (query-fields)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(let ((column-map (append *custom-column-writers* (dao-column-map class))))&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;(loop :while (next-row)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:collect (let ((instance (allocate-instance class)))&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (loop :for field :across query-fields&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :for writer := (cdr (assoc (field-name field) column-map :test #'string=))&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :do (etypecase writer&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;b&gt;(null (error "No slot named ~a in class ~a. DAO out of sync with table, or incorrect query used."&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(field-name field) (class-name class)))&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (symbol (setf (slot-value instance writer) (next-field field)))&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (function (funcall writer instance (next-field field)))))&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (initialize-instance instance)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; instance)))))&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1648420720867048126-8140894988986951241?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/8140894988986951241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=8140894988986951241' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/8140894988986951241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/8140894988986951241'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2010/04/how-to-make-postmodern-ignore.html' title='How to make Postmodern ignore incomplete mapped DAO'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-1608447236196672064</id><published>2010-04-09T12:19:00.000-07:00</published><updated>2010-04-09T12:19:18.840-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp sbcl core save'/><title type='text'>Save Lisp and Die</title><content type='html'>If you are running SBCL and are using threads, this is the way I found out that works for me to stop the threads before saving the core.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;(dolist (thread (sb-thread:list-all-threads))&lt;/span&gt; &lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; (unless (eq thread sb-thread:*current-thread*)&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (sb-thread:terminate-thread thread)))&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;then you can run... &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;(sb-ext:save-lisp-and-die "core-file")&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;I am using SBCL 1.0.36 64bit on a Linux Ubuntu 9.10 64bit. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1648420720867048126-1608447236196672064?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/1608447236196672064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=1608447236196672064' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/1608447236196672064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/1608447236196672064'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2010/04/save-lisp-and-die.html' title='Save Lisp and Die'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-1820442925352449486</id><published>2010-01-20T14:15:00.000-08:00</published><updated>2010-04-17T08:18:26.028-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu lisp sbcl slime emacs karmic'/><title type='text'>Installing SBCL + SLIME on Ubuntu 9.10</title><content type='html'>Today I tried to upgrade my lisp environment that is using clbuild to keep track of the packages just to be annoyed by its failure. I was just trying to check how hard it would be to do that in my everyday environment. Because of the failure I decided to try other alternatives. This time I tried Lispy which is is defined as (from their website) &lt;a href="http://common-lisp.net/project/lispy/"&gt;http://common-lisp.net/project/lispy/&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;"Lispy is a library manager for Common Lisp, written in Common Lisp. All of its dependencies except for GPG (with which signed maps and releases are verified) are written in portable Common Lisp. With this approach you should only need a Lisp implementation installed to get started. The Lispy project has two goals:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Implement an easy to use, portable library manager.&lt;/li&gt;&lt;li&gt;Provide a wealth of ready to install libraries."&lt;/li&gt;&lt;/ol&gt;&amp;nbsp;Ok. I liked the concept. I followed their guide and was able to have it working on my sbcl 1.0.29 version alrady installed on the machine. I only had one issue because it couldn't find the gpg key. I had to serach for it using a different server:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ gpg --keyserver subkeys.pgp.net --search-key 0x7CF49723&lt;/div&gt;&lt;br /&gt;All was well but I decided to also get the latest from sbcl (1.0.34) and slime as well.&lt;br /&gt;&lt;br /&gt;Installing sbcl was very straight forward and I had no issues. Installing slime however was a pain. I got it from the cvs and I set it up just like the getting started page suggested but I could not get to the slime-repl buffer. So after searching the page for known issue I found this:&lt;br /&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;The REPL moved to a contrib. Instead of (slime-setup), place&lt;br /&gt;(slime-setup '(slime-fancy slime-asdf)) into your ~/.emacs.&lt;/pre&gt;&lt;pre&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-family: Arial,Helvetica,sans-serif;"&gt;So I ended up with a different .emacs file then before:&lt;/pre&gt;&lt;pre style="font-family: Arial,Helvetica,sans-serif;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;(add-to-list 'load-path "your-path-to-slime")&lt;br /&gt;(require 'slime)&lt;br /&gt;(add-hook 'lisp-mode-hook (lambda () (slime-mode t)))&lt;br /&gt;(add-hook 'inferior-lisp-mode-hook (lambda () (inferior-slime-mode t)))&lt;br /&gt;(setq inferior-lisp-program "sbcl")&lt;br /&gt;(slime-setup '(slime-fancy slime-asdf))&lt;/pre&gt;&lt;pre style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Next post I will tell my journey to get a web site running on the good old hunchentoot.&lt;/span&gt; &lt;br /&gt;&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1648420720867048126-1820442925352449486?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/1820442925352449486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=1820442925352449486' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/1820442925352449486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/1820442925352449486'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2010/01/installing-sbcl-slime-on-ubuntu-910.html' title='Installing SBCL + SLIME on Ubuntu 9.10'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-4362283860173412896</id><published>2010-01-06T02:53:00.000-08:00</published><updated>2010-01-11T05:46:43.002-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp cl-sql odbcunix freetds'/><title type='text'>Connecting to a database from Lisp</title><content type='html'>This is another reminder to myself on how to connect to a database on Lisp using cl-sql through odbcunix.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;(use-package :cl-sql)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;(connect '("dsn" "user" "password") :database-type :odbc)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;(query "select * from table_a")&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1648420720867048126-4362283860173412896?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/4362283860173412896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=4362283860173412896' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/4362283860173412896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/4362283860173412896'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2010/01/connecting-to-database-from-lisp.html' title='Connecting to a database from Lisp'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-6542634301284336163</id><published>2009-12-11T12:39:00.000-08:00</published><updated>2009-12-21T18:24:43.354-08:00</updated><title type='text'>Ubuntu and FreeTDS</title><content type='html'>One of the things I have in mind is to be able to connect to a MS SQL database from Lisp in one of my projects. After spending a couple hours searching for a way to get freeTDS and odbcunix to work together, I found this blog in portuguese with a good step by step process.&lt;br /&gt;&lt;br /&gt;I have to point out I didn't have to build freeTDS from the source. I got from the repository. I didn't use the tsql tool. Instead I used the isql one. Other than that everything is according to how I proceeded.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.lamiscela.net/2009/07/13/ubuntu-freetds-sql-server-2005-conectado/"&gt;How to setup Freetds using Ubuntu&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1648420720867048126-6542634301284336163?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/6542634301284336163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=6542634301284336163' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/6542634301284336163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/6542634301284336163'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2009/12/ubuntu-and-freetds.html' title='Ubuntu and FreeTDS'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-615226680574165052</id><published>2009-10-30T13:39:00.000-07:00</published><updated>2009-10-30T13:39:16.964-07:00</updated><title type='text'>Installing LISP with CLBuild on Ubuntu</title><content type='html'>&lt;b&gt; &lt;/b&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;http://club-ubuntu.org/blogs/em/getting-started-with-lisp-in-ubuntu&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;then with your clbuild already installed:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;./clbuild update sbcl&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;./clbuild compile-implementation sbcl&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;./clbuild install --main-projects&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;./clbuild install weblocks&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;./clbuild install cl-prevalence&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1648420720867048126-615226680574165052?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/615226680574165052/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=615226680574165052' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/615226680574165052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/615226680574165052'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2009/10/installing-lisp-with-clbuild-on-ubuntu.html' title='Installing LISP with CLBuild on Ubuntu'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-3461415211656081068</id><published>2009-10-19T09:58:00.000-07:00</published><updated>2009-10-19T09:58:11.254-07:00</updated><title type='text'>clbuild and lispbuilder-sdl - update</title><content type='html'>I retested the latest version of lispbuilder-sdl, updating and recompiling from cl-build and I am glad to say it is working fine, as expected, now.&lt;br /&gt;&lt;br /&gt;Always good to spread good news, isn't it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1648420720867048126-3461415211656081068?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/3461415211656081068/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=3461415211656081068' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/3461415211656081068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/3461415211656081068'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2009/10/clbuild-and-lispbuilder-sdl-update.html' title='clbuild and lispbuilder-sdl - update'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-7630313598033540093</id><published>2009-08-21T14:46:00.000-07:00</published><updated>2009-08-21T14:54:25.986-07:00</updated><title type='text'>clbuild and lispbuilder-sdl</title><content type='html'>On my earlier version of the alarm clock I used the cl-sdl library. I was testing clbuild the other day and I tried to use its version of the sdl: lispbuilder-sdl. Unfortunately on my machine I was getting an error everytime the app was about to close the window due to a call to SDL-glue-SDL-Close-Audio method on the cffi part of the lispbuilder-sdl library:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I suppressed this message by calling a method I knew was working and it worked fine so far.&lt;br /&gt;&lt;br /&gt;So if you want to try the same thing, look for the glue.lisp file on the clbuild/source&lt;br /&gt;/lispbuilder-sdl/cffi and change this part to the following code:&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;#+lispbuilder-sdl-audio&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;(cffi:defcfun ("SDL_CloseAudio"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;               SDL-glue-SDL-Close-Audio) :void)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So instead of calling the original method I am using the SDL_CloseAudio and it is working fine so far.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1648420720867048126-7630313598033540093?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/7630313598033540093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=7630313598033540093' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/7630313598033540093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/7630313598033540093'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2009/08/clbuild-and-lispbuilder-sdl.html' title='clbuild and lispbuilder-sdl'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-7357667939369643474</id><published>2009-08-18T05:54:00.000-07:00</published><updated>2009-08-18T06:05:16.434-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu linux lisp sbcl sdl'/><title type='text'>Little Alarm Clock in LISP</title><content type='html'>I wrote this code one of these days because I left the food heating a little too long. I actually burned the pan itself. Anyway it was a little fun project. You give set the time you want it to play a song from your hard drive. Using SDL I was able to play the song and also display a little window to notify about  the alarm. You need cl-sdl and cl-sdl-mixer to play the alarm song. If you use ubuntu just install them from the repository using the synaptic package manager.&lt;br /&gt;&lt;br /&gt;Here goes the code:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;;; Timer   &lt;br /&gt;&lt;br /&gt;;; Function to return the current time hour and minute in a list&lt;br /&gt;(defun get-time()&lt;br /&gt;  (multiple-value-bind (x y z) (get-decoded-time)&lt;br /&gt;    (values (list z y) x)))&lt;br /&gt;&lt;br /&gt;;; Function to compare if two times are the same&lt;br /&gt;(defun check-time (time-value)&lt;br /&gt;  (if (equalp time-value (get-time)) t nil))&lt;br /&gt;&lt;br /&gt;;; Function to check if time1 is before time2&lt;br /&gt;(defun before-time-p (time1 time2)&lt;br /&gt;    (if (or (&lt; (first time1) (first time2))&lt;br /&gt;        (and (equal (first time1) (first time2))&lt;br /&gt;         (&lt; (second time1) (second time2))))&lt;br /&gt;    nil t))&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;;; Function to play the alarm song and display the window&lt;br /&gt;(defun play-alarm (song-path)&lt;br /&gt;  (sdl:init (logior sdl:+init-audio+ sdl:+init-video+))&lt;br /&gt;  (sdl:set-video-mode 320 240 16 sdl:+resizable+)&lt;br /&gt;  (sdl:wm-set-caption "Alarm ON!" nil)&lt;br /&gt;  (sdl-mix:open-audio 44100 sdl:+audio-s16lsb+ 2 2048)&lt;br /&gt;  (let ((music (sdl-mix:load-mus song-path)))&lt;br /&gt;    (sdl-mix:play-music music 0)&lt;br /&gt;    (sdl:event-loop&lt;br /&gt;     (:key-down (key)&lt;br /&gt;          (when (= key (char-code #\q))&lt;br /&gt;        (progn&lt;br /&gt;          (sdl-mix:halt-music)&lt;br /&gt;          (sdl-mix:close-audio)&lt;br /&gt;          (sdl:quit)&lt;br /&gt;          (return))))&lt;br /&gt;     (:quit ()&lt;br /&gt;        (progn&lt;br /&gt;          (sdl-mix:halt-music)&lt;br /&gt;          (sdl-mix:close-audio)&lt;br /&gt;          (sdl:quit)&lt;br /&gt;          (return))))))&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;;; Function to start the alarm&lt;br /&gt;(defun start-alarm (time-value song-path)&lt;br /&gt;  (if (not (before-time-p time-value (get-time)))&lt;br /&gt;      nil&lt;br /&gt;      (progn&lt;br /&gt;    (loop for x from 1&lt;br /&gt;       until (check-time time-value)&lt;br /&gt;       do (progn (print (get-time)) (sleep 10)))&lt;br /&gt;    (format t "~%buzzzzzz... it's ~a:~a~%"&lt;br /&gt;        (first time-value)&lt;br /&gt;        (second time-value))&lt;br /&gt;    (play-alarm song-path))))&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;; sample usage&lt;br /&gt;;(asdf:oos 'asdf:load-op 'sdl-mix)&lt;br /&gt;;(check-time '(9 38))&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;;(before-time-p '(12 7) '(12 12))&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;;(play-alarm "alarm.mp3")&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;;(start-alarm '(12 15) "alarm.mp3")&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/1648420720867048126-7357667939369643474?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/7357667939369643474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=7357667939369643474' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/7357667939369643474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/7357667939369643474'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2009/08/little-alarm-clock-in-lisp.html' title='Little Alarm Clock in LISP'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-9144246870656484105</id><published>2009-07-21T06:31:00.000-07:00</published><updated>2010-02-02T15:23:04.324-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp emacs sbcl ubuntu'/><title type='text'>Setting up SBCL and Emacs on Ubuntu 9.04</title><content type='html'>I am always forgetting how to do this and every now and then I am finding myself installing LISP somewhere so here it goes my how-to so I don't have to google for it anymore... Nothing wrong with googling something though.&lt;br /&gt;&lt;br /&gt;1) sudo apt-get install emacs22-gtk sbcl slime&lt;br /&gt;&lt;br /&gt;2) add the following lines to .emacs on home folder.&lt;br /&gt;&lt;br /&gt;(setq inferior-lisp-program "/usr/bin/sbcl")&lt;br /&gt;(add-to-list 'load-path "/usr/share/common-lisp/source/slime/")&lt;br /&gt;(require 'slime)&lt;br /&gt;(slime-setup)&lt;br /&gt;&lt;br /&gt;Done.&lt;br /&gt;&lt;br /&gt;To test your installation:&lt;br /&gt;&lt;br /&gt;1) Open emacs: (Applications -&amp;gt; Accessories -&amp;gt; Emacs 22 (GTK)&lt;br /&gt;2) Press ALT + X&lt;br /&gt;3) type slime &lt;enter&gt;&lt;/enter&gt;&lt;br /&gt;SBCL will start you should get a prompt like this:&lt;br /&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;; SLIME 2010-01-19&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;CL-USER&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;4) On the prompt type&amp;nbsp;"Hello, World."&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;You should see this:&lt;br /&gt;&lt;br /&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;; SLIME 2010-01-19&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;CL-USER&amp;gt; "Hello, World."&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;"Hello, World."&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;CL-USER&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;5) Congratulations! You have just ran the first obligatory application on any language, but in Lisp!&lt;/span&gt;&lt;br /&gt;6) To quit SLIME+LISP: press , then type quit &lt;enter&gt;&lt;/enter&gt;&lt;enter&gt;&lt;/enter&gt;&lt;br /&gt;7) To quit emacs: CTRL+X CTRL+C&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1648420720867048126-9144246870656484105?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/9144246870656484105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=9144246870656484105' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/9144246870656484105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/9144246870656484105'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2009/07/setting-up-sbcl-and-emacs-on-ubuntu-904.html' title='Setting up SBCL and Emacs on Ubuntu 9.04'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-6734245889209581721</id><published>2009-05-19T07:03:00.000-07:00</published><updated>2009-05-19T12:01:53.203-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>Outside-in</title><content type='html'>I am trying to read OnLisp  by Paul Graham again and I really liked the turn your imperative code outside-in in chapter 3.&lt;br /&gt;&lt;br /&gt;This is almost a reminder to myself.&lt;br /&gt;&lt;br /&gt;Let's say I have an imperative function:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(defun imp-fn (x)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(let ((a 2) result)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(setf result (+ x a))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;result)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I have seen a lot of code like that.&lt;br /&gt;&lt;br /&gt;Turning it outside-in:&lt;br /&gt;1) It returns result what is result?&lt;br /&gt;we can replace it by the expression: (+ x a)&lt;br /&gt;2) what is a?&lt;br /&gt;we can replace it by its expression: (+ x 2)&lt;br /&gt;3) then the result is:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(defun not-so-imp (x)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(+ x 2))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is a very simple example but the idea remains the same. The OnLisp book has another example which is better than this one, but this one is good enough to show off the idea.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1648420720867048126-6734245889209581721?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/6734245889209581721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=6734245889209581721' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/6734245889209581721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/6734245889209581721'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2009/05/outside-in.html' title='Outside-in'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-1339711080659534665</id><published>2008-05-08T08:09:00.001-07:00</published><updated>2008-05-08T08:19:06.406-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>Books on LISP</title><content type='html'>Getting back to the subject of what books should I read if I want to learn LISP. Now I have  a better improved list I feel it will make the transition from anywhere to LISP easier.&lt;br /&gt;&lt;br /&gt;In the order I would suggest a friend to start:&lt;br /&gt;&lt;br /&gt;1) A funny warm up of how fun it is to LISP. &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a title="http://www.lisperati.com/casting.html" href="http://www.lisperati.com/casting.html" id="uwqo"&gt;http://www.lisperati.com/casting.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;2) The beginning of the beginnings (even if not a programmer):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cs.cmu.edu/%7Edst/LispBook/index.html"&gt;http://www.cs.cmu.edu/~dst/LispBook/index.htm&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;3) Still on beginning but a day after:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.psg.com/%7Edlamkins/sl/"&gt;http://www.psg.com/%7Edlamkins/sl/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;4) Getting practical:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.gigamonkeys.com/book/"&gt;http://www.gigamonkeys.com/book/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;5) Getting deep:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.paulgraham.com/onlisp.html"&gt;http://www.paulgraham.com/onlisp.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Good reading!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1648420720867048126-1339711080659534665?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/1339711080659534665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=1339711080659534665' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/1339711080659534665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/1339711080659534665'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2008/05/books-on-lisp.html' title='Books on LISP'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-6655063690400160613</id><published>2008-03-25T22:30:00.000-07:00</published><updated>2008-03-25T22:49:16.855-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='weblocks'/><category scheme='http://www.blogger.com/atom/ns#' term='cells-gtk'/><category scheme='http://www.blogger.com/atom/ns#' term='Domain-Driven Design'/><title type='text'>Weblocks first impressions</title><content type='html'>On a previous post I was commenting on how easy it was to prototype a domain model in lisp. This happens primarily due to its REPL (read-eval-print-loop) way of programming.&lt;br /&gt;&lt;br /&gt;A few days ago I started playing with weblocks which is, as it is referred on its website, "A continuations-based common lisp web framework". The shift of paradigm from page-centric development to something different at first sounded just like something interesting to learn about. Because of that, I tried it a couple of months ago, without much success, trying to replace a league management system I built using only hunchentoot by itself.&lt;br /&gt;&lt;br /&gt;Today, with a little bit more experience in lisp I could manage to build a simple prototype with some of the entities of a domain model I was working on. The results were really impressive, primarily due to the straight forward approach to get the presentation done.&lt;br /&gt;&lt;br /&gt;At first, the whole composite widget centric approach seems overwhelming but at some point it sinks in and we can see how easy it is to "compose" the web user interface for an application using weblocks without having to think about pages and getting data back and forth from the web session.&lt;br /&gt;&lt;br /&gt;Despite the fact that it is still a work in progress, I really liked the feeling of working on a web application and not having to deal with html or ajax to get a nice presentation in minutes. (In my case, one hour, because I had no clue how to use it...)&lt;br /&gt;&lt;br /&gt;Anyway, personally I really like building software without having to work on the UI manually. Auto-generation based on the model or on view definitions seems to be the more productive approach to deliver enterprise based applications.  I wish one day we could have weblocks and cells-gtk, for example working against the same view abstraction and being able to generate desktop and web user interfaces in a seamless way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1648420720867048126-6655063690400160613?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/6655063690400160613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=6655063690400160613' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/6655063690400160613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/6655063690400160613'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2008/03/weblocks-first-impressions.html' title='Weblocks first impressions'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-5744180936735671805</id><published>2008-03-03T10:14:00.000-08:00</published><updated>2008-03-03T10:20:37.543-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='uninstall'/><category scheme='http://www.blogger.com/atom/ns#' term='windows xp'/><title type='text'>Uninstalling on Windows XP without Add Remove Programs</title><content type='html'>I really don't like that Add Remove Programs applet. It is really slow and does not have even an option to remove orphan entries  from the registry. Since I tend to install/uninstall the software I develop a lot, it is a pain to go to that sluggish control panel applet.&lt;br /&gt;&lt;br /&gt;Well, it was, now I found two great options:&lt;br /&gt;&lt;br /&gt;1) C:\windows\installer right-click header and select Author, Title, Comment, find the uninstaller and execute it.&lt;br /&gt;&lt;br /&gt;2) Safarp (blazing fast, don't have to install if you don't want too)&lt;br /&gt;&lt;br /&gt;There are plenty other options, I know. Check out the original articles where I got this great information from:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dotnetjunkies.com/WebLog/saravana/archive/2005/03/25/61316.aspx"&gt;Saravana's blog&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.downloadsquad.com/2007/11/19/windows-add-remove-programs-replacements/"&gt;Download Squad&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1648420720867048126-5744180936735671805?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/5744180936735671805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=5744180936735671805' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/5744180936735671805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/5744180936735671805'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2008/03/uninstalling-on-windows-xp-without-add.html' title='Uninstalling on Windows XP without Add Remove Programs'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-2889824982790455171</id><published>2008-02-29T18:18:00.000-08:00</published><updated>2008-02-29T18:19:23.262-08:00</updated><title type='text'>Why prototype in LISP</title><content type='html'>One of the features I like the most in LISP is to be able to change the code in the middle of the running process and to be able to keep evaluating the functions and variables with the new behavior on the fly. This is an extremely powerful tool when you are trying to figure out the right structure for a given problem. You can play with the different structures and still be able to keep the application running and see how it reacts to the changes you make. It is like running in a self-evaluating forever debug mode. But that is exactly what LISP is, isn't it?&lt;br /&gt;&lt;br /&gt;I can say that when I think about prototyping at the model designing level I am more and more choosing to do it in LISP and then, when I feel more confident about the model port it to c# than to start straight in C#. It is simply more productive in my opinion.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1648420720867048126-2889824982790455171?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/2889824982790455171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=2889824982790455171' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/2889824982790455171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/2889824982790455171'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2008/02/why-prototype-in-lisp.html' title='Why prototype in LISP'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-5140032217807404427</id><published>2008-02-25T18:04:00.001-08:00</published><updated>2008-02-29T10:43:27.696-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sbcl'/><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='asdf'/><title type='text'>Lisp project template with Emacs</title><content type='html'>In my first post I was describing the environment I had to use Lisp. After a few issues, usually related to the fact that Eclipse is really a memory hungry application. I moved back to the Emacs + Slime combination. The only difference from what I used to do prior using cusp is that now I work with a "project" file, just the way eclipse + cusp does. I like the idea of working with an asd file to define the files and dependencies in my project and it is very effective to load and compile all lisp files from my project and start being productive right away.&lt;br /&gt;&lt;br /&gt;In order to get there I created this symbolic link on my .sbcl/system folder to point to my asd file.&lt;br /&gt;&lt;br /&gt;By doing this you are able to load your project using asdf.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1648420720867048126-5140032217807404427?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/5140032217807404427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=5140032217807404427' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/5140032217807404427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/5140032217807404427'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2008/02/cusp-type-of-lisp-project-with-emacs.html' title='Lisp project template with Emacs'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-3434499773159011444</id><published>2007-12-27T21:14:00.000-08:00</published><updated>2007-12-27T21:33:38.000-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Domain-Driven Design'/><title type='text'>DDD - Factories and Repositories</title><content type='html'>There is this chapter about factories and repositories. The first to create new entities or aggregates. The second to retrieve/store the entities from/to a database.&lt;br /&gt;&lt;br /&gt;There is this mysterious  middle ground where you don't have too many associations. Where you normalize but not too much. You create a complex query engine but impose some restrictions to what should be retrieved. I agree, and have been there before, where too many associations tend to cause a graph loading issue. It may appear as too many resources to load an entity by a filter, or even worse, as a lazy initialization - no session in NHibernate. It is very difficult to achieve this middle ground. There is a compromise involved in richness of the model and speed/memory/session handling.  On the other hand, to avoid the use of the associations is a way to kill the domain model completely. Removing its meaning and making it just a set of disconnected types.&lt;br /&gt;&lt;br /&gt;I developed this filter type of criteria that uses allows the client to use the model to retrieve objects using a very declarative syntax. With this approach, by encapsulating the ORM framework and abstracting its complexities, I can say we have 90% or more of all needs satisfied. And it seems like the way to go. But the use of traversal to navigate the domain model, implying in an underlying implicit querying mechanism to retrieve the objects, although powerful, brings us too much complexity in terms of the lazy initialization nightmare. We end up loosing too much time trying to figure out how to fix these infrastructure issues then working on the model. When the issue arises, I have to say.&lt;br /&gt;&lt;br /&gt;I have a feeling that most of the problems we end up having could be solved by a more DDD approach in terms of the usage of aggregates to encapsulate a group of dependent related entities and maintain its invariants. That would simplify a lot the way we interact with the objects in all business logic code and at the same time it would help us to build more reliable user interfaces.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1648420720867048126-3434499773159011444?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/3434499773159011444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=3434499773159011444' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/3434499773159011444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/3434499773159011444'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2007/12/ddd-factories-and-repositories.html' title='DDD - Factories and Repositories'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-2648068792246278112</id><published>2007-12-13T21:08:00.000-08:00</published><updated>2007-12-13T21:19:53.145-08:00</updated><title type='text'>Domain-Driven Design - Aggregates</title><content type='html'>As I go reading this excellent book, the more and more I have to recognize the greatness of this book in terms of its contents.&lt;br /&gt;&lt;br /&gt;This chapter is very clear discussing a very hot topic which is how to encapsulate the invariants of a system.&lt;br /&gt;&lt;br /&gt;I never really used this aggregate concept in my projects but the need for the very same solution became very clear in a recent project I am working on. There is always a heated debate in terms of if the invariants should be by entity, enforced on the database or even using the document model which is very close to aggregate as I understand, they might even be synonyms  depending on who is talking about them.&lt;br /&gt;&lt;br /&gt;The only point I am waiting for a better answer in the next chapters is related to the access of internal aggregate elements: According to Evans, they should be only accessible through the root aggregate entity, but I know many models where one entity from a clear aggregate points to another one on another aggregate. Lets say, details that have links to each other. I tend to think that those type of models might be wrong, and they probably are, but eventually as in the car parts example, one might want to tun a query to get all the cars where the tires needed to be rotated in order to send letters to the customer as a friendly reminder. I will keep on reading and see, I think.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1648420720867048126-2648068792246278112?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/2648068792246278112/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=2648068792246278112' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/2648068792246278112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/2648068792246278112'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2007/12/domain-driven-design-aggregates.html' title='Domain-Driven Design - Aggregates'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-7416604591496760020</id><published>2007-12-12T19:46:00.000-08:00</published><updated>2007-12-12T20:01:24.133-08:00</updated><title type='text'>Domain-Driven Design - Modules</title><content type='html'>I tend to agree with Eric Evans when he talks about Modules in his book. As before, reading his examples and considerations looks like someone who had seen most of what I have experienced as a programmer.&lt;br /&gt;&lt;br /&gt;The technological layer architecture has been used in many of the projects I worked on and is one I always try to push onto the design of my applications, even recent ones. But after the initial benefit we get from the separation of concerns like database access, presentation, services as stateless classes, we end up with a set of layers that really don't like to be extended. Not that they are closed to extension, but the whole concept of the entity is scattered through at least 3 layers and if we use any work flow framework on top of it, we will end up having 5 layers to deal with.&lt;br /&gt;&lt;br /&gt;I am eager to finish up this book and start trying out some of the concepts in small scoped projects just to see where it will lead the code in the end.&lt;br /&gt;&lt;br /&gt;Anyway, modules should be used as a way to simplify the understand of any big domain-model by restricting a set of concepts based on a commonality between them. By using modules effectively we create this subset of functionality that should be easier to grasp than the whole myriad of disconnected information that is usually mangled together in a uncoordinated way in most of the projects I worked in the past.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1648420720867048126-7416604591496760020?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/7416604591496760020/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=7416604591496760020' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/7416604591496760020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/7416604591496760020'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2007/12/domain-driven-design-modules.html' title='Domain-Driven Design - Modules'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-5389655514436218372</id><published>2007-12-11T21:00:00.000-08:00</published><updated>2007-12-11T21:14:16.068-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Domain-Driven Design'/><title type='text'>Studying Domain-Driven Design</title><content type='html'>I started reading the Domain-Driven Design book, by Eric Evans some weeks ago and today I restarted reading the chapter on Entities, Value Objects and Services.&lt;br /&gt;&lt;br /&gt;From the first chapter of the book I had the feeling the author really knows what he is talking about. I always had the feeling that Object Oriented design was a problem when applied to a real world application, especially when we ended up having to decide for more then 30 minutes where a method should be implemented from the actual domain model entities. The service concept is perfect to solve this type of problem nicely by the use of those stateless process coordinators. They have the sole purpose of coordinating the execution of an activity that deals with a group of entities.&lt;br /&gt;&lt;br /&gt;I used to simplify my projects by avoiding the implementation of almost any behavior on an entity, but I am reconsidering my position after reading this excellent book. I didn't finish yet.&lt;br /&gt;&lt;br /&gt;I hope it will give me some light onto this holy grail of software engineering which is to build great software.&lt;br /&gt;&lt;br /&gt;By the way, great software for me is a software that does what it is supposed to do, that is easy to maintain and easy to extend.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1648420720867048126-5389655514436218372?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/5389655514436218372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=5389655514436218372' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/5389655514436218372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/5389655514436218372'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2007/12/studying-domain-driven-design.html' title='Studying Domain-Driven Design'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1648420720867048126.post-7539805454370276675</id><published>2007-11-03T03:23:00.000-07:00</published><updated>2007-12-28T14:46:47.030-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sbcl'/><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='cusp'/><title type='text'>What tools I use to LISP</title><content type='html'>I started to study LISP a while ago and after all this months I am no more than a real beginner, however every time I use LISP I enjoy every piece of code written.&lt;br /&gt;&lt;br /&gt;If you want to be easily up and running using LISP and are used to an IDE like I was. I recommend using CUSP with Eclipse. It is very good in terms of productivity and easy to install. Check out this link that teaches step by step how to install it on your system.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sergeykolos.com/cusp/intro/#libraries"&gt;How to Install and use CUSP on Eclipse&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;By the way I use Ubuntu Linux 7.04 hopefully upgrading by the end of the month to the new 7.10.&lt;br /&gt;&lt;br /&gt;The LISP implementation I use is &lt;a href="http://www.sbcl.org/"&gt;SBCL.&lt;/a&gt; Make sure you have a link to its &lt;a href="http://www.sbcl.org/manual/index.html"&gt;manual&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I started studying the book &lt;span style="font-weight: bold;"&gt;Practical Lisp&lt;/span&gt;, but couldn't finish the book. The examples at the end weren't appealing to me so I switched to &lt;span style="font-weight: bold;"&gt;On Lisp&lt;/span&gt; which is too deep to me as a beginner and finally to &lt;span style="font-weight: bold;"&gt;Successful Lisp&lt;/span&gt;. In my opinion they are all good books, Successful Lisp and Practical Lisp being the best beginner's books. I hope I will be able to get back to On Lisp when I get more experienced.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1648420720867048126-7539805454370276675?l=thawacoupiekak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thawacoupiekak.blogspot.com/feeds/7539805454370276675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1648420720867048126&amp;postID=7539805454370276675' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/7539805454370276675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1648420720867048126/posts/default/7539805454370276675'/><link rel='alternate' type='text/html' href='http://thawacoupiekak.blogspot.com/2007/11/what-tools-i-use-to-lisp.html' title='What tools I use to LISP'/><author><name>Lukas Macedo</name><uri>http://www.blogger.com/profile/10748487690895144522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_3PaSFQm63vU/S0sqySBnHSI/AAAAAAAABp8/REjGSKcGaWk/S220/Lukas_Face.png'/></author><thr:total>0</thr:total></entry></feed>
