Quickit
After Reddit was rewritten in Python, some Lisp fans got the idea of writing clones of Reddit in Lisp. I don't have many spare cycles right now, and I'm not in the market for a long-term project, so I set myself a slightly different goal: I decided to implement the largest possible subset of Reddit's features that I could within one hour.
I think I did an ok job, considering. One hour passes by rather quickly when you try something like this!
Here's the code:
All the above code is released under the BSD license.
Update: After I put Quickit online, a bug was found: Ranking an article down, and then hitting reload would keep ranking that article down. At first I wasn't going to fix the bug. The whole point of the Quickit was to write a clone very quickly. Fixing bugs at this point felt wrong. But I decided to set myself another challenge: Fix the bug and deploy a patch onto the running Lisp process in less than five minutes... It actually took a little over a minute and a half to fix the bug and push the new code onto the server (without, of course, stopping the Lisp process). The patch (to quickit.lisp) is:
55,56c55,56 < (format out "<a href=http://abstractnonsense.org:8000/rankdown?id=~A><img border=0 src=down.png></a> <a href=\"~A\">~A</a> (score ~A)<br>" < (article-id article) (article-url article) (article-description article) (article-score article))))) --- > (format out "<a href=http://abstractnonsense.org:8000/rankdown?from=~A&id=~A><img border=0 src=down.png></a> <a href=\"~A\">~A</a> (score ~A)<br>" > (article-score article) (article-id article) (article-url article) (article-description article) (article-score article))))) 109c109,110 < (id (second (assoc "id" params :test #'equalp)))) --- > (id (second (assoc "id" params :test #'equalp))) > (from (second (assoc "from" params :test #'equalp)))) 111,112c112,114 < (article (find nid articles :key #'article-id))) < (when article --- > (article (find nid articles :key #'article-id)) > (nfrom (parse-integer from :junk-allowed t))) > (when (and article from (= (article-score article) nfrom))
I also moved Quickit from abstractnonsense.org to abstractnonsense.com (actually the same machine) because my dyndns entry for abstractnonsense.org mysteriously stopped working... again, I did this without having to stop the process or lose any of the saved state.