<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;A0ENQnkyfCp7ImA9WhdTGE8.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208</id><updated>2011-07-17T00:21:33.794+09:00</updated><title>letter</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://read-eval-print.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>532</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/rztf" /><feedburner:info uri="blogspot/rztf" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;A0ENRX47fCp7ImA9WhdTGE8.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-8327209579438806590</id><published>2011-07-17T00:21:00.001+09:00</published><updated>2011-07-17T00:21:34.004+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-17T00:21:34.004+09:00</app:edited><title>しらゆり公園プール</title><content type="html">&lt;p&gt;娘としらゆり公園プールに行ってきた。&lt;/p&gt;&lt;p&gt;こども用プールと 25m プールがある。入り口は別々になっていて行き来はできないみたいだった。 1時間 100 円とお安いのが嬉しい。&lt;/p&gt;&lt;p&gt;娘はけのびも、頭までもぐるのもできない状態だったが、 2 時間かけて水中ジャンケンとけのびができるようになった。極端に臆病なんだよね。あと何度行けば泳げるようになるかな。自転車もこのあいだようやく乗れるようになったくらいだからな。がんばれ小学 3 年生。&lt;/p&gt;&lt;p&gt;日焼けと筋肉疲労でぐったりだ。ひさしぶりに泳いだのは気持ちよかった。&lt;/p&gt;&lt;p&gt;ところで、『エレガントな問題解決』に載っていた箱を線でつなぐ問題を娘があっという間にといたのには驚いた。たまたまなのか、小学生くらいの方が柔軟なのか。その後、さらに応用問題を自分で作ってた。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-8327209579438806590?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fw_lmfSzSoBktfsOroq1K0ony1o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fw_lmfSzSoBktfsOroq1K0ony1o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fw_lmfSzSoBktfsOroq1K0ony1o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fw_lmfSzSoBktfsOroq1K0ony1o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/j994cG_AUQc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/8327209579438806590/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=8327209579438806590" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/8327209579438806590?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/8327209579438806590?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/j994cG_AUQc/blog-post_17.html" title="しらゆり公園プール" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>0</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/07/blog-post_17.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIAQns4eyp7ImA9WhdTGE8.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-3441678441672504521</id><published>2011-07-17T00:02:00.001+09:00</published><updated>2011-07-17T00:02:23.533+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-17T00:02:23.533+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Common Lisp" /><category scheme="http://www.blogger.com/atom/ns#" term="cl-win32ole" /><title>cl-win32ole に空の配列を作る関数 empty-array を追加</title><content type="html">&lt;p&gt;cl-win32ole に &lt;a href='http://code.google.com/p/cl-win32ole/issues/detail?id=1'&gt;issue&lt;/a&gt; をいただいたので対応。&lt;/p&gt;&lt;p&gt;nil を false に変換していたので空の配列を作る方法がなかった。安易に関数 empty-array を作った。&lt;/p&gt;&lt;p&gt;次のコードの後から 2 行目。&lt;/p&gt; &lt;pre class='src'&gt;(asdf:oos 'asdf:load-op &lt;span style='color: #b0c4de;'&gt;:cl-win32ole&lt;/span&gt;)&lt;br /&gt;(use-package &lt;span style='color: #b0c4de;'&gt;:cl-win32ole&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;#|&lt;br /&gt;Dim aNodePath(0)&lt;br /&gt;Set oServM = CreateObject("com.sun.star.ServiceManager")&lt;br /&gt;Set oConfP = oServM.createInstance("com.sun.star.configuration.ConfigurationProvider")&lt;br /&gt;Set aNodePath(0) = oServM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")&lt;br /&gt;aNodePath(0).Name = "nodepath"&lt;br /&gt;aNodePath(0).Value = "/org.openoffice.Setup/Product"&lt;br /&gt;&lt;br /&gt;Set oRegAccess = oConfP.createInstanceWithArguments("com.sun.star.configuration.ConfigurationAccess", aNodePath)&lt;br /&gt;&lt;br /&gt;sOOVersion = oRegAccess.getByName("ooSetupVersionAboutBox")&lt;br /&gt;&lt;br /&gt;MsgBox sOOVersion&lt;br /&gt;|#&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;let*&lt;/span&gt; ((sm (create-object &lt;span style='color: #ffa07a;'&gt;"com.sun.star.ServiceManager"&lt;/span&gt;))&lt;br /&gt;       (cp (ole sm &lt;span style='color: #b0c4de;'&gt;:createInstance&lt;/span&gt; &lt;span style='color: #ffa07a;'&gt;"com.sun.star.configuration.ConfigurationProvider"&lt;/span&gt;))&lt;br /&gt;       (np (ole sm &lt;span style='color: #b0c4de;'&gt;:Bridge_GetStruct&lt;/span&gt; &lt;span style='color: #ffa07a;'&gt;"com.sun.star.beans.PropertyValue"&lt;/span&gt;)))&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;with-slots&lt;/span&gt; (name value) np&lt;br /&gt;    (setf name &lt;span style='color: #ffa07a;'&gt;"nodepath"&lt;/span&gt;)&lt;br /&gt;    (setf value &lt;span style='color: #ffa07a;'&gt;"/org.openoffice.Setup/Product"&lt;/span&gt;)&lt;br /&gt;    (&lt;span style='color: #00ffff;'&gt;let&lt;/span&gt; ((ra (ole cp &lt;span style='color: #b0c4de;'&gt;:createInstanceWithArguments&lt;/span&gt;&lt;br /&gt;                   &lt;span style='color: #ffa07a;'&gt;"com.sun.star.configuration.ConfigurationAccess"&lt;/span&gt;&lt;br /&gt;                   (list np))))&lt;br /&gt;      (&lt;span style='color: #00ffff;'&gt;let&lt;/span&gt; ((v (ole ra &lt;span style='color: #b0c4de;'&gt;:getByName&lt;/span&gt; &lt;span style='color: #ffa07a;'&gt;"ooSetupVersionAboutBox"&lt;/span&gt;)))&lt;br /&gt;        (ole (create-object &lt;span style='color: #ffa07a;'&gt;"WScript.Shell"&lt;/span&gt;) &lt;span style='color: #b0c4de;'&gt;:popup&lt;/span&gt; v)))))&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;#|&lt;br /&gt;Dim aNoArgs()&lt;br /&gt;set oServiceManager = CreateObject("com.sun.star.ServiceManager")&lt;br /&gt;set oDesktop = oServiceManager.createInstance("com.sun.star.frame.Desktop")&lt;br /&gt;set oDoc = oDesktop.loadComponentFromURL("file:///C:/demo.odt", "_blank", 0, aNoArgs)&lt;br /&gt;|#&lt;/span&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;let*&lt;/span&gt; ((sm (create-object &lt;span style='color: #ffa07a;'&gt;"com.sun.star.ServiceManager"&lt;/span&gt;))&lt;br /&gt;       (dt (ole sm &lt;span style='color: #b0c4de;'&gt;:createInstance&lt;/span&gt; &lt;span style='color: #ffa07a;'&gt;"com.sun.star.frame.Desktop"&lt;/span&gt;))&lt;br /&gt;       (doc (ole dt &lt;span style='color: #b0c4de;'&gt;:loadComponentFromURL&lt;/span&gt;&lt;br /&gt;                 &lt;span style='color: #ffa07a;'&gt;"file:///C:/demo.odt"&lt;/span&gt;&lt;br /&gt;                 &lt;span style='color: #ffa07a;'&gt;"_blank"&lt;/span&gt;&lt;br /&gt;                 0&lt;br /&gt;                 (empty-array))))&lt;br /&gt;  doc)&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;マルチスレッドな処理系だと動かないとか、64bit ではどうなんとか、いろいろ気になることはある。。。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-3441678441672504521?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ktbcNMAEagwnAqBsNRoahWdnNcs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ktbcNMAEagwnAqBsNRoahWdnNcs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ktbcNMAEagwnAqBsNRoahWdnNcs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ktbcNMAEagwnAqBsNRoahWdnNcs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/_FVdRoQ_uR4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/3441678441672504521/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=3441678441672504521" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/3441678441672504521?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/3441678441672504521?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/_FVdRoQ_uR4/cl-win32ole-empty-array.html" title="cl-win32ole に空の配列を作る関数 empty-array を追加" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>0</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/07/cl-win32ole-empty-array.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUDRn88fyp7ImA9WhdTEk8.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-6414508977660720626</id><published>2011-07-09T23:04:00.001+09:00</published><updated>2011-07-09T23:04:37.177+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-09T23:04:37.177+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Common Lisp" /><title>ストリームのパス</title><content type="html">&lt;p&gt;&lt;a href='http://www.lispworks.com/documentation/lw50/CLHS/Body/f_pn.htm'&gt;pathname&lt;/a&gt; でとれたのね。&lt;/p&gt; &lt;pre class='src'&gt;(setq x (open &lt;span style='color: #ffa07a;'&gt;"/tmp/foo"&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:direction&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:output&lt;/span&gt;))&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; #&amp;lt;SB-SYS:FD-STREAM for "file /tmp/foo" {100A91F581}&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(pathname x)&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; #P"/tmp/foo"&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(close x)&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; T&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(pathname x)&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; #P"/tmp/foo"&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-6414508977660720626?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/y0FYfROsbKh_qWijsJ54o_AadcQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/y0FYfROsbKh_qWijsJ54o_AadcQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/y0FYfROsbKh_qWijsJ54o_AadcQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/y0FYfROsbKh_qWijsJ54o_AadcQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/N7yP4gmXCHs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/6414508977660720626/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=6414508977660720626" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/6414508977660720626?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/6414508977660720626?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/N7yP4gmXCHs/blog-post.html" title="ストリームのパス" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>0</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/07/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUAGSXgyfSp7ImA9WhZaFkQ.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-8552146169166388454</id><published>2011-07-03T21:55:00.001+09:00</published><updated>2011-07-03T21:55:28.695+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-03T21:55:28.695+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Prolog" /><category scheme="http://www.blogger.com/atom/ns#" term="Common Lisp" /><title>PAIProlog に atom-characters/2, string-atom/2, string-list/2 を実装</title><content type="html">&lt;p&gt;atom-characters/2, string-atom/2, string-list/2 を実装した。&lt;/p&gt;&lt;p&gt;&lt;a href='https://github.com/quek/paiprolog'&gt;https://github.com/quek/paiprolog&lt;/a&gt;&lt;/p&gt; &lt;pre class='src'&gt;PAIPROLOG&amp;gt; (prolog-first (?x)&lt;br /&gt;             (atom-characters ?x (#\H #\E #\L #\L #\O)))&lt;br /&gt;HELLO&lt;br /&gt;PAIPROLOG&amp;gt; (prolog-first (?x)&lt;br /&gt;             (atom-characters ?x (#\H #\E #\L #\l #\O)))&lt;br /&gt;|HELlO|&lt;br /&gt;PAIPROLOG&amp;gt; (prolog-first (?x)&lt;br /&gt;             (atom-characters hello ?x))&lt;br /&gt;(#\H #\E #\L #\L #\O)&lt;br /&gt;PAIPROLOG&amp;gt; (prolog-first (?x)&lt;br /&gt;             (string-atom &lt;span style='color: #ffa07a;'&gt;"hello"&lt;/span&gt; ?x))&lt;br /&gt;|hello|&lt;br /&gt;PAIPROLOG&amp;gt; (prolog-first (?x)&lt;br /&gt;             (string-atom ?x hello))&lt;br /&gt;&lt;span style='color: #ffa07a;'&gt;"HELLO"&lt;/span&gt;&lt;br /&gt;PAIPROLOG&amp;gt; (prolog-first (?x)&lt;br /&gt;             (string-atom ?x |hello|))&lt;br /&gt;&lt;span style='color: #ffa07a;'&gt;"hello"&lt;/span&gt;&lt;br /&gt;PAIPROLOG&amp;gt; (prolog-first (?x)&lt;br /&gt;             (string-list &lt;span style='color: #ffa07a;'&gt;"hello"&lt;/span&gt; ?x))&lt;br /&gt;(#\h #\e #\l #\l #\o)&lt;br /&gt;PAIPROLOG&amp;gt; (prolog-first (?x)&lt;br /&gt;             (string-list ?x (#\h #\e #\L #\l #\o)))&lt;br /&gt;&lt;span style='color: #ffa07a;'&gt;"heLlo"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-8552146169166388454?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/RAiDzuhrhasXwwP2VmEztM4dhG4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RAiDzuhrhasXwwP2VmEztM4dhG4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/RAiDzuhrhasXwwP2VmEztM4dhG4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RAiDzuhrhasXwwP2VmEztM4dhG4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/pkTzKSxAH0s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/8552146169166388454/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=8552146169166388454" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/8552146169166388454?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/8552146169166388454?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/pkTzKSxAH0s/paiprolog-atom-characters2-string-atom2.html" title="PAIProlog に atom-characters/2, string-atom/2, string-list/2 を実装" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>0</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/07/paiprolog-atom-characters2-string-atom2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0AHR3k_cSp7ImA9WhZbFUU.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-6550230029162386888</id><published>2011-06-19T23:47:00.001+09:00</published><updated>2011-06-21T01:02:16.749+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-21T01:02:16.749+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Common Lisp" /><title>SERIES の producing の中での setf</title><content type="html">&lt;p&gt;次のように SERIES の producing の中での setf を使うと &lt;code&gt;(setf b (car a))&lt;/code&gt; のところが &lt;code&gt;(setf nil (car a))&lt;/code&gt; になりエラーとなる。&lt;/p&gt; &lt;pre class="src"&gt;(&lt;span style="color: #00ffff;"&gt;defun&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;foo&lt;/span&gt; ()&lt;br /&gt;  (&lt;span style="color: #00ffff;"&gt;declare&lt;/span&gt; (optimizable-series-function))&lt;br /&gt;  (producing (z) ((a '(1 2 3)) b)&lt;br /&gt;             (&lt;span style="color: #00ffff;"&gt;loop&lt;/span&gt;&lt;br /&gt;               (&lt;span style="color: #00ffff;"&gt;tagbody&lt;/span&gt;&lt;br /&gt;                  (&lt;span style="color: #00ffff;"&gt;if&lt;/span&gt; (endp a)&lt;br /&gt;                      (terminate-producing))&lt;br /&gt;                  (setf b (car a))&lt;br /&gt;                  (setf a (cdr a))&lt;br /&gt;                  (next-out z b)))))&lt;br /&gt;&lt;br /&gt;(collect (foo))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;s-code.lisp をながめると&lt;/p&gt; &lt;pre class="src"&gt;&lt;span style="color: #ff7f24;"&gt;;;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;13. Allow `SETF like SETQ' in PRODUCING forms.&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;とあるのだけど、&lt;/p&gt; &lt;pre class="src"&gt;        (&lt;span style="color: #00ffff;"&gt;cond&lt;/span&gt; ((and (consp f) (&lt;span style="color: #00ffff;"&gt;case&lt;/span&gt; (car f) ((setq) t))) &lt;span style="color: #ff7f24;"&gt;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;setf removed for now&lt;br /&gt;&lt;/span&gt;               (cl:multiple-value-bind (vars lastbind binds) (detangle2 (cdr f))&lt;br /&gt;                 (&lt;span style="color: #00ffff;"&gt;unless&lt;/span&gt; (cdr lastbind)&lt;br /&gt;                   (ers 50 &lt;span style="color: #ffa07a;"&gt;"~%missing value in assignment: "&lt;/span&gt; f))&lt;br /&gt;                 &lt;span style="color: #ff7f24;"&gt;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;setf still not supported - need to make caller setf-aware&lt;br /&gt;&lt;/span&gt;                 (cl:let ((expr (cons 'setq &lt;span style="color: #ff7f24;"&gt;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;should be setf&lt;br /&gt;&lt;/span&gt;                                      (mapcan #'xform-assignment vars binds))))&lt;br /&gt;                   &lt;span style="color: #ff7f24;"&gt;;;&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;(format t "~s" expr)&lt;br /&gt;&lt;/span&gt;                   (push expr revbody))))&lt;br /&gt;              ...)&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;今はみたいなことになっている。&lt;/p&gt;&lt;p&gt;きっと何か問題があったんだろうけど、なんだろう？とりあえず、case のところだけ&lt;/p&gt; &lt;pre class="src"&gt;(&lt;span style="color: #00ffff;"&gt;case&lt;/span&gt; (car f) ((setq setf) t))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;にしてみたら上記の foo は動いたけど&lt;/p&gt; &lt;pre class="src"&gt;(&lt;span style="color: #00ffff;"&gt;defun&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;foo&lt;/span&gt; ()&lt;br /&gt;  (&lt;span style="color: #00ffff;"&gt;declare&lt;/span&gt; (optimizable-series-function))&lt;br /&gt;  (producing (z) ((a '(1 2 3)) (b (list nil)) c)&lt;br /&gt;             (&lt;span style="color: #00ffff;"&gt;loop&lt;/span&gt;&lt;br /&gt;               (&lt;span style="color: #00ffff;"&gt;tagbody&lt;/span&gt;&lt;br /&gt;                  (&lt;span style="color: #00ffff;"&gt;if&lt;/span&gt; (endp a)&lt;br /&gt;                      (terminate-producing))&lt;br /&gt;                  (setf (car b) (car a))&lt;br /&gt;                  (setf c b)&lt;br /&gt;                  (setf a (cdr a))&lt;br /&gt;                  (next-out z c)))))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;みたいのは動かない。 &lt;code&gt;; should be setf&lt;/code&gt; のところを setf にしたら、 &lt;code&gt;(SETQ NIL #:OUT-2)&lt;/code&gt; になってだめ。&lt;/p&gt;&lt;p&gt;ってところで力つきた。。。&lt;/p&gt;&lt;p&gt;[2011-06-21] ちょっとちがったので修正した。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-6550230029162386888?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/33V16FdTOHT0HNb1dqaJoOkKdAg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/33V16FdTOHT0HNb1dqaJoOkKdAg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/33V16FdTOHT0HNb1dqaJoOkKdAg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/33V16FdTOHT0HNb1dqaJoOkKdAg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/JobyXO6xUP4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/6550230029162386888/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=6550230029162386888" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/6550230029162386888?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/6550230029162386888?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/JobyXO6xUP4/series-producing-setf.html" title="SERIES の producing の中での setf" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>0</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/06/series-producing-setf.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIBQ3Y8cCp7ImA9WhZbFEQ.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-6035995228133734540</id><published>2011-06-18T13:38:00.001+09:00</published><updated>2011-06-19T23:42:32.878+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-19T23:42:32.878+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Common Lisp" /><title>SERIES を series:install して使うときの defpackage</title><content type="html">&lt;p&gt;&lt;code&gt;LET LET* MULTIPLE-VALUE-BIND FUNCALL DEFUN&lt;/code&gt; を shadowing import するので &lt;code&gt;defpackage&lt;/code&gt; をラップするマクロがあると楽。&lt;/p&gt; &lt;pre class="src"&gt;(&lt;span style="color: #00ffff;"&gt;defmacro&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;sdefpackage&lt;/span&gt; (package &lt;span style="color: #98fb98;"&gt;&amp;amp;rest&lt;/span&gt; options)&lt;br /&gt;  `(&lt;span style="color: #00ffff;"&gt;progn&lt;/span&gt;&lt;br /&gt;     (&lt;span style="color: #00ffff;"&gt;defpackage&lt;/span&gt; ,package&lt;br /&gt;       ,@options&lt;br /&gt;       (&lt;span style="color: #b0c4de;"&gt;:use&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:series&lt;/span&gt;)&lt;br /&gt;       (&lt;span style="color: #b0c4de;"&gt;:shadowing-import-from&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:series&lt;/span&gt; ,@series::/series-forms/))&lt;br /&gt;     (series::install &lt;span style="color: #b0c4de;"&gt;:pkg&lt;/span&gt; ,package &lt;span style="color: #b0c4de;"&gt;:implicit-map&lt;/span&gt; t)))&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-6035995228133734540?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/v2cil0QSI7GPYD-_c5pLg40EJhI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/v2cil0QSI7GPYD-_c5pLg40EJhI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/v2cil0QSI7GPYD-_c5pLg40EJhI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/v2cil0QSI7GPYD-_c5pLg40EJhI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/92CBMAW1uo0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/6035995228133734540/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=6035995228133734540" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/6035995228133734540?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/6035995228133734540?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/92CBMAW1uo0/series-seriesinstall-defpackage.html" title="SERIES を series:install して使うときの defpackage" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>0</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/06/series-seriesinstall-defpackage.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04GQHs9fCp7ImA9WhZUEk0.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-3396336832913567537</id><published>2011-06-05T01:45:00.001+09:00</published><updated>2011-06-05T01:45:21.564+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-05T01:45:21.564+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Common Lisp" /><title>change-class でモードの実装</title><content type="html">&lt;p&gt;McCLIM の ESA では change-class を使ってバッファ（エディタ）のモードを実装している。それそまねて、少しコードを書いてみた。&lt;/p&gt;&lt;p&gt;ESA では "anonymous classes are the ugly child of CL" ということで、あえて無名クラスではなく defclass を eval するようにしている（ESA/utils.lisp）。私の方は何も考えず無名クラスでいってみようと思う。&lt;/p&gt;&lt;p&gt;有効にするモードをスーパークラスにし指定して standard-class を make-instance して、それに change-class する。多重継承大好き。&lt;/p&gt;&lt;p&gt;ところで、McCLIM のソースは MOP のいろんな機能を使っていておもしろい。&lt;/p&gt; &lt;pre class='src'&gt;(&lt;span style='color: #00ffff;'&gt;in-package&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:info.read-eval-print.editor&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;anonymous-class-p&lt;/span&gt; (class)&lt;br /&gt;  (null (class-name class)))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defgeneric&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;enable-mode&lt;/span&gt; (mode mode-to-enable &lt;span style='color: #98fb98;'&gt;&amp;amp;rest&lt;/span&gt; initargs)&lt;br /&gt;  (&lt;span style='color: #b0c4de;'&gt;:method&lt;/span&gt; (mode mode-to-enable &lt;span style='color: #98fb98;'&gt;&amp;amp;rest&lt;/span&gt; initargs)&lt;br /&gt;    (&lt;span style='color: #00ffff;'&gt;let*&lt;/span&gt; ((current-class (class-of mode))&lt;br /&gt;           (superclasses (cons(find-class mode-to-enable)&lt;br /&gt;                              (&lt;span style='color: #00ffff;'&gt;if&lt;/span&gt; (anonymous-class-p current-class)&lt;br /&gt;                                  (c2mop:class-direct-superclasses current-class)&lt;br /&gt;                                  (list current-class))))&lt;br /&gt;           (new-class (make-instance 'c2mop:standard-class&lt;br /&gt;                                     &lt;span style='color: #b0c4de;'&gt;:direct-superclasses&lt;/span&gt; superclasses)))&lt;br /&gt;      (apply #'change-class mode new-class initargs))))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defgeneric&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;disable-mode&lt;/span&gt; (mode mode-to-disable &lt;span style='color: #98fb98;'&gt;&amp;amp;rest&lt;/span&gt; initargs)&lt;br /&gt;  (&lt;span style='color: #b0c4de;'&gt;:method&lt;/span&gt; (mode mode-to-disable &lt;span style='color: #98fb98;'&gt;&amp;amp;rest&lt;/span&gt; initargs)&lt;br /&gt;    (&lt;span style='color: #00ffff;'&gt;let*&lt;/span&gt; ((current-class (class-of mode))&lt;br /&gt;           (superclasses (remove (find-class mode-to-disable)&lt;br /&gt;                                 (c2mop:class-direct-superclasses current-class)))&lt;br /&gt;           (new-class (make-instance 'c2mop:standard-class&lt;br /&gt;                                     &lt;span style='color: #b0c4de;'&gt;:direct-superclasses&lt;/span&gt; superclasses)))&lt;br /&gt;      (apply #'change-class mode new-class initargs))))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defgeneric&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;enabled-mode&lt;/span&gt; (mode)&lt;br /&gt;  (&lt;span style='color: #b0c4de;'&gt;:method&lt;/span&gt; (mode)&lt;br /&gt;    (&lt;span style='color: #00ffff;'&gt;let&lt;/span&gt; ((class (class-of mode)))&lt;br /&gt;      (&lt;span style='color: #00ffff;'&gt;if&lt;/span&gt; (anonymous-class-p class)&lt;br /&gt;          (collect (class-name (scan (c2mop:class-direct-superclasses class))))&lt;br /&gt;          (list (class-name class))))))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defgeneric&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;key-binding&lt;/span&gt; (mode keyseq)&lt;br /&gt;  (&lt;span style='color: #b0c4de;'&gt;:method-combination&lt;/span&gt; or))&lt;br /&gt;&lt;br /&gt;(defclass* key-map ()&lt;br /&gt;  ((map (make-hash-table &lt;span style='color: #b0c4de;'&gt;:test&lt;/span&gt; #'equal))))&lt;br /&gt;&lt;br /&gt;(defclass* mode ()&lt;br /&gt;  ((name nil)&lt;br /&gt;   (key-map (make-instance 'key-map))))&lt;br /&gt;&lt;br /&gt;(defclass* fundamental-mode (mode)&lt;br /&gt;  ())&lt;br /&gt;&lt;br /&gt;(defclass* lisp-mode (mode)&lt;br /&gt;  ())&lt;br /&gt;&lt;br /&gt;(defclass* common-lisp-mode (lisp-mode)&lt;br /&gt;  ())&lt;br /&gt;&lt;br /&gt;(defclass* show-paren-mode (mode)&lt;br /&gt;  ())&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defmethod&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;print-object&lt;/span&gt; ((x mode) stream)&lt;br /&gt;  (print-unreadable-object (x stream)&lt;br /&gt;    (format stream &lt;span style='color: #ffa07a;'&gt;"~a ~(~{~a~^ ~}~)"&lt;/span&gt; (name-of x) (enabled-mode x))))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;let&lt;/span&gt; ((x (make-instance 'fundamental-mode &lt;span style='color: #b0c4de;'&gt;:name&lt;/span&gt; &lt;span style='color: #ffa07a;'&gt;"*scratch*"&lt;/span&gt;)))&lt;br /&gt;  (print x)&lt;br /&gt;  (enable-mode x 'common-lisp-mode)&lt;br /&gt;  (print x)&lt;br /&gt;  (enable-mode x 'show-paren-mode)&lt;br /&gt;  (print x)&lt;br /&gt;  (disable-mode x 'common-lisp-mode)&lt;br /&gt;  (print x)&lt;br /&gt;  (disable-mode x 'show-paren-mode)&lt;br /&gt;  (print x))&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;-&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;#&amp;lt;*scratch* fundamental-mode&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;#&amp;lt;*scratch* common-lisp-mode fundamental-mode&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;#&amp;lt;*scratch* show-paren-mode common-lisp-mode fundamental-mode&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;#&amp;lt;*scratch* show-paren-mode fundamental-mode&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;#&amp;lt;*scratch* fundamental-mode&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; #&amp;lt;*scratch* fundamental-mode&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;let&lt;/span&gt; ((x (make-instance 'c2cl:standard-class&lt;br /&gt;                        &lt;span style='color: #b0c4de;'&gt;:direct-superclasses&lt;/span&gt; (list (find-class 'common-lisp-mode)&lt;br /&gt;                                                   (find-class 'show-paren-mode)))))&lt;br /&gt;  (print (c2mop:class-direct-superclasses x))&lt;br /&gt;  (print (make-instance x &lt;span style='color: #b0c4de;'&gt;:name&lt;/span&gt; &lt;span style='color: #ffa07a;'&gt;"ま"&lt;/span&gt;))&lt;br /&gt;  x)&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;-&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;(#&amp;lt;STANDARD-CLASS COMMON-LISP-MODE&amp;gt; #&amp;lt;STANDARD-CLASS SHOW-PAREN-MODE&amp;gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;#&amp;lt;ま (COMMON-LISP-MODE SHOW-PAREN-MODE)&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; #&amp;lt;STANDARD-CLASS NIL {10048B11E1}&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-3396336832913567537?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kuLyV1Dwmgkcxun3DwbK1pbDk8w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kuLyV1Dwmgkcxun3DwbK1pbDk8w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/kuLyV1Dwmgkcxun3DwbK1pbDk8w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kuLyV1Dwmgkcxun3DwbK1pbDk8w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/ivfenCpR6CU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/3396336832913567537/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=3396336832913567537" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/3396336832913567537?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/3396336832913567537?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/ivfenCpR6CU/change-class.html" title="change-class でモードの実装" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>0</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/06/change-class.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQCRHw7fip7ImA9WhZWFEs.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-5506768557935838203</id><published>2011-05-15T19:31:00.001+09:00</published><updated>2011-05-15T21:26:05.206+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-15T21:26:05.206+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Common Lisp" /><title>change-class が便利</title><content type="html">&lt;p&gt;CL-Gtk2 を触ってみたらとてもよかったので、エディタを使ってみている。&lt;/p&gt;&lt;p&gt;GtkSourceBuffer で編集対象をあつかうただが、オープンしたファイル名なども一緒に GtkSourceBuffer に持っていてほしい。&lt;/p&gt;&lt;p&gt;そこで change-class してみた。&lt;/p&gt;&lt;p&gt;GtkSourceBuffer は CL-Gtk2 では source-buffer クラスになっている。 source-buffer クラスを継承して欲しいスロットを持ったクラスを作る。 source-buffer のインスタンスができたところで、その作ったクラスに change-class する。&lt;/p&gt; &lt;pre class="src"&gt;(defclass* buffer (source-buffer)&lt;br /&gt;  ((view)&lt;br /&gt;   (name nil)&lt;br /&gt;   (file nil)&lt;br /&gt;   (yank &lt;span style="color: #ffa07a;"&gt;"AAAA"&lt;/span&gt;)&lt;br /&gt;   (digit-argument nil &lt;span style="color: #b0c4de;"&gt;:accessor&lt;/span&gt; nil)&lt;br /&gt;   (external-format &lt;span style="color: #b0c4de;"&gt;:utf-8&lt;/span&gt;))&lt;br /&gt;  (&lt;span style="color: #b0c4de;"&gt;:metaclass&lt;/span&gt; gobject-class))&lt;br /&gt;&lt;br /&gt;(change-class (make-instance 'source-buffer)&lt;br /&gt;              'buffer&lt;br /&gt;              &lt;span style="color: #b0c4de;"&gt;:name&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"command buffer"&lt;/span&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;動的プロキシとかデリゲートとか意味ないな (特異メソッドはまた違う話しか) 。&lt;/p&gt;&lt;p&gt;MOP なら動的にスーパークラスを追加する手もあるかもしれない。&lt;/p&gt;&lt;p&gt;あっ、make-instance したのを change-class するのはひどい例だった。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-5506768557935838203?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/K-z81vH90nozENhBRTs2_q7pCO0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/K-z81vH90nozENhBRTs2_q7pCO0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/K-z81vH90nozENhBRTs2_q7pCO0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/K-z81vH90nozENhBRTs2_q7pCO0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/4R2_gbWo-Us" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/5506768557935838203/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=5506768557935838203" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/5506768557935838203?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/5506768557935838203?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/4R2_gbWo-Us/change-class.html" title="change-class が便利" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>0</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/05/change-class.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEAQXgzfyp7ImA9WhZXGE4.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-4824547939326573419</id><published>2011-05-08T15:04:00.001+09:00</published><updated>2011-05-08T15:04:00.687+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-08T15:04:00.687+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Common Lisp" /><title>Google Code Jam Qualification Round 2011</title><content type="html">&lt;p&gt;参加した。&lt;/p&gt;&lt;p&gt;もちろん使用言語は Common Lisp&lt;/p&gt; &lt;h4&gt;A Bot Trust&lt;/h4&gt; &lt;p class='first'&gt;オレンジが仕事している間もブル一は仕事できる。まずは、 O の仕事と B の仕事をグルーピングしよう。 loop で書きかけたら、何だか書きにくい。再帰で書く。&lt;/p&gt;&lt;p&gt;あ、だめだ。 B 1 B 2 と連続していたら、O が仕事している間にできるのは、 B 1 の分だけだ。 &lt;code&gt;(setf prev-sec 0)&lt;/code&gt; が必要。&lt;/p&gt;&lt;p&gt;ボタンを押す分を足すの忘れてる。 &lt;code&gt;1+&lt;/code&gt; 追加。&lt;/p&gt;&lt;p&gt;2ヵ所で &lt;code&gt;(if (eq curr-robot 'o)&lt;/code&gt; とか判定してるのきたないな。。。ま、いいか。&lt;/p&gt;&lt;p&gt;うん、動いた。よさそう。&lt;/p&gt;&lt;p&gt;入力は、リーダがあってよかった。&lt;/p&gt;&lt;p&gt;Small も Larg もかわらないね。&lt;/p&gt; &lt;pre class='src'&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;Google Code Jam&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;Qualification Round 2011&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;A Bot Trust&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;Common Lisp&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;46min&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;grouping&lt;/span&gt; (x &lt;span style='color: #98fb98;'&gt;&amp;amp;optional&lt;/span&gt; acc last-color)&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;if&lt;/span&gt; (null x)&lt;br /&gt;      (mapcar #'nreverse (nreverse acc))&lt;br /&gt;      (&lt;span style='color: #00ffff;'&gt;let&lt;/span&gt; ((color (car x))&lt;br /&gt;            (button (cadr x)))&lt;br /&gt;        (&lt;span style='color: #00ffff;'&gt;if&lt;/span&gt; (eq color last-color)&lt;br /&gt;            (push button (car acc))&lt;br /&gt;            (push (list button) acc))&lt;br /&gt;        (grouping (cddr x) acc color))))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;compute&lt;/span&gt; (seq)&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;loop&lt;/span&gt; with o-pos = 1&lt;br /&gt;        with b-pos = 1&lt;br /&gt;        for prev-sec = 0 then curr-sec&lt;br /&gt;        for curr-robot = 'o then (&lt;span style='color: #00ffff;'&gt;if&lt;/span&gt; (eq curr-robot 'o) 'b 'o)&lt;br /&gt;        for xs in seq&lt;br /&gt;        for curr-sec = (&lt;span style='color: #00ffff;'&gt;loop&lt;/span&gt; for x in xs&lt;br /&gt;                             sum (&lt;span style='color: #00ffff;'&gt;prog1&lt;/span&gt;&lt;br /&gt;                                     (max 1 (- (1+ (abs (- x (&lt;span style='color: #00ffff;'&gt;if&lt;/span&gt; (eq curr-robot 'o) o-pos b-pos))))&lt;br /&gt;                                               prev-sec))&lt;br /&gt;                                   (setf prev-sec 0)&lt;br /&gt;                                   (&lt;span style='color: #00ffff;'&gt;if&lt;/span&gt; (eq curr-robot 'o)&lt;br /&gt;                                       (setf o-pos x)&lt;br /&gt;                                       (setf b-pos x))))&lt;br /&gt;        sum curr-sec))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(compute (grouping '(O 2 B 1 B 2 O 4)))&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; 6&lt;br /&gt;&lt;/span&gt;(compute (grouping '(O 5 O 8 B 100)))&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; 100&lt;br /&gt;&lt;/span&gt;(compute (grouping '(B 2 B 1)))&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; 4&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;read-input&lt;/span&gt; ()&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;loop&lt;/span&gt; repeat (read)&lt;br /&gt;        collect (&lt;span style='color: #00ffff;'&gt;loop&lt;/span&gt; repeat (read)&lt;br /&gt;                      append (list (read) (read))) ))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;main&lt;/span&gt; ()&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;loop&lt;/span&gt; for x in (read-input)&lt;br /&gt;        for i from 1&lt;br /&gt;        do (format t &lt;span style='color: #ffa07a;'&gt;"Case #~d: ~d~%"&lt;/span&gt; i (compute (grouping x)))))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;main-with-file&lt;/span&gt; (input-file)&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;let&lt;/span&gt; ((input-file (make-pathname &lt;span style='color: #b0c4de;'&gt;:name&lt;/span&gt; (pathname-name input-file)&lt;br /&gt;                                   &lt;span style='color: #b0c4de;'&gt;:type&lt;/span&gt; (pathname-type input-file)&lt;br /&gt;                                   &lt;span style='color: #b0c4de;'&gt;:defaults&lt;/span&gt; &lt;span style='color: #ffa07a;'&gt;"~/letter/lisp/try/google-code-jam/2011/a/qualification-round/"&lt;/span&gt;)))&lt;br /&gt;    (&lt;span style='color: #00ffff;'&gt;with-open-file&lt;/span&gt; (*standard-input* input-file)&lt;br /&gt;      (&lt;span style='color: #00ffff;'&gt;with-open-file&lt;/span&gt; (*standard-output* (make-pathname &lt;span style='color: #b0c4de;'&gt;:defaults&lt;/span&gt; input-file &lt;span style='color: #b0c4de;'&gt;:type&lt;/span&gt; &lt;span style='color: #ffa07a;'&gt;"out"&lt;/span&gt;)&lt;br /&gt;                                         &lt;span style='color: #b0c4de;'&gt;:direction&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:output&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:if-exists&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:supersede&lt;/span&gt;)&lt;br /&gt;        (main)))))&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;(main-with-file "A-small-attempt0.in")&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(main-with-file &lt;span style='color: #ffa07a;'&gt;"A-large.in"&lt;/span&gt;)&lt;br /&gt;&lt;/pre&gt; &lt;h4&gt;B Magicka&lt;/h4&gt; &lt;p class='first'&gt;えっと、、、複雑だな。&lt;/p&gt;&lt;p&gt;愚直にとけばいいのか。Q F が来たら T になる。あ、Q が残っちゃってる。 &lt;code&gt;(setf acc (cons combine acc))&lt;/code&gt; じゃなって &lt;code&gt;(setf acc (cons combine (cdr acc)))&lt;/code&gt; だ。&lt;/p&gt;&lt;p&gt;愚直にといて Large でも問題ないみたい。&lt;/p&gt; &lt;pre class='src'&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;Google Code Jam&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;Qualification Round 2011&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;B Magicka&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;Common Lisp&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;70min&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;declaim&lt;/span&gt; (optimize (debug 3) (safety 3)))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;compute-combine&lt;/span&gt; (a b combines)&lt;br /&gt;  (and a&lt;br /&gt;       (&lt;span style='color: #00ffff;'&gt;loop&lt;/span&gt; for (x y z) in combines&lt;br /&gt;             if (or (and (eq x a) (eq y b))&lt;br /&gt;                    (and (eq x b) (eq y a)))&lt;br /&gt;               do (&lt;span style='color: #00ffff;'&gt;return-from&lt;/span&gt; compute-combine z))&lt;br /&gt;       nil))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;opposed-p&lt;/span&gt; (acc opposds)&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;loop&lt;/span&gt; for (x y) in opposds&lt;br /&gt;        thereis (and (member x acc)&lt;br /&gt;                     (member y acc))))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;compute&lt;/span&gt; (combines opposeds invokes)&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;loop&lt;/span&gt; with acc = nil&lt;br /&gt;        for x in invokes&lt;br /&gt;        for combine = (compute-combine (car acc) x combines)&lt;br /&gt;        if combine&lt;br /&gt;          do (setf acc (cons combine (cdr acc)))&lt;br /&gt;        else&lt;br /&gt;          do (push x acc)&lt;br /&gt;        end&lt;br /&gt;        if (opposed-p acc opposeds)&lt;br /&gt;          do (setf acc nil)&lt;br /&gt;        end&lt;br /&gt;        finally (&lt;span style='color: #00ffff;'&gt;return&lt;/span&gt; (nreverse acc))))&lt;br /&gt;&lt;br /&gt;(compute '() '() '(e a))&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; (E A)&lt;br /&gt;&lt;/span&gt;(compute '((q r i)) '() '(r r q r))&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; (R I R)&lt;br /&gt;&lt;/span&gt;(compute '((q f t)) '((q f)) '(f a q f d f q))&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; (F D T)&lt;br /&gt;&lt;/span&gt;(compute '((e e z)) '((q e)) '(q e e e e r a))&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; (Z E R A)&lt;br /&gt;&lt;/span&gt;(compute '() '((q w)) '(q w))&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; NIL&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;str-&amp;gt;sym&lt;/span&gt; (str)&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;loop&lt;/span&gt; for c across (string-upcase str)&lt;br /&gt;        collect (intern (string c))))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;read-input&lt;/span&gt; ()&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;loop&lt;/span&gt; repeat (read)&lt;br /&gt;        collect (list #1=(&lt;span style='color: #00ffff;'&gt;loop&lt;/span&gt; repeat (read)&lt;br /&gt;                               collect (str-&amp;gt;sym (read)))&lt;br /&gt;                      #1#&lt;br /&gt;                      (&lt;span style='color: #00ffff;'&gt;progn&lt;/span&gt; (read) (str-&amp;gt;sym (read))))))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;main&lt;/span&gt; ()&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;loop&lt;/span&gt; for x in (read-input)&lt;br /&gt;        for i from 1&lt;br /&gt;        do (format t &lt;span style='color: #ffa07a;'&gt;"Case #~d: [~{~a~^, ~}]~%"&lt;/span&gt; i (apply #'compute x))))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;main-with-file&lt;/span&gt; (input-file)&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;let&lt;/span&gt; ((input-file (make-pathname &lt;span style='color: #b0c4de;'&gt;:name&lt;/span&gt; (pathname-name input-file)&lt;br /&gt;                                   &lt;span style='color: #b0c4de;'&gt;:type&lt;/span&gt; (pathname-type input-file)&lt;br /&gt;                                   &lt;span style='color: #b0c4de;'&gt;:defaults&lt;/span&gt; &lt;span style='color: #ffa07a;'&gt;"~/letter/lisp/try/google-code-jam/2011/a/qualification-round/"&lt;/span&gt;)))&lt;br /&gt;    (&lt;span style='color: #00ffff;'&gt;with-open-file&lt;/span&gt; (*standard-input* input-file)&lt;br /&gt;      (&lt;span style='color: #00ffff;'&gt;with-open-file&lt;/span&gt; (*standard-output* (make-pathname &lt;span style='color: #b0c4de;'&gt;:defaults&lt;/span&gt; input-file &lt;span style='color: #b0c4de;'&gt;:type&lt;/span&gt; &lt;span style='color: #ffa07a;'&gt;"out"&lt;/span&gt;)&lt;br /&gt;                                         &lt;span style='color: #b0c4de;'&gt;:direction&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:output&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:if-exists&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:supersede&lt;/span&gt;)&lt;br /&gt;        (main)))))&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;(main-with-file "B-small-attempt0.in")&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(main-with-file &lt;span style='color: #ffa07a;'&gt;"B-large.in"&lt;/span&gt;)&lt;br /&gt;&lt;/pre&gt; &lt;h4&gt;C Candy Splitting&lt;/h4&gt;&lt;p&gt;これは logxor か。 2進にして縦にならべてみる。&lt;/p&gt; &lt;pre class='src'&gt;001&lt;br /&gt;010&lt;br /&gt;011&lt;br /&gt;100&lt;br /&gt;101&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;NO になるのは、ある bit で 1 が奇数個の場合。各 bit 毎に 1 の数をかぞえればいいのか。一番大きな bit は &lt;code&gt;integer-length&lt;/code&gt; でとれる。&lt;/p&gt;&lt;p&gt;いや、単に全部を logxor して 0 じゃなければ NO なんだ。 &lt;code&gt;(not (zerop (apply #'logxor list)))&lt;/code&gt;&lt;/p&gt;&lt;p&gt;さて、どうやって分けるか。総当たりだときっと large でだめだよな。&lt;/p&gt;&lt;p&gt;うぅん、わかんない。先に D を見てみよう。と、D を見てみたが D もわからないので、また C に戻る。&lt;/p&gt;&lt;p&gt;もう一度2進で縦に並べたものをながめる。あれ、どこど分けてもいいんじゃないのか。どこで分けても xor で綺麗になる。本当か？ 本当っぽいな。これはひどい Patrick があまりにもかわいそうだろう。&lt;/p&gt;&lt;p&gt;何も考えず総当たりでやっても、全部一回目で当たりだから問題なかったんだ。&lt;/p&gt; &lt;pre class='src'&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;Google Code Jam&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;Qualification Round 2011&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;C Candy Splitting&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;Common Lisp&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;2.5h&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;#|&lt;br /&gt;5 + 4 = 1&lt;br /&gt;7 + 9 = 14&lt;br /&gt;50 + 10 = 56&lt;br /&gt;&lt;br /&gt;#b0101  #b100  #b0001&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;logxor #b0101  #b100)&lt;br /&gt;;;=&amp;gt; 1&lt;br /&gt;  #b0001&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;logxor #b0111  #b1001)&lt;br /&gt;;;=&amp;gt; 14&lt;br /&gt; #b1110&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;logxor #b110010 #b1010)&lt;br /&gt;;;=&amp;gt; 56&lt;br /&gt; #b111000&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1 2 3 4 5 Case #1: NO&lt;br /&gt;&lt;br /&gt;001&lt;br /&gt;010&lt;br /&gt;011&lt;br /&gt;100&lt;br /&gt;101&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3 5 6     Case #2: 11&lt;br /&gt;&lt;br /&gt;011&lt;br /&gt;101&lt;br /&gt;110&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;logxor 5 6)&lt;br /&gt;;;=&amp;gt; 3&lt;br /&gt;&lt;br /&gt;011&lt;br /&gt;101&lt;br /&gt;110&lt;br /&gt;100&lt;br /&gt;100&lt;br /&gt;&lt;br /&gt;|#&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;no-p&lt;/span&gt; (list)&lt;br /&gt;  (not (zerop (apply #'logxor list))))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;compute&lt;/span&gt; (list)&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;unless&lt;/span&gt; (no-p list)&lt;br /&gt;    (&lt;span style='color: #00ffff;'&gt;let&lt;/span&gt; ((sorted (sort list #'&amp;lt;)))&lt;br /&gt;      (apply #'+ (cdr sorted)))))&lt;br /&gt;&lt;br /&gt;(compute '(1 2 3 4 5))&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; NIL&lt;br /&gt;&lt;/span&gt;(compute ' (5 3 6))&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; 11&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;read-input&lt;/span&gt; ()&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;loop&lt;/span&gt; repeat (read)&lt;br /&gt;        collect (&lt;span style='color: #00ffff;'&gt;loop&lt;/span&gt; repeat (read)&lt;br /&gt;                      collect (read))))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;main&lt;/span&gt; ()&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;loop&lt;/span&gt; for x in (read-input)&lt;br /&gt;        for i from 1&lt;br /&gt;        do (format t &lt;span style='color: #ffa07a;'&gt;"Case #~d: ~:[NO~;~:*~d~]~%"&lt;/span&gt; i (compute x))))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;main-with-file&lt;/span&gt; (input-file)&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;let&lt;/span&gt; ((input-file (make-pathname &lt;span style='color: #b0c4de;'&gt;:name&lt;/span&gt; (pathname-name input-file)&lt;br /&gt;                                   &lt;span style='color: #b0c4de;'&gt;:type&lt;/span&gt; (pathname-type input-file)&lt;br /&gt;                                   &lt;span style='color: #b0c4de;'&gt;:defaults&lt;/span&gt; &lt;span style='color: #ffa07a;'&gt;"~/letter/lisp/try/google-code-jam/2011/a/qualification-round/"&lt;/span&gt;)))&lt;br /&gt;    (&lt;span style='color: #00ffff;'&gt;with-open-file&lt;/span&gt; (*standard-input* input-file)&lt;br /&gt;      (&lt;span style='color: #00ffff;'&gt;with-open-file&lt;/span&gt; (*standard-output* (make-pathname &lt;span style='color: #b0c4de;'&gt;:defaults&lt;/span&gt; input-file &lt;span style='color: #b0c4de;'&gt;:type&lt;/span&gt; &lt;span style='color: #ffa07a;'&gt;"out"&lt;/span&gt;)&lt;br /&gt;                                         &lt;span style='color: #b0c4de;'&gt;:direction&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:output&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:if-exists&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:supersede&lt;/span&gt;)&lt;br /&gt;        (main)))))&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;(main-with-file "C-small-attempt0.in")&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(main-with-file &lt;span style='color: #ffa07a;'&gt;"C-large.in"&lt;/span&gt;)&lt;br /&gt;&lt;/pre&gt; &lt;h4&gt;D GoroSort&lt;/h4&gt; &lt;p class='first'&gt;確率か。苦手だ。勉強が必要だなと思っているところ。&lt;/p&gt;&lt;p&gt;10 の -6 乗の精度って普通に &lt;code&gt;float&lt;/code&gt; してもだめなんだ。 &lt;code&gt;(float 1/3 0d0)&lt;/code&gt; と書くのか。&lt;/p&gt;&lt;p&gt;Goro の最適な戦略は何だろう。 Sample #3 の説明には 2 個ずつソートすると書いてある。全部まとめてソートした方がはやくないのか。&lt;/p&gt;&lt;p&gt;2 つずつのソートがベストだと仮定してやってみると Small で失敗。&lt;/p&gt;&lt;p&gt;3 1 2 のソートで考えてみよう。 2 つずつより 3 つまとめての方がはやいように思えるんだけど。。。いくら考えてもわからん。&lt;/p&gt;&lt;p&gt;Large の N は最大 1000 なんで、何か簡単に求める方法があるはず。。。&lt;/p&gt;&lt;p&gt;仕方ないシミュレートしてみよう。シミュレートの方法は入力のリストをそのソート済みのものと 1 要素ずつ比較して、一致しないものだけ collect して新しいリストを作る。できた新しいリストをシャッフルして、あとは空になるまで繰り返す。これで試めしてみると 2 1 4 3 を 2 つずつソートするのと全部まとめてソートするのでステップ数はかわらない。他にも色々試めしてみると、初期状態でソート済の位置にないものの個数がそのまま答えになっているっぽい。そんなものなのか。さっぱり理解できない。 Small やってみたら。通った。ならあってるんだろうと Large を提出。&lt;/p&gt; &lt;pre class='src'&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;Google Code Jam&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;Qualification Round 2011&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;D GoroSort&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;Common Lisp&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;30min 13:00-&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;#|&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;float 1/3 0d0)&lt;br /&gt;;;=&amp;gt; 0.3333333333333333d0&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;3 1 2)&lt;br /&gt;---&lt;br /&gt;a (1 2 3) 1/6&lt;br /&gt;b (1 3 2) 1/2 * 1/2&lt;br /&gt;b (2 1 3)&lt;br /&gt;b (3 2 1)&lt;br /&gt;c (2 3 1)&lt;br /&gt;c (3 1 2)&lt;br /&gt;&lt;br /&gt;N=3&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;+ 1/6 1/12 1/12 1/12)&lt;br /&gt;;;=&amp;gt; 5/12&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;float (/ 1 5/12))&lt;br /&gt;;;=&amp;gt; 2.4&lt;br /&gt;|#&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;shuffle&lt;/span&gt; (list)&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;let&lt;/span&gt; ((list (copy-list list)))&lt;br /&gt;    (&lt;span style='color: #00ffff;'&gt;loop&lt;/span&gt; for len = (length list)&lt;br /&gt;          while list&lt;br /&gt;          collect (&lt;span style='color: #00ffff;'&gt;let&lt;/span&gt; ((n (nth (random len) list)))&lt;br /&gt;                    (setf list (delete n list))&lt;br /&gt;                    n))))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;count-sort-step&lt;/span&gt; (list sorted &lt;span style='color: #98fb98;'&gt;&amp;amp;optional&lt;/span&gt; (n 0))&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;loop&lt;/span&gt; for a in list&lt;br /&gt;        for b in sorted&lt;br /&gt;        if (/= a b)&lt;br /&gt;          collect a into new-list&lt;br /&gt;          and collect b into new-sorted&lt;br /&gt;        finally (&lt;span style='color: #00ffff;'&gt;return&lt;/span&gt;&lt;br /&gt;                  (&lt;span style='color: #00ffff;'&gt;if&lt;/span&gt; (null new-list)&lt;br /&gt;                      n&lt;br /&gt;                      (count-sort-step (shuffle new-list) new-sorted (1+ n))))))&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;#|&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;simulate 1 2 3)&lt;br /&gt;;;=&amp;gt; 0.0d0&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;simulate 1 3 2)&lt;br /&gt;;;=&amp;gt; 2.019098090190981d0&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;simulate 3 1 2)&lt;br /&gt;;;=&amp;gt; 2.996900309969003d0&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;simulate 2 1 4 3)&lt;br /&gt;;;=&amp;gt; 4.000099990001d0&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;simulate 4 3 2 1)&lt;br /&gt;;;=&amp;gt; 3.9836016398360163d0&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;simulate 1 3 4 2)&lt;br /&gt;;;=&amp;gt; 3.014898510148985d0&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;simulate 1 4 3 2)&lt;br /&gt;;;=&amp;gt; 2.0125987401259873d0&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;simulate 1 2 3 4 5)&lt;br /&gt;;;=&amp;gt; 0.0d0&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;simulate 1 2 3 5 4)&lt;br /&gt;;;=&amp;gt; 1.996000399960004d0&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;simulate 1 3 2 5 4)&lt;br /&gt;;;=&amp;gt; 3.978102189781022d0&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;simulate 3 1 5 2 4)&lt;br /&gt;;;=&amp;gt; 5.012198780121988d0&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;simulate 3 1 5 2 6 4)&lt;br /&gt;;;=&amp;gt; 6.052394760523947d0&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;simulate 10 1 2 3 4 5 6 7 8 9)&lt;br /&gt;;;=&amp;gt; 9.93890610938906d0&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;4 3 2 1) 24&lt;br /&gt;----&lt;br /&gt;a (1 2 3 4) 1 1/24&lt;br /&gt;b (1 2 4 3) 6 (* 6/24 1/2)&lt;br /&gt;b (1 3 2 4)&lt;br /&gt;b (1 4 3 2)&lt;br /&gt;b (4 2 3 1)&lt;br /&gt;b (3 2 1 4)&lt;br /&gt;b (2 1 3 4)&lt;br /&gt;c (1 3 4 2) 8 (* 8/24 5/12)&lt;br /&gt;c (1 4 2 3)&lt;br /&gt;c (3 2 4 1)&lt;br /&gt;c (4 2 1 3)&lt;br /&gt;c (4 1 3 2)&lt;br /&gt;c (2 4 3 1)&lt;br /&gt;c (2 3 1 4)&lt;br /&gt;c (3 1 2 4)&lt;br /&gt;d (2 1 4 3) 9&lt;br /&gt;d (2 3 4 1)&lt;br /&gt;d (2 4 1 3)&lt;br /&gt;d (3 1 4 2)&lt;br /&gt;d (3 4 1 2)&lt;br /&gt;d (3 4 2 1)&lt;br /&gt;d (4 1 2 3)&lt;br /&gt;d (4 3 1 2)&lt;br /&gt;d (4 3 2 1)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;+ 1/24 (* 6/24 1/2) (* 8/24 5/12))&lt;br /&gt;;;=&amp;gt; 11/36&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;float (/ 11/36))&lt;br /&gt;;;=&amp;gt; 3.2727273&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;2 1 4 3) =&amp;gt; 4.000000&lt;br /&gt;----&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;2 1)&lt;br /&gt;--&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;1 2) 1/2&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;2 1) 1/2&lt;br /&gt;&lt;br /&gt;|#&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;product&lt;/span&gt; (n &lt;span style='color: #98fb98;'&gt;&amp;amp;optional&lt;/span&gt; (acc 1))&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;if&lt;/span&gt; (zerop n)&lt;br /&gt;      acc&lt;br /&gt;      (product (1- n)&lt;br /&gt;               (* n acc))))&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;#+(or)&lt;br /&gt;(defun compute (array)&lt;br /&gt;  (loop with sorted = (sort (copy-seq array) #'&amp;lt;)&lt;br /&gt;        for x across array&lt;br /&gt;        for i from 0&lt;br /&gt;        if (= x (aref sorted i))&lt;br /&gt;          count 1 into ok&lt;br /&gt;        if (and (not (= x (aref sorted i)))&lt;br /&gt;                (let ((pos (position x sorted :start (1+ i))))&lt;br /&gt;                  (and pos&lt;br /&gt;                       (= (aref sorted i) (aref array pos)))))&lt;br /&gt;          count 1 into swap&lt;br /&gt;        finally (return (values (+ (* 2 swap)&lt;br /&gt;                                   (* 2 (max 0 (- (length array) ok (* swap 2) 1))))&lt;br /&gt;                                (list :ok ok :swap swap :rest (- (length array) ok (* swap 2)))))))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;compute&lt;/span&gt; (array)&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;loop&lt;/span&gt; with sorted = (sort (copy-seq array) #'&amp;lt;)&lt;br /&gt;        for a across array&lt;br /&gt;        for b across sorted&lt;br /&gt;        if (/= a b)&lt;br /&gt;          count 1))&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;#|&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;compute #(3))&lt;br /&gt;;;=&amp;gt; 0&lt;br /&gt;;;=&amp;gt; 0&lt;br /&gt;;;   (:OK 1 :SWAP 0 :REST 0)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;compute #(2 4 1 3))&lt;br /&gt;;;=&amp;gt; 4&lt;br /&gt;;;=&amp;gt; 6&lt;br /&gt;;;   (:OK 0 :SWAP 0 :REST 4)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;compute #(2 1 4 3))&lt;br /&gt;;;=&amp;gt; 4&lt;br /&gt;;;=&amp;gt; 4&lt;br /&gt;;;   (:OK 0 :SWAP 2 :REST 0)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;compute #(2 1))&lt;br /&gt;;;=&amp;gt; 2&lt;br /&gt;;;=&amp;gt; 2&lt;br /&gt;;;   (:OK 0 :SWAP 1 :REST 0)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;compute #(1 3 2))&lt;br /&gt;;;=&amp;gt; 2&lt;br /&gt;;;=&amp;gt; 2&lt;br /&gt;;;   (:OK 1 :SWAP 1 :REST 0)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;compute #(3 1 2))&lt;br /&gt;;;=&amp;gt; 3&lt;br /&gt;;;=&amp;gt; 4&lt;br /&gt;;;   (:OK 0 :SWAP 0 :REST 3)&lt;br /&gt;&lt;br /&gt;|#&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;read-input&lt;/span&gt; ()&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;loop&lt;/span&gt; repeat (read)&lt;br /&gt;        collect (coerce (&lt;span style='color: #00ffff;'&gt;loop&lt;/span&gt; repeat (read)&lt;br /&gt;                              collect (read))&lt;br /&gt;                        'vector)))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;main&lt;/span&gt; ()&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;loop&lt;/span&gt; for x in (read-input)&lt;br /&gt;        for i from 1&lt;br /&gt;        do (format t &lt;span style='color: #ffa07a;'&gt;"Case #~d: ~,6f~%"&lt;/span&gt; i (float (compute x) 1d0))))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;main-with-file&lt;/span&gt; (input-file)&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;let&lt;/span&gt; ((input-file (make-pathname &lt;span style='color: #b0c4de;'&gt;:name&lt;/span&gt; (pathname-name input-file)&lt;br /&gt;                                   &lt;span style='color: #b0c4de;'&gt;:type&lt;/span&gt; (pathname-type input-file)&lt;br /&gt;                                   &lt;span style='color: #b0c4de;'&gt;:defaults&lt;/span&gt; &lt;span style='color: #ffa07a;'&gt;"~/letter/lisp/try/google-code-jam/2011/a/qualification-round/"&lt;/span&gt;)))&lt;br /&gt;    (&lt;span style='color: #00ffff;'&gt;with-open-file&lt;/span&gt; (*standard-input* input-file)&lt;br /&gt;      (&lt;span style='color: #00ffff;'&gt;with-open-file&lt;/span&gt; (*standard-output* (make-pathname &lt;span style='color: #b0c4de;'&gt;:defaults&lt;/span&gt; input-file &lt;span style='color: #b0c4de;'&gt;:type&lt;/span&gt; &lt;span style='color: #ffa07a;'&gt;"out"&lt;/span&gt;)&lt;br /&gt;                                         &lt;span style='color: #b0c4de;'&gt;:direction&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:output&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:if-exists&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:supersede&lt;/span&gt;)&lt;br /&gt;        (main)))))&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;(main-with-file "D-small-attempt2.in")&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(main-with-file &lt;span style='color: #ffa07a;'&gt;"D-large.in"&lt;/span&gt;)&lt;br /&gt;&lt;/pre&gt; &lt;h4&gt;おわってから&lt;/h4&gt; &lt;p class='first'&gt;ぐちゃぐちゃなものをぐちゃぐちゃなまま書ける loop は便利。入力もリーダのおかげで &lt;code&gt;(read)&lt;/code&gt; するだけ。動かしながら書ける。 Common Lisp でよかったw&lt;/p&gt;&lt;p&gt;D は srot しなくてよかったのね。 n 個がランダムにおさまるなら、 &lt;code&gt;(loop repeat n sum (/ 1 n))&lt;/code&gt; なんで 1 になるのか。朝おきてトイレで納得した。 Case #3 の説明は罠だよ。&lt;/p&gt;&lt;p&gt;&lt;a href='http://www.go-hero.net/jam/11/'&gt;Code Jam 2011 Statistics&lt;/a&gt; に統計情報がある。 C++ って人気あるんだ。続いて Java, Python, C#, C, Ruby みたい。 Common Lisp は "Lisp" になっているようだけど、26 人が使っている。 Common Lisp はこういうのにはとても向いてると思うんだけどなぁ。&lt;/p&gt;&lt;p&gt;&lt;a href='http://www.go-hero.net/jam/11/lang/Lisp'&gt;http://www.go-hero.net/jam/11/lang/Lisp&lt;/a&gt; で他の人のコードを見ると、みんなきれいなコードを提出してるのね。&lt;/p&gt;&lt;p&gt;あれ、D の simulate の定義消しちゃってた。確しかこんなんだったような。&lt;/p&gt; &lt;pre class='src'&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;simulate&lt;/span&gt; (&lt;span style='color: #98fb98;'&gt;&amp;amp;rest&lt;/span&gt; list)&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;loop&lt;/span&gt; with n = 10000&lt;br /&gt;        repeat n&lt;br /&gt;        sum (count-sort-step list (sort (copy-list list) #'&amp;lt;)) into total&lt;br /&gt;        finally (&lt;span style='color: #00ffff;'&gt;return&lt;/span&gt; (float (/ total n) 1d0))))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;うん、おもしろかった。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-4824547939326573419?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/M-KifkHSuIK1gm4TJd0TO32rjUE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/M-KifkHSuIK1gm4TJd0TO32rjUE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/M-KifkHSuIK1gm4TJd0TO32rjUE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/M-KifkHSuIK1gm4TJd0TO32rjUE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/ELTi5qUp8Js" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/4824547939326573419/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=4824547939326573419" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/4824547939326573419?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/4824547939326573419?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/ELTi5qUp8Js/google-code-jam-qualification-round.html" title="Google Code Jam Qualification Round 2011" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>0</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/05/google-code-jam-qualification-round.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUARHk6cCp7ImA9WhZXEEU.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-8219008039090736545</id><published>2011-04-29T23:10:00.001+09:00</published><updated>2011-04-29T23:10:45.718+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-29T23:10:45.718+09:00</app:edited><title>コンドルがとんできた</title><content type="html">&lt;p&gt;誕生日プレゼントの Kindle が届いた。娘からは黄色いシャープペンシルをもらった。義父と義母からはいつもの靴下とケーキ。&lt;/p&gt;&lt;p&gt;ありがとう。&lt;/p&gt;&lt;p&gt;さて、Kindle すてき。タッチパネルのぞわぞわ感がだめなので、i なんとやタブレット系は選択したくない。本が好き。なので Kindle を選択。意味のわからない単語までカーソル移動はめんどうだけど、面画は美しい。お絵かきせんせいと同じレベルを想像していたので、想像をこえて美しかった。&lt;/p&gt;&lt;p&gt;Common Lisp 本の充実と、日本の Kindle Store のオープンをお祈りしてます。なぜか Prolog 本は充実してるみたい。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-8219008039090736545?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LrMUhyQMd4HFIVSc_smaVm-Y0Qc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LrMUhyQMd4HFIVSc_smaVm-Y0Qc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LrMUhyQMd4HFIVSc_smaVm-Y0Qc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LrMUhyQMd4HFIVSc_smaVm-Y0Qc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/UJE9TAQmfHY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/8219008039090736545/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=8219008039090736545" title="2 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/8219008039090736545?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/8219008039090736545?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/UJE9TAQmfHY/blog-post_29.html" title="コンドルがとんできた" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>2</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/04/blog-post_29.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcNQHgzcSp7ImA9WhZQEEk.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-5049698325273404034</id><published>2011-04-17T22:48:00.001+09:00</published><updated>2011-04-17T22:48:11.689+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-17T22:48:11.689+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Common Lisp" /><title>Common Lisp の feed パーサライブリありませんか？</title><content type="html">&lt;p&gt;あまりよさそうなのが見つからなかったので、てきとうに作ってみた。これも The Lisp Curse かな。&lt;/p&gt;&lt;p&gt;最初 (cxml-xmls:make-xmls-builder) 使ってみたら、とても遅かったので (stp:make-builder) を使うことにした。&lt;/p&gt; &lt;pre class='src'&gt;(&lt;span style='color: #00ffff;'&gt;eval-when&lt;/span&gt; (&lt;span style='color: #b0c4de;'&gt;:compile-toplevel&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:load-toplevel&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:execute&lt;/span&gt;)&lt;br /&gt;  (ql:quickload &lt;span style='color: #ffa07a;'&gt;"drakma"&lt;/span&gt;)&lt;br /&gt;  (ql:quickload &lt;span style='color: #ffa07a;'&gt;"cxml"&lt;/span&gt;)&lt;br /&gt;  (ql:quickload &lt;span style='color: #ffa07a;'&gt;"cxml-stp"&lt;/span&gt;)&lt;br /&gt;  (ql:quickload &lt;span style='color: #ffa07a;'&gt;"xpath"&lt;/span&gt;)&lt;br /&gt;  (ql:quickload &lt;span style='color: #ffa07a;'&gt;"series"&lt;/span&gt;))&lt;br /&gt;&lt;br /&gt;(series::install &lt;span style='color: #b0c4de;'&gt;:implicit-map&lt;/span&gt; t)&lt;br /&gt;&lt;br /&gt;(setf drakma:*drakma-default-external-format* &lt;span style='color: #b0c4de;'&gt;:utf-8&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;(iterate ((x (scan '((&lt;span style='color: #ffa07a;'&gt;"application"&lt;/span&gt; . &lt;span style='color: #ffa07a;'&gt;"xml"&lt;/span&gt;)&lt;br /&gt;                     (&lt;span style='color: #ffa07a;'&gt;"text"&lt;/span&gt; . &lt;span style='color: #ffa07a;'&gt;"xml"&lt;/span&gt;)))))&lt;br /&gt;  (pushnew x drakma:*text-content-types* &lt;span style='color: #b0c4de;'&gt;:test&lt;/span&gt; #'equal))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defclass&lt;/span&gt; &lt;span style='color: #98fb98;'&gt;feed&lt;/span&gt; ()&lt;br /&gt;  ((title &lt;span style='color: #b0c4de;'&gt;:initarg&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:title&lt;/span&gt;)&lt;br /&gt;   (link &lt;span style='color: #b0c4de;'&gt;:initarg&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:link&lt;/span&gt;)&lt;br /&gt;   (description &lt;span style='color: #b0c4de;'&gt;:initarg&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:description&lt;/span&gt;)&lt;br /&gt;   (creator &lt;span style='color: #b0c4de;'&gt;:initarg&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:creator&lt;/span&gt;)&lt;br /&gt;   (items &lt;span style='color: #b0c4de;'&gt;:initform&lt;/span&gt; () &lt;span style='color: #b0c4de;'&gt;:initarg&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:items&lt;/span&gt;)))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defclass&lt;/span&gt; &lt;span style='color: #98fb98;'&gt;feed-entry&lt;/span&gt; ()&lt;br /&gt;  ((title &lt;span style='color: #b0c4de;'&gt;:initarg&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:title&lt;/span&gt;)&lt;br /&gt;   (link &lt;span style='color: #b0c4de;'&gt;:initarg&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:link&lt;/span&gt;)&lt;br /&gt;   (content &lt;span style='color: #b0c4de;'&gt;:initarg&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:content&lt;/span&gt;)&lt;br /&gt;   (creator &lt;span style='color: #b0c4de;'&gt;:initarg&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:creator&lt;/span&gt;)&lt;br /&gt;   (pub-date &lt;span style='color: #b0c4de;'&gt;:initarg&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:pub-date&lt;/span&gt;)&lt;br /&gt;   (category &lt;span style='color: #b0c4de;'&gt;:initarg&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:category&lt;/span&gt;)))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;%xv&lt;/span&gt; (path context)&lt;br /&gt;  (xpath:string-value (xpath:evaluate path context)))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;read-url&lt;/span&gt; (url)&lt;br /&gt;  (delete #\Return (drakma:http-request url)))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;fetch-rss&lt;/span&gt; (url)&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;let&lt;/span&gt; ((response (read-url url)))&lt;br /&gt;    (parse-rss response)))&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;(fetch-rss "http://cadr.g.hatena.ne.jp/g000001/rss2")&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;parse-rss&lt;/span&gt; (text)&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;xpath:with-namespaces&lt;/span&gt; ((&lt;span style='color: #ffa07a;'&gt;"dc"&lt;/span&gt; &lt;span style='color: #ffa07a;'&gt;"http://purl.org/dc/elements/1.1/"&lt;/span&gt;)&lt;br /&gt;                          (&lt;span style='color: #ffa07a;'&gt;"content"&lt;/span&gt; &lt;span style='color: #ffa07a;'&gt;"http://purl.org/rss/1.0/modules/content/"&lt;/span&gt;))&lt;br /&gt;    (&lt;span style='color: #00ffff;'&gt;let*&lt;/span&gt; ((doc (cxml:parse text (stp:make-builder)))&lt;br /&gt;           (feed (make-instance 'feed&lt;br /&gt;                                       &lt;span style='color: #b0c4de;'&gt;:title&lt;/span&gt; (%xv &lt;span style='color: #ffa07a;'&gt;"rss/channel/title"&lt;/span&gt; doc)&lt;br /&gt;                                       &lt;span style='color: #b0c4de;'&gt;:link&lt;/span&gt; (%xv &lt;span style='color: #ffa07a;'&gt;"rss/channel/link"&lt;/span&gt; doc)&lt;br /&gt;                                       &lt;span style='color: #b0c4de;'&gt;:description&lt;/span&gt; (%xv &lt;span style='color: #ffa07a;'&gt;"rss/channel/description"&lt;/span&gt; doc)&lt;br /&gt;                                       &lt;span style='color: #b0c4de;'&gt;:creator&lt;/span&gt; (%xv &lt;span style='color: #ffa07a;'&gt;"rss/channel/dc:creator"&lt;/span&gt; doc))))&lt;br /&gt;      (&lt;span style='color: #00ffff;'&gt;with-slots&lt;/span&gt; (items) feed&lt;br /&gt;        (&lt;span style='color: #00ffff;'&gt;xpath:do-node-set&lt;/span&gt; (node (xpath:evaluate &lt;span style='color: #ffa07a;'&gt;"//item"&lt;/span&gt; doc))&lt;br /&gt;          (push (make-instance 'feed-entry&lt;br /&gt;                               &lt;span style='color: #b0c4de;'&gt;:title&lt;/span&gt; (%xv &lt;span style='color: #ffa07a;'&gt;"title"&lt;/span&gt; node)&lt;br /&gt;                               &lt;span style='color: #b0c4de;'&gt;:link&lt;/span&gt; (%xv &lt;span style='color: #ffa07a;'&gt;"link"&lt;/span&gt; node)&lt;br /&gt;                               &lt;span style='color: #b0c4de;'&gt;:content&lt;/span&gt; (%xv &lt;span style='color: #ffa07a;'&gt;"description"&lt;/span&gt; node)&lt;br /&gt;                               &lt;span style='color: #b0c4de;'&gt;:creator&lt;/span&gt; (%xv &lt;span style='color: #ffa07a;'&gt;"dc:creator"&lt;/span&gt; node)&lt;br /&gt;                               &lt;span style='color: #b0c4de;'&gt;:pub-date&lt;/span&gt; (%xv &lt;span style='color: #ffa07a;'&gt;"pubDate"&lt;/span&gt; node)&lt;br /&gt;                               &lt;span style='color: #b0c4de;'&gt;:category&lt;/span&gt; (%xv &lt;span style='color: #ffa07a;'&gt;"category"&lt;/span&gt; node))&lt;br /&gt;                items))&lt;br /&gt;        (setf items (nreverse items)))&lt;br /&gt;      feed)))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;atom&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;fetch-atom&lt;/span&gt; (url)&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;let&lt;/span&gt; ((response (read-url url)))&lt;br /&gt;    (parse-atom response)))&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;(fetch-atom "http://blog.livedoor.jp/chiblits/atom.xml")&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;(fetch-atom "http://feeds.feedburner.com/blogspot/rztf")&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;parse-atom&lt;/span&gt; (text)&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;let&lt;/span&gt; ((doc (cxml:parse text (stp:make-builder))))&lt;br /&gt;    (&lt;span style='color: #00ffff;'&gt;let&lt;/span&gt; ((namespace (collect-first&lt;br /&gt;                      (choose-if (&lt;span style='color: #00ffff;'&gt;lambda&lt;/span&gt; (namespace)&lt;br /&gt;                                   (&lt;span style='color: #00ffff;'&gt;xpath:with-namespaces&lt;/span&gt; ((nil namespace))&lt;br /&gt;                                     (string/= (%xv &lt;span style='color: #ffa07a;'&gt;"feed/title"&lt;/span&gt; doc) &lt;span style='color: #ffa07a;'&gt;""&lt;/span&gt;)))&lt;br /&gt;                                 (scan '(&lt;span style='color: #ffa07a;'&gt;"http://www.w3.org/2005/Atom"&lt;/span&gt; &lt;span style='color: #ffa07a;'&gt;"http://purl.org/atom/ns#"&lt;/span&gt;))))))&lt;br /&gt;      (&lt;span style='color: #00ffff;'&gt;xpath:with-namespaces&lt;/span&gt; ((nil namespace))&lt;br /&gt;        (&lt;span style='color: #00ffff;'&gt;let&lt;/span&gt; ((feed (make-instance 'feed&lt;br /&gt;                                          &lt;span style='color: #b0c4de;'&gt;:title&lt;/span&gt; (%xv &lt;span style='color: #ffa07a;'&gt;"feed/title"&lt;/span&gt; doc)&lt;br /&gt;                                          &lt;span style='color: #b0c4de;'&gt;:link&lt;/span&gt; (%xv &lt;span style='color: #ffa07a;'&gt;"feed/link[@rel=\"alternate\"]/@href"&lt;/span&gt; doc)&lt;br /&gt;                                          &lt;span style='color: #b0c4de;'&gt;:description&lt;/span&gt; (%xv &lt;span style='color: #ffa07a;'&gt;"feed/tagline"&lt;/span&gt; doc)&lt;br /&gt;                                          &lt;span style='color: #b0c4de;'&gt;:creator&lt;/span&gt; (%xv &lt;span style='color: #ffa07a;'&gt;"feed/author/name"&lt;/span&gt; doc))))&lt;br /&gt;          (&lt;span style='color: #00ffff;'&gt;with-slots&lt;/span&gt; (items) feed&lt;br /&gt;            (&lt;span style='color: #00ffff;'&gt;xpath:do-node-set&lt;/span&gt; (node (xpath:evaluate &lt;span style='color: #ffa07a;'&gt;"//entry"&lt;/span&gt; doc))&lt;br /&gt;              (push (make-instance 'feed-entry&lt;br /&gt;                                   &lt;span style='color: #b0c4de;'&gt;:title&lt;/span&gt; (%xv &lt;span style='color: #ffa07a;'&gt;"title"&lt;/span&gt; node)&lt;br /&gt;                                   &lt;span style='color: #b0c4de;'&gt;:link&lt;/span&gt; (%xv &lt;span style='color: #ffa07a;'&gt;"link/@href"&lt;/span&gt; node)&lt;br /&gt;                                   &lt;span style='color: #b0c4de;'&gt;:content&lt;/span&gt; (%xv &lt;span style='color: #ffa07a;'&gt;"content"&lt;/span&gt; node)&lt;br /&gt;                                   &lt;span style='color: #b0c4de;'&gt;:creator&lt;/span&gt; (%xv &lt;span style='color: #ffa07a;'&gt;"author/name"&lt;/span&gt; node)&lt;br /&gt;                                   &lt;span style='color: #b0c4de;'&gt;:pub-date&lt;/span&gt; (%xv &lt;span style='color: #ffa07a;'&gt;"issued|published"&lt;/span&gt; node)&lt;br /&gt;                                   &lt;span style='color: #b0c4de;'&gt;:category&lt;/span&gt; (%xv &lt;span style='color: #ffa07a;'&gt;"category/@term"&lt;/span&gt; node))&lt;br /&gt;                    items))&lt;br /&gt;            (setf items (nreverse items)))&lt;br /&gt;          feed)))))&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-5049698325273404034?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7pRc7yglaotzVGyhtlvXyd6JCok/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7pRc7yglaotzVGyhtlvXyd6JCok/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7pRc7yglaotzVGyhtlvXyd6JCok/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7pRc7yglaotzVGyhtlvXyd6JCok/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/7JBR7Fof5g4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/5049698325273404034/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=5049698325273404034" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/5049698325273404034?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/5049698325273404034?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/7JBR7Fof5g4/common-lisp-feed.html" title="Common Lisp の feed パーサライブリありませんか？" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>0</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/04/common-lisp-feed.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04CQH4-eip7ImA9WhZSGE0.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-8008164681773330834</id><published>2011-04-03T12:39:00.001+09:00</published><updated>2011-04-03T12:39:21.052+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-03T12:39:21.052+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Common Lisp" /><title>DCG で JSON をパースする</title><content type="html">&lt;p&gt;"Paradigms of Artificial Intelligence Programming"(PAIP, 実用 Common Lisp) の 20 Unification Grammars にある definite clause grammer(DCG) が面白かったので、それを使って JSON をパースしてみた。&lt;/p&gt;&lt;p&gt;DCG とは私の勝手な解釈では Prolog による文法解析かな。 DCG の何がいいかは "Artificial Intelligence: A Modern Approach"(AIMA, エージェントアプローチ人工知能) の方に書いてあるw とりあえず、全部宣言的に書けるのはいい。 PAIP と AIMA 面方読むと面白いね。よく理解できないげど。&lt;/p&gt;&lt;p&gt;数値はめんどうになって整数だけの対応にした。&lt;/p&gt; &lt;pre class='src'&gt;(&lt;span style='color: #00ffff;'&gt;eval-when&lt;/span&gt; (&lt;span style='color: #b0c4de;'&gt;:compile-toplevel&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:load-toplevel&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:execute&lt;/span&gt;)&lt;br /&gt;  (ql:quickload &lt;span style='color: #ffa07a;'&gt;"unifgram"&lt;/span&gt;)&lt;br /&gt;  (ql:quickload &lt;span style='color: #ffa07a;'&gt;"info.read-eval-print.mecab"&lt;/span&gt;))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defpackage&lt;/span&gt; &lt;span style='color: #98fb98;'&gt;:unifgram-json&lt;/span&gt;&lt;br /&gt;  (&lt;span style='color: #b0c4de;'&gt;:use&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:cl&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:paiprolog&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:unifgram&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:info.read-eval-print.mecab&lt;/span&gt;))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;in-package&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:unifgram-json&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;Syntax&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;空白&lt;br /&gt;&lt;/span&gt;(&amp;lt;-- (whitespace-p #\Space))&lt;br /&gt;(&amp;lt;-  (whitespace-p #\Tab))&lt;br /&gt;(&amp;lt;-  (whitespace-p #\Newline))&lt;br /&gt;(&amp;lt;-  (whitespace-p #\Return))&lt;br /&gt;(&amp;lt;-  (whitespace-p #\Page))&lt;br /&gt;&lt;br /&gt;(&amp;lt;-- (whitespace (?c . ?s) ?s)&lt;br /&gt;     (whitespace-p ?c))&lt;br /&gt;&lt;br /&gt;(rule (s*) ---&amp;gt; (whitespace) (s*) !)&lt;br /&gt;(rule (s*) --&amp;gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;JSON&lt;br /&gt;&lt;/span&gt;(rule (json ?x) ---&amp;gt; (s*) (value ?x) (s*))&lt;br /&gt;&lt;br /&gt;(rule (value ?x)    ---&amp;gt; (string ?x))&lt;br /&gt;(rule (value ?x)     --&amp;gt; (number ?x))&lt;br /&gt;(rule (value ?x)     --&amp;gt; (object ?x))&lt;br /&gt;(rule (value ?x)     --&amp;gt; (array ?x))&lt;br /&gt;(rule (value true)   --&amp;gt; #.`(&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; ,@(coerce &lt;span style='color: #ffa07a;'&gt;"true"&lt;/span&gt; 'list)))&lt;br /&gt;(rule (value false)  --&amp;gt; #.`(&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; ,@(coerce &lt;span style='color: #ffa07a;'&gt;"false"&lt;/span&gt; 'list)))&lt;br /&gt;(rule (value null)   --&amp;gt; #.`(&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; ,@(coerce &lt;span style='color: #ffa07a;'&gt;"null"&lt;/span&gt; 'list)))&lt;br /&gt;&lt;br /&gt;(rule (object (new-object)) ---&amp;gt; (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\{) (s*) (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\}))&lt;br /&gt;(rule (object (new-object . ?x))  --&amp;gt; (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\{) (s*) (members ?x) (s*) (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\}))&lt;br /&gt;&lt;br /&gt;(rule (members (?k ?v . ?xs)) ---&amp;gt; (pair ?k ?v) (s*) (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\,) (s*) (members ?xs))&lt;br /&gt;(rule (members (?k ?v))        --&amp;gt; (pair ?k ?v))&lt;br /&gt;&lt;br /&gt;(rule (pair ?k ?v) ---&amp;gt; (string ?k) (s*) (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\:) (s*) (value ?v))&lt;br /&gt;&lt;br /&gt;(rule (array (new-array)) ---&amp;gt; (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\[) (s*) (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\]))&lt;br /&gt;(rule (array (new-array . ?x))  --&amp;gt; (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\[) (s*) (elements ?x) (s*) (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\]))&lt;br /&gt;&lt;br /&gt;(rule (elements (?x . ?xs)) ---&amp;gt; (value ?x) (s*) (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\,) (s*) (elements ?xs))&lt;br /&gt;(rule (elements (?x))  --&amp;gt; (value ?x))&lt;br /&gt;&lt;br /&gt;(rule (string (new-string))   ---&amp;gt; (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\") (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\"))&lt;br /&gt;(rule (string (new-string . ?x))  --&amp;gt; (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\") (chars ?x) (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\"))&lt;br /&gt;&lt;br /&gt;(rule (chars (?x . ?xs)) ---&amp;gt; (char ?x) (chars ?xs))&lt;br /&gt;(rule (chars (?x))        --&amp;gt; (char ?x))&lt;br /&gt;&lt;br /&gt;(&amp;lt;-- (char ?x (?x . ?xs) ?xs)&lt;br /&gt;     (\\= ?x #\")&lt;br /&gt;     (\\= ?x #\\))&lt;br /&gt;(&amp;lt;-  (char #\" (#\\ #\" . ?xs) ?xs))&lt;br /&gt;(&amp;lt;-  (char #\\ (#\\ #\\ . ?xs) ?xs))&lt;br /&gt;(&amp;lt;-  (char #\/ (#\\ #\/ . ?xs) ?xs))&lt;br /&gt;(&amp;lt;-  (char #\Backspace (#\\ #\b . ?xs) ?xs))&lt;br /&gt;(&amp;lt;-  (char #\Page      (#\\ #\f . ?xs) ?xs))&lt;br /&gt;(&amp;lt;-  (char #\Newline   (#\\ #\n . ?xs) ?xs))&lt;br /&gt;(&amp;lt;-  (char #\Return    (#\\ #\r . ?xs) ?xs))&lt;br /&gt;(&amp;lt;-  (char #\Tab       (#\\ #\t . ?xs) ?xs))&lt;br /&gt;(&amp;lt;-  (char (unicode ?c1 ?c2 ?c3 ?c4) (#\\ #\u ?c1 ?c2 ?c3 ?c4 . ?xs) ?xs))&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;number は手抜きで整数のみ&lt;br /&gt;&lt;/span&gt;(rule (number (new-number . ?x)) ---&amp;gt; (int ?x))&lt;br /&gt;&lt;br /&gt;(rule (int (?x))         ---&amp;gt; (digit ?x))&lt;br /&gt;(rule (int (?x . ?xs))    --&amp;gt; (digit1-9 ?x) (digits ?xs))&lt;br /&gt;(rule (int ('- ?x))        --&amp;gt; (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\-) (digit ?x))&lt;br /&gt;(rule (int ('- ?x . ?xs))  --&amp;gt; (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\-) (digit1-9 ?x) (digits ?xs))&lt;br /&gt;&lt;br /&gt;(rule (digits (?x . ?xs)) ---&amp;gt; (digit ?x) (digits ?xs))&lt;br /&gt;(rule (digits (?x))          --&amp;gt; (digit ?x))&lt;br /&gt;&lt;br /&gt;(rule (digit 0)    ---&amp;gt; (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\0))&lt;br /&gt;(rule (digit ?x)    --&amp;gt; (digit1-9 ?x))&lt;br /&gt;(rule (digit1-9 1) ---&amp;gt; (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\1))&lt;br /&gt;(rule (digit1-9 2)  --&amp;gt; (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\2))&lt;br /&gt;(rule (digit1-9 3)  --&amp;gt; (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\3))&lt;br /&gt;(rule (digit1-9 4)  --&amp;gt; (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\4))&lt;br /&gt;(rule (digit1-9 5)  --&amp;gt; (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\5))&lt;br /&gt;(rule (digit1-9 6)  --&amp;gt; (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\6))&lt;br /&gt;(rule (digit1-9 7)  --&amp;gt; (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\7))&lt;br /&gt;(rule (digit1-9 8)  --&amp;gt; (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\8))&lt;br /&gt;(rule (digit1-9 9)  --&amp;gt; (&lt;span style='color: #b0c4de;'&gt;:word&lt;/span&gt; #\9))&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;Semantic&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;new-object&lt;/span&gt; (&lt;span style='color: #98fb98;'&gt;&amp;amp;rest&lt;/span&gt; args)&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;loop&lt;/span&gt; for (k v) on args by #'cddr&lt;br /&gt;        collect (cons k v)))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;new-array&lt;/span&gt; (&lt;span style='color: #98fb98;'&gt;&amp;amp;rest&lt;/span&gt; args)&lt;br /&gt;  args)&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;new-string&lt;/span&gt; (&lt;span style='color: #98fb98;'&gt;&amp;amp;rest&lt;/span&gt; args)&lt;br /&gt;  (coerce args 'string))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;new-number&lt;/span&gt; (&lt;span style='color: #98fb98;'&gt;&amp;amp;rest&lt;/span&gt; args)&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;let*&lt;/span&gt; ((minus-p (eq '- (car args)))&lt;br /&gt;         (int (&lt;span style='color: #00ffff;'&gt;if&lt;/span&gt; minus-p (cdr args) args)))&lt;br /&gt;    (&lt;span style='color: #00ffff;'&gt;loop&lt;/span&gt; for i in int&lt;br /&gt;          for sum = i then (+ (* sum 10) i)&lt;br /&gt;          finally (&lt;span style='color: #00ffff;'&gt;return&lt;/span&gt; (&lt;span style='color: #00ffff;'&gt;if&lt;/span&gt; minus-p (* -1 sum) sum)))))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;hex-char-to-decimal&lt;/span&gt; (hex-char)&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;if&lt;/span&gt; (digit-char-p hex-char)&lt;br /&gt;      (- (char-code hex-char) #.(char-code #\0))&lt;br /&gt;      (- (char-code (char-downcase hex-char)) #.(char-code #\a) -10)))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;unicode&lt;/span&gt; (a b c d)&lt;br /&gt;  (code-char (+ (ash (hex-char-to-decimal a) 12)&lt;br /&gt;                (ash (hex-char-to-decimal b) 8)&lt;br /&gt;                (ash (hex-char-to-decimal c) 4)&lt;br /&gt;                (hex-char-to-decimal d))))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defconstant&lt;/span&gt; &lt;span style='color: #eedd82;'&gt;true&lt;/span&gt; t)&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defconstant&lt;/span&gt; &lt;span style='color: #eedd82;'&gt;false&lt;/span&gt; nil)&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defconstant&lt;/span&gt; &lt;span style='color: #eedd82;'&gt;null&lt;/span&gt; 'null)&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;ユーティリティ&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defmacro&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;from-json&lt;/span&gt; (json-string)&lt;br /&gt;  `(eval (prolog-first (?x)&lt;br /&gt;           (json ?x ,(coerce json-string 'list) ()))))&lt;br /&gt;&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;動作確認&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(from-json &lt;span style='color: #ffa07a;'&gt;"true"&lt;/span&gt;)&lt;br /&gt;(from-json &lt;span style='color: #ffa07a;'&gt;"[]"&lt;/span&gt;)&lt;br /&gt;(from-json &lt;span style='color: #ffa07a;'&gt;"[true]"&lt;/span&gt;)&lt;br /&gt;(from-json &lt;span style='color: #ffa07a;'&gt;"[true,false]"&lt;/span&gt;)&lt;br /&gt;(from-json &lt;span style='color: #ffa07a;'&gt;"[true,false,null]"&lt;/span&gt;)&lt;br /&gt;(from-json &lt;span style='color: #ffa07a;'&gt;"\"\""&lt;/span&gt;)&lt;br /&gt;(from-json &lt;span style='color: #ffa07a;'&gt;"\"a\""&lt;/span&gt;)&lt;br /&gt;(from-json &lt;span style='color: #ffa07a;'&gt;"\"Hello\\\"\\\\\\b\\f\\n\\r\\t\\u308c\""&lt;/span&gt;)&lt;br /&gt;(from-json &lt;span style='color: #ffa07a;'&gt;"{}"&lt;/span&gt;)&lt;br /&gt;(from-json &lt;span style='color: #ffa07a;'&gt;"{\"foo\":true}"&lt;/span&gt;)&lt;br /&gt;(from-json &lt;span style='color: #ffa07a;'&gt;"0"&lt;/span&gt;)&lt;br /&gt;(from-json &lt;span style='color: #ffa07a;'&gt;"1"&lt;/span&gt;)&lt;br /&gt;(from-json &lt;span style='color: #ffa07a;'&gt;"10"&lt;/span&gt;)&lt;br /&gt;(from-json &lt;span style='color: #ffa07a;'&gt;"12"&lt;/span&gt;)&lt;br /&gt;(from-json &lt;span style='color: #ffa07a;'&gt;"123"&lt;/span&gt;)&lt;br /&gt;(from-json &lt;span style='color: #ffa07a;'&gt;"12345"&lt;/span&gt;)&lt;br /&gt;(from-json &lt;span style='color: #ffa07a;'&gt;"-1"&lt;/span&gt;)&lt;br /&gt;(from-json &lt;span style='color: #ffa07a;'&gt;"-10"&lt;/span&gt;)&lt;br /&gt;(from-json &lt;span style='color: #ffa07a;'&gt;"-123"&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(from-json &lt;span style='color: #ffa07a;'&gt;"[&lt;br /&gt;  {&lt;br /&gt;    \"Person\" : {&lt;br /&gt;      \"name\" : \"quek\",&lt;br /&gt;      \"weight\" : 55,&lt;br /&gt;      \"foo\"  : [ true, false ]&lt;br /&gt;     }&lt;br /&gt;  },&lt;br /&gt;  {&lt;br /&gt;    \"Person\" : {&lt;br /&gt;      \"name\" : \"zumu\",&lt;br /&gt;      \"weight\" : 123,&lt;br /&gt;      \"foo\"  : []&lt;br /&gt;     }&lt;br /&gt;  }&lt;br /&gt;]"&lt;/span&gt;)&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; ((("Person" ("name" . "quek") ("weight" . 55) ("foo" T NIL)))&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;    &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;(("Person" ("name" . "zumu") ("weight" . 123) ("foo"))))&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-8008164681773330834?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mF4AVVf9RMegy2gRb8GJHWLcvLw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mF4AVVf9RMegy2gRb8GJHWLcvLw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mF4AVVf9RMegy2gRb8GJHWLcvLw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mF4AVVf9RMegy2gRb8GJHWLcvLw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/DndD8BIZ9TE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/8008164681773330834/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=8008164681773330834" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/8008164681773330834?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/8008164681773330834?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/DndD8BIZ9TE/dcg-json.html" title="DCG で JSON をパースする" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>0</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/04/dcg-json.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYDSXk4fSp7ImA9WhZSFko.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-2674645779706775259</id><published>2011-04-02T00:36:00.001+09:00</published><updated>2011-04-02T00:36:18.735+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-02T00:36:18.735+09:00</app:edited><title>出社初日</title><content type="html">&lt;p&gt;通勤電車にたじろいた。しかし、それが普通の感覚なんだよね。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-2674645779706775259?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HptIV8BD1E5qLH-ZMdsQBgoNgs8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HptIV8BD1E5qLH-ZMdsQBgoNgs8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HptIV8BD1E5qLH-ZMdsQBgoNgs8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HptIV8BD1E5qLH-ZMdsQBgoNgs8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/9j1ofZQLHL4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/2674645779706775259/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=2674645779706775259" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/2674645779706775259?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/2674645779706775259?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/9j1ofZQLHL4/blog-post.html" title="出社初日" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>0</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/04/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ABRXY_fCp7ImA9WhZSFUg.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-5545149439091206725</id><published>2011-03-31T16:15:00.001+09:00</published><updated>2011-03-31T16:15:54.844+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-31T16:15:54.844+09:00</app:edited><title>明日から仕事</title><content type="html">&lt;p&gt;思いがけず、3ヵ月間という長いインターバルになった。その間、先行が見えず無気力傾向にあった。せいぜい "Paradigms of Artificial Intelligence Programming" と "エージェントアプローチ人工知能" の半分を読んだくらい。あとは "大航海時代 Online" に手を出したりもした。この15ヵ月間ですっかり貯金がなくなったは痛いな。&lt;/p&gt;&lt;p&gt;Rucksack みたいなパーシステントシステムを作ろうとも思っていたけど、気力がついていかなかった。&lt;/p&gt;&lt;p&gt;明日からの仕事で一番気がかりなことは、入力。カスタマイズした Dvorak 配列で T-Code を使っている。それを Windows 環境でどうやって実現したらいいんだろうか。&lt;/p&gt;&lt;p&gt;そんな感じですが、元気に生きています。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-5545149439091206725?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/o4axYzf_vFnAL6gydEmtWvneTpo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/o4axYzf_vFnAL6gydEmtWvneTpo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/o4axYzf_vFnAL6gydEmtWvneTpo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/o4axYzf_vFnAL6gydEmtWvneTpo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/a_5QxqJSJbk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/5545149439091206725/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=5545149439091206725" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/5545149439091206725?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/5545149439091206725?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/a_5QxqJSJbk/blog-post.html" title="明日から仕事" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>0</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/03/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IBQ3kyeip7ImA9Wx9bE0Q.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-376359445040564194</id><published>2011-02-23T02:25:00.001+09:00</published><updated>2011-02-23T02:25:52.792+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-23T02:25:52.792+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Prolog" /><category scheme="http://www.blogger.com/atom/ns#" term="Common Lisp" /><title>PAIProlog</title><content type="html">&lt;p&gt;Paradigms of Artificial Intelligence Programming (実用 Common Lisp) のコードに Christophe Rhodes さんが手を入れて &lt;a href='http://www.cl-user.net/asp/TWKe/sdataQ0rEOGCGW7roDQdmZG8X8yBX8yBXnMq=/sdataQu3F$sSHnB=='&gt;PAIProlog&lt;/a&gt; として公開されている。&lt;/p&gt;&lt;p&gt;それに &lt;a href='http://www.franz.com/support/documentation/current/doc/prolog.html'&gt;Allegro Prolog&lt;/a&gt; の &lt;code&gt;&amp;lt;--&lt;/code&gt; と &lt;code&gt;prolog&lt;/code&gt; を実装してみた。すでにどこかにありそうなんだけどなぁ。。。と思いつつ。&lt;/p&gt;&lt;p&gt;&lt;code&gt;&amp;lt;--&lt;/code&gt; は同じ名前かつ同じ引数の数のものを再定義する。&lt;/p&gt;&lt;p&gt;&lt;code&gt;prolog&lt;/code&gt; は Common Lisp から Prolog を使うためのマクロ。次のように lisp/2 経由で Common Lisp の変数にアクセスできる。&lt;/p&gt; &lt;pre class='src'&gt;(&lt;span style='color: #00ffff;'&gt;let&lt;/span&gt; ((x 100) y)&lt;br /&gt;  (prolog (lisp ?a x)&lt;br /&gt;          (= ?a ?b)&lt;br /&gt;          (lisp ? (setf y (+ ?b ?b x 1))))&lt;br /&gt;  y)&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; 301&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;ソースは github に &lt;a href='https://github.com/quek/paiprolog'&gt;https://github.com/quek/paiprolog&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;prolog&lt;/code&gt; の方の実装は2重バッククオートを使った複雑なコードになってしまった。レキシカル変数にアクセスするためにマクロ展開時にクロージャを作るようにしたけど、もっと簡単に書けないかな？&lt;/p&gt; &lt;pre class='src'&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;insert-deref&lt;/span&gt; (exp)&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;if&lt;/span&gt; (atom exp)&lt;br /&gt;      (&lt;span style='color: #00ffff;'&gt;if&lt;/span&gt; (variable-p exp)&lt;br /&gt;          `(deref ,exp)&lt;br /&gt;          exp)&lt;br /&gt;      (cons (insert-deref (car exp))&lt;br /&gt;            (insert-deref (cdr exp)))))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;prolog-translate-goals&lt;/span&gt; (goals)&lt;br /&gt;  (mapcar (&lt;span style='color: #00ffff;'&gt;lambda&lt;/span&gt; (goal)&lt;br /&gt;            (&lt;span style='color: #00ffff;'&gt;if&lt;/span&gt; (starts-with goal 'lisp)&lt;br /&gt;                (&lt;span style='color: #00ffff;'&gt;let&lt;/span&gt; ((vars (variables-in (last goal))))&lt;br /&gt;                  ``(,@',(butlast goal)&lt;br /&gt;                         (apply ,(&lt;span style='color: #00ffff;'&gt;lambda&lt;/span&gt; (,@vars)&lt;br /&gt;                                   ,@(insert-deref (last goal)))&lt;br /&gt;                                 ,',vars)))&lt;br /&gt;                `',goal))&lt;br /&gt;          goals))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defmacro&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;prolog&lt;/span&gt; (&lt;span style='color: #98fb98;'&gt;&amp;amp;rest&lt;/span&gt; goals)&lt;br /&gt;  &lt;span style='color: #ffa07a;'&gt;"Run Prolog in the surrounding Lisp environment&lt;br /&gt;which is accessed from lisp functor.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ffc0cb; font-weight: bold;'&gt;(&lt;/span&gt;&lt;span style='color: #ffa07a;'&gt;let ((x 100) y)&lt;br /&gt;  (prolog (lisp ?a x)&lt;br /&gt;          (= ?a ?b)&lt;br /&gt;          (lisp ? (setf y (+ ?b ?b x 1))))&lt;br /&gt;  y)&lt;br /&gt;;;=&amp;gt; 301&lt;br /&gt;"&lt;/span&gt;&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;let&lt;/span&gt; ((goals (replace-?-vars goals)))&lt;br /&gt;    `(&lt;span style='color: #00ffff;'&gt;block&lt;/span&gt; prolog&lt;br /&gt;       (clear-predicate 'top-level-query)&lt;br /&gt;       (add-clause `((top-level-query)&lt;br /&gt;                     ,,@(prolog-translate-goals goals)))&lt;br /&gt;       (run-prolog 'top-level-query/0 #'ignore))))&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-376359445040564194?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_lVxO9_nj4psERvHhjvNL-d3JgY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_lVxO9_nj4psERvHhjvNL-d3JgY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_lVxO9_nj4psERvHhjvNL-d3JgY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_lVxO9_nj4psERvHhjvNL-d3JgY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/qsWLLyQ-AZg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/376359445040564194/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=376359445040564194" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/376359445040564194?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/376359445040564194?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/qsWLLyQ-AZg/paiprolog.html" title="PAIProlog" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>0</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/02/paiprolog.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIGRng9fCp7ImA9Wx9bEE4.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-6474674114994321353</id><published>2011-02-18T21:52:00.001+09:00</published><updated>2011-02-18T21:52:07.664+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-18T21:52:07.664+09:00</app:edited><title>カーネルが 2.6.37 になった</title><content type="html">&lt;p&gt;Debian sid の カーネルが 2.6.37 になった。すると Stumpwm と cl-mayu が正常動作しなくなった。&lt;/p&gt;&lt;p&gt;Stumpwm は、&lt;a href='http://comments.gmane.org/gmane.comp.window-managers.stumpwm.devel/2351'&gt;http://comments.gmane.org/gmane.comp.window-managers.stumpwm.devel/2351&lt;/a&gt; の件。パッチを適用したら動いた。&lt;/p&gt;&lt;p&gt;cl-mayu は /usr/include/linux/input.h の EV_VERSION の値が変っていたことによる。値を修正したら動いた。きっと窓使いの憂鬱 Linux 版も再コンパイルしないと動かないと思う。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-6474674114994321353?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/v7Xop4SvMieOEh94WoNpIIoBMyU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/v7Xop4SvMieOEh94WoNpIIoBMyU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/v7Xop4SvMieOEh94WoNpIIoBMyU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/v7Xop4SvMieOEh94WoNpIIoBMyU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/-xOn-hWZEHY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/6474674114994321353/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=6474674114994321353" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/6474674114994321353?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/6474674114994321353?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/-xOn-hWZEHY/2637.html" title="カーネルが 2.6.37 になった" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>0</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/02/2637.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QARnY_eip7ImA9Wx9UGUg.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-4898829683499775168</id><published>2011-02-17T23:01:00.001+09:00</published><updated>2011-02-17T23:02:27.842+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-17T23:02:27.842+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Common Lisp" /><title>Common Lisp で Web アプリを作るためのブランクプロジェクト</title><content type="html">&lt;p&gt;何かの時に必要になるかもしれないと思い、 Common Lisp で Web アプリを作るためのブランクプロジェクトを作ってみた。&lt;/p&gt;&lt;p&gt;&lt;a href="https://github.com/quek/hunchentoot-blank"&gt;https://github.com/quek/hunchentoot-blank&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Hunchentoot, CL-WHO, CLSQL を使ったブランクプロジェクト。&lt;/p&gt;&lt;p&gt;データベースには MySQL を使用。シェルから次のコマンドを実行してデータベースの作成が必要。&lt;/p&gt; &lt;pre class="src"&gt;echo 'create database hunchentoot_blank default character set utf8;' | mysql -u root&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;次を実行して &lt;a href="http://localhost:8888/"&gt;http://localhost:8888/&lt;/a&gt; にアクセスする。&lt;/p&gt; &lt;pre class="src"&gt;(&lt;span style="color: #00ffff;"&gt;require&lt;/span&gt; &lt;span style="color: #7fffd4;"&gt;:hunchentoot-blank&lt;/span&gt;)&lt;br /&gt;(hunchentoot-blank::start)&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;これだけではちょっと寂しいので、いつものようにソースを載せておく。&lt;/p&gt; &lt;pre class="src"&gt;(&lt;span style="color: #00ffff;"&gt;in-package&lt;/span&gt; #&lt;span style="color: #b0c4de;"&gt;:hunchentoot-blank&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;(&lt;span style="color: #00ffff;"&gt;defparameter&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;*default-directory*&lt;/span&gt;&lt;br /&gt;  (pathname (directory-namestring #.(or *compile-file-truename*&lt;br /&gt;                                        *load-truename*)))&lt;br /&gt;  &lt;span style="color: #ffa07a;"&gt;"このファイルがあるディレクトリ"&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;(&lt;span style="color: #00ffff;"&gt;defparameter&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;*js-path*&lt;/span&gt; (merge-pathnames &lt;span style="color: #ffa07a;"&gt;"js/"&lt;/span&gt; *default-directory*)&lt;br /&gt;  &lt;span style="color: #ffa07a;"&gt;"JavaScript 用ディレクトリ"&lt;/span&gt;)&lt;br /&gt;(&lt;span style="color: #00ffff;"&gt;defparameter&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;*css-path*&lt;/span&gt; (merge-pathnames &lt;span style="color: #ffa07a;"&gt;"css/"&lt;/span&gt; *default-directory*)&lt;br /&gt;  &lt;span style="color: #ffa07a;"&gt;"スタイルシート用ディレクトリ"&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff7f24;"&gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;;;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;DB&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;&lt;br /&gt;#|&lt;br /&gt;シェルから次のコマンドを実行してデータベースを作成してください。&lt;br /&gt;echo 'create database hunchentoot_blank default character set utf8;' | mysql -u root&lt;br /&gt;|#&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(clsql-sys:file-enable-sql-reader-syntax)&lt;br /&gt;&lt;br /&gt;(&lt;span style="color: #00ffff;"&gt;defparameter&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;*connection-spec*&lt;/span&gt; '(&lt;span style="color: #ffa07a;"&gt;"localhost"&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"hunchentoot_blank"&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"root"&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;""&lt;/span&gt;)&lt;br /&gt;  &lt;span style="color: #ffa07a;"&gt;"MySQL の接続情報。(DBサーバ DB名 ユーザ パスワード)"&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;(&lt;span style="color: #00ffff;"&gt;defmacro&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;with-db&lt;/span&gt; (&lt;span style="color: #98fb98;"&gt;&amp;amp;body&lt;/span&gt; body)&lt;br /&gt;  (&lt;span style="color: #00ffff;"&gt;alexandria:with-gensyms&lt;/span&gt; (res handler-done)&lt;br /&gt;    `(&lt;span style="color: #00ffff;"&gt;clsql:with-database&lt;/span&gt; (clsql:*default-database*&lt;br /&gt;                           *connection-spec*&lt;br /&gt;                           &lt;span style="color: #b0c4de;"&gt;:make-default&lt;/span&gt; t&lt;br /&gt;                           &lt;span style="color: #b0c4de;"&gt;:pool&lt;/span&gt; t&lt;br /&gt;                           &lt;span style="color: #b0c4de;"&gt;:encoding&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:utf-8&lt;/span&gt;&lt;br /&gt;                           &lt;span style="color: #b0c4de;"&gt;:database-type&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:mysql&lt;/span&gt;)&lt;br /&gt;       &lt;span style="color: #ff7f24;"&gt;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;for debug&lt;br /&gt;&lt;/span&gt;       (clsql-sys::start-sql-recording)&lt;br /&gt;       (&lt;span style="color: #00ffff;"&gt;unwind-protect&lt;/span&gt;&lt;br /&gt;            (&lt;span style="color: #00ffff;"&gt;let&lt;/span&gt; (,res (,handler-done t))&lt;br /&gt;              &lt;span style="color: #ff7f24;"&gt;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;(clsql:execute-command "SET NAMES 'utf8'")&lt;br /&gt;&lt;/span&gt;              (&lt;span style="color: #00ffff;"&gt;clsql-sys:with-transaction&lt;/span&gt; (&lt;span style="color: #b0c4de;"&gt;:database&lt;/span&gt; clsql:*default-database*)&lt;br /&gt;                &lt;span style="color: #ff7f24;"&gt;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;hunchentoot:redirect した場合の対応&lt;br /&gt;&lt;/span&gt;                (&lt;span style="color: #00ffff;"&gt;catch&lt;/span&gt; '&lt;span style="color: #7fffd4;"&gt;hunchentoot::handler-done&lt;/span&gt;&lt;br /&gt;                  (setf ,res (&lt;span style="color: #00ffff;"&gt;progn&lt;/span&gt; ,@body))&lt;br /&gt;                  (setf ,handler-done nil)))&lt;br /&gt;              (&lt;span style="color: #00ffff;"&gt;if&lt;/span&gt; ,handler-done&lt;br /&gt;                  (&lt;span style="color: #00ffff;"&gt;throw&lt;/span&gt; '&lt;span style="color: #7fffd4;"&gt;hunchentoot::handler-done&lt;/span&gt; nil)&lt;br /&gt;                  ,res))&lt;br /&gt;         &lt;span style="color: #ff7f24;"&gt;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;for debug&lt;br /&gt;&lt;/span&gt;         (clsql-sys::stop-sql-recording)))))&lt;br /&gt;&lt;span style="color: #ff7f24;"&gt;;;&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;(with-db (clsql-sys:query "select 'あ'"))&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(clsql-sys:def-view-class user ()&lt;br /&gt;  ((id &lt;span style="color: #b0c4de;"&gt;:accessor&lt;/span&gt; id&lt;br /&gt;       &lt;span style="color: #b0c4de;"&gt;:initarg&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:id&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: #b0c4de;"&gt;:db-kind&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:key&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: #b0c4de;"&gt;:db-constraints&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:auto-increment&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: #b0c4de;"&gt;:type&lt;/span&gt; integer)&lt;br /&gt;   (email &lt;span style="color: #b0c4de;"&gt;:accessor&lt;/span&gt; email&lt;br /&gt;          &lt;span style="color: #b0c4de;"&gt;:initarg&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:email&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #b0c4de;"&gt;:db-constraints&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:unique&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: #b0c4de;"&gt;:type&lt;/span&gt; string)&lt;br /&gt;   (password &lt;span style="color: #b0c4de;"&gt;:initarg&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:password&lt;/span&gt;&lt;br /&gt;             &lt;span style="color: #b0c4de;"&gt;:initarg&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:plain-password&lt;/span&gt;&lt;br /&gt;             &lt;span style="color: #b0c4de;"&gt;:type&lt;/span&gt; string)))&lt;br /&gt;&lt;br /&gt;(&lt;span style="color: #00ffff;"&gt;defmethod&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;initialize-instance&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:after&lt;/span&gt; ((user user)&lt;br /&gt;                                        &lt;span style="color: #98fb98;"&gt;&amp;amp;key&lt;/span&gt; plain-password&lt;br /&gt;                                        &lt;span style="color: #98fb98;"&gt;&amp;amp;allow-other-keys&lt;/span&gt;)&lt;br /&gt;  &lt;span style="color: #ffa07a;"&gt;"make-instance で :plain-password が指定されていた場合、&lt;br /&gt;password に hash-password したものを設定する。"&lt;/span&gt;&lt;br /&gt;  (&lt;span style="color: #00ffff;"&gt;when&lt;/span&gt; plain-password&lt;br /&gt;    (setf (password user) plain-password)))&lt;br /&gt;&lt;br /&gt;(&lt;span style="color: #00ffff;"&gt;defun&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;hash-password&lt;/span&gt; (password)&lt;br /&gt;  &lt;span style="color: #ffa07a;"&gt;"パスワードのハッシュ関数"&lt;/span&gt;&lt;br /&gt;  (ironclad:byte-array-to-hex-string&lt;br /&gt;   (ironclad:digest-sequence&lt;br /&gt;    &lt;span style="color: #b0c4de;"&gt;:sha256&lt;/span&gt;&lt;br /&gt;    (ironclad:ascii-string-to-byte-array password))))&lt;br /&gt;&lt;br /&gt;(&lt;span style="color: #00ffff;"&gt;defmethod&lt;/span&gt; (&lt;span style="color: #87cefa;"&gt;setf password)&lt;/span&gt; (password (user user))&lt;br /&gt;  &lt;span style="color: #ffa07a;"&gt;"パスワードのハッシュをセットする。"&lt;/span&gt;&lt;br /&gt;  (setf (slot-value user 'password) (hash-password password)))&lt;br /&gt;&lt;br /&gt;(&lt;span style="color: #00ffff;"&gt;defun&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;authenticate&lt;/span&gt; (email password)&lt;br /&gt;  (&lt;span style="color: #00ffff;"&gt;let&lt;/span&gt; ((password (hash-password password)))&lt;br /&gt;    (car&lt;br /&gt;     (clsql:select 'user&lt;br /&gt;                   &lt;span style="color: #b0c4de;"&gt;:flatp&lt;/span&gt; t&lt;br /&gt;                   &lt;span style="color: #b0c4de;"&gt;:where&lt;/span&gt; [and [= [email] email] [= [password] password]]))))&lt;br /&gt;&lt;span style="color: #ff7f24;"&gt;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;(authenticate "user1@example.com" "password")&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff7f24;"&gt;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;テーブル作成&lt;br /&gt;&lt;/span&gt;(&lt;span style="color: #00ffff;"&gt;with-db&lt;/span&gt;&lt;br /&gt;  (&lt;span style="color: #00ffff;"&gt;unless&lt;/span&gt; (clsql-sys:table-exists-p 'user)&lt;br /&gt;    (clsql-sys:create-view-from-class 'user)&lt;br /&gt;    'user))&lt;br /&gt;&lt;span style="color: #ff7f24;"&gt;#+テーブル削除&lt;br /&gt;(progn&lt;br /&gt;  (clsql-sys:drop-view-from-class 'user))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff7f24;"&gt;#+テストデータ作成&lt;br /&gt;(with-db&lt;br /&gt;  (let ((user (make-instance 'user :email "user1@example.com"&lt;br /&gt;                             :plain-password "password")))&lt;br /&gt;    (clsql-sys:update-records-from-instance user)))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff7f24;"&gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;;;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;Web server&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(setf&lt;br /&gt; &lt;span style="color: #ff7f24;"&gt;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;for utf-8&lt;br /&gt;&lt;/span&gt; hunchentoot:*hunchentoot-default-external-format* (flexi-streams:make-external-format &lt;span style="color: #b0c4de;"&gt;:utf-8&lt;/span&gt;)&lt;br /&gt; hunchentoot:*default-content-type* &lt;span style="color: #ffa07a;"&gt;"text/html; charset=utf-8"&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #ff7f24;"&gt;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;for debug&lt;br /&gt;&lt;/span&gt; hunchentoot:*catch-errors-p* nil)&lt;br /&gt;&lt;br /&gt;(setf hunchentoot:*dispatch-table*&lt;br /&gt;      (list&lt;br /&gt;       'hunchentoot:dispatch-easy-handlers&lt;br /&gt;       (hunchentoot:create-folder-dispatcher-and-handler &lt;span style="color: #ffa07a;"&gt;"/css/"&lt;/span&gt; *css-path*)&lt;br /&gt;       (hunchentoot:create-folder-dispatcher-and-handler &lt;span style="color: #ffa07a;"&gt;"/js/"&lt;/span&gt; *js-path*)))&lt;br /&gt;&lt;br /&gt;(&lt;span style="color: #00ffff;"&gt;defvar&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;*acceptor*&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;(&lt;span style="color: #00ffff;"&gt;defun&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;start&lt;/span&gt; (&lt;span style="color: #98fb98;"&gt;&amp;amp;optional&lt;/span&gt; (port 8888))&lt;br /&gt;  &lt;span style="color: #ffa07a;"&gt;"Web サーバ起動"&lt;/span&gt;&lt;br /&gt;  (setf *acceptor* (hunchentoot:start&lt;br /&gt;                    (make-instance 'hunchentoot:acceptor&lt;br /&gt;                                   &lt;span style="color: #b0c4de;"&gt;:port&lt;/span&gt; port))))&lt;br /&gt;&lt;br /&gt;(&lt;span style="color: #00ffff;"&gt;defun&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;stop&lt;/span&gt; ()&lt;br /&gt;  &lt;span style="color: #ffa07a;"&gt;"Web サーバ停止"&lt;/span&gt;&lt;br /&gt;  (hunchentoot:stop *acceptor*))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff7f24;"&gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;;;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;ビュー&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(&lt;span style="color: #00ffff;"&gt;defvar&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;*login-user*&lt;/span&gt; nil &lt;span style="color: #ffa07a;"&gt;"ログインユーザ"&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;(&lt;span style="color: #00ffff;"&gt;defun&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;login&lt;/span&gt; (user redirect-url)&lt;br /&gt;  &lt;span style="color: #ffa07a;"&gt;"ログイン処理"&lt;/span&gt;&lt;br /&gt;  (setf *login-user* user)&lt;br /&gt;  (&lt;span style="color: #00ffff;"&gt;when&lt;/span&gt; hunchentoot:*session*&lt;br /&gt;    (hunchentoot:remove-session hunchentoot:*session*))&lt;br /&gt;  (hunchentoot:start-session)&lt;br /&gt;  (setf (hunchentoot:session-value 'login-user-id) (id user))&lt;br /&gt;  (hunchentoot:redirect redirect-url))&lt;br /&gt;&lt;br /&gt;(&lt;span style="color: #00ffff;"&gt;defun&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;logout&lt;/span&gt; (redirect-url)&lt;br /&gt;  &lt;span style="color: #ffa07a;"&gt;"ログアウト処理"&lt;/span&gt;&lt;br /&gt;  (&lt;span style="color: #00ffff;"&gt;when&lt;/span&gt; hunchentoot:*session*&lt;br /&gt;    (hunchentoot:remove-session hunchentoot:*session*))&lt;br /&gt;  (setf *login-user* nil)&lt;br /&gt;  (hunchentoot:redirect redirect-url))&lt;br /&gt;&lt;br /&gt;(setf *prologue* &lt;span style="color: #ffa07a;"&gt;"&amp;lt;!DOCTYPE html&amp;gt;"&lt;/span&gt;)&lt;br /&gt;(setf *attribute-quote-char* #\")&lt;br /&gt;&lt;br /&gt;(&lt;span style="color: #00ffff;"&gt;defmacro&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;with-default-template&lt;/span&gt; ((&lt;span style="color: #98fb98;"&gt;&amp;amp;key&lt;/span&gt; (title &lt;span style="color: #ffa07a;"&gt;"題名"&lt;/span&gt;)&lt;br /&gt;                                       (charset &lt;span style="color: #ffa07a;"&gt;"UTF-8"&lt;/span&gt;)) &lt;span style="color: #98fb98;"&gt;&amp;amp;body&lt;/span&gt; body)&lt;br /&gt;  &lt;span style="color: #ffa07a;"&gt;"ページのテンプレート"&lt;/span&gt;&lt;br /&gt;  `(&lt;span style="color: #00ffff;"&gt;with-html-output-to-string&lt;/span&gt; (out nil &lt;span style="color: #b0c4de;"&gt;:prologue&lt;/span&gt; t &lt;span style="color: #b0c4de;"&gt;:indent&lt;/span&gt; t)&lt;br /&gt;     (htm (&lt;span style="color: #b0c4de;"&gt;:html&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:lang&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"ja"&lt;/span&gt;&lt;br /&gt;                 (&lt;span style="color: #b0c4de;"&gt;:head&lt;/span&gt;&lt;br /&gt;                  (&lt;span style="color: #b0c4de;"&gt;:meta&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:charset&lt;/span&gt; ,charset)&lt;br /&gt;                  (&lt;span style="color: #b0c4de;"&gt;:title&lt;/span&gt; ,title)&lt;br /&gt;                  (&lt;span style="color: #b0c4de;"&gt;:link&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:rel&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"stylesheet"&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:href&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"css/main.css"&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:media&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"all"&lt;/span&gt;)&lt;br /&gt;                  (&lt;span style="color: #b0c4de;"&gt;:script&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:src&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"&lt;/span&gt;))&lt;br /&gt;                 (&lt;span style="color: #b0c4de;"&gt;:body&lt;/span&gt; ,@body)))))&lt;br /&gt;&lt;br /&gt;(&lt;span style="color: #00ffff;"&gt;defun&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;select-login-user&lt;/span&gt; ()&lt;br /&gt;  (&lt;span style="color: #00ffff;"&gt;let&lt;/span&gt; ((login-user-id (hunchentoot:session-value 'login-user-id)))&lt;br /&gt;    (&lt;span style="color: #00ffff;"&gt;when&lt;/span&gt; login-user-id&lt;br /&gt;      (caar (clsql:select 'user&lt;br /&gt;                          &lt;span style="color: #b0c4de;"&gt;:where&lt;/span&gt; [= [id] login-user-id])))))&lt;br /&gt;&lt;br /&gt;(&lt;span style="color: #00ffff;"&gt;defmacro&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;with-login-user&lt;/span&gt; (&lt;span style="color: #98fb98;"&gt;&amp;amp;body&lt;/span&gt; body)&lt;br /&gt;  `(&lt;span style="color: #00ffff;"&gt;let&lt;/span&gt; ((*login-user* (select-login-user)))&lt;br /&gt;     ,@body))&lt;br /&gt;&lt;br /&gt;(&lt;span style="color: #00ffff;"&gt;defmacro&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;define-page&lt;/span&gt; (description lambda-list &lt;span style="color: #98fb98;"&gt;&amp;amp;body&lt;/span&gt; body)&lt;br /&gt;  &lt;span style="color: #ffa07a;"&gt;"ページ定義。&lt;br /&gt;&lt;br /&gt;description&lt;br /&gt;hunchentoot:define-easy-handler に加えて&lt;br /&gt;ログインが必要な場合は :login-require-p t を指定する。&lt;br /&gt;&lt;br /&gt;lambda-list&lt;br /&gt;hunchentoot:define-easy-handler と同じ。"&lt;/span&gt;&lt;br /&gt;  (&lt;span style="color: #00ffff;"&gt;let&lt;/span&gt; ((login-required-p (and (listp description)&lt;br /&gt;                               (getf (cdr description) &lt;span style="color: #b0c4de;"&gt;:login-require-p&lt;/span&gt;))))&lt;br /&gt;    (&lt;span style="color: #00ffff;"&gt;when&lt;/span&gt; (listp description)&lt;br /&gt;      (remf (cdr description) &lt;span style="color: #b0c4de;"&gt;:login-require-p&lt;/span&gt;))&lt;br /&gt;    `(&lt;span style="color: #00ffff;"&gt;hunchentoot:define-easy-handler&lt;/span&gt; ,description ,lambda-list&lt;br /&gt;       (&lt;span style="color: #00ffff;"&gt;with-db&lt;/span&gt;&lt;br /&gt;         (&lt;span style="color: #00ffff;"&gt;with-login-user&lt;/span&gt;&lt;br /&gt;           ,@(&lt;span style="color: #00ffff;"&gt;when&lt;/span&gt; login-required-p&lt;br /&gt;               `((&lt;span style="color: #00ffff;"&gt;unless&lt;/span&gt; *login-user*&lt;br /&gt;                   &lt;span style="color: #ff7f24;"&gt;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;ログインしていな場合の処理&lt;br /&gt;&lt;/span&gt;                   (hunchentoot:redirect &lt;span style="color: #ffa07a;"&gt;"/"&lt;/span&gt;))))&lt;br /&gt;           ,@body)))))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff7f24;"&gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;;;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;各ページ&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff7f24;"&gt;;;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;トップページ&lt;br /&gt;&lt;/span&gt;(&lt;span style="color: #00ffff;"&gt;define-page&lt;/span&gt; (%root &lt;span style="color: #b0c4de;"&gt;:uri&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"/"&lt;/span&gt;) ()&lt;br /&gt;  (&lt;span style="color: #00ffff;"&gt;with-default-template&lt;/span&gt; (&lt;span style="color: #b0c4de;"&gt;:title&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"トップ"&lt;/span&gt;)&lt;br /&gt;    (htm&lt;br /&gt;     (&lt;span style="color: #b0c4de;"&gt;:div&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:class&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"ba"&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"ブランクプロジェクト"&lt;/span&gt;)&lt;br /&gt;     (&lt;span style="color: #00ffff;"&gt;if&lt;/span&gt; *login-user*&lt;br /&gt;         (htm (&lt;span style="color: #b0c4de;"&gt;:div&lt;/span&gt; (str (email *login-user*))&lt;br /&gt;                    &lt;span style="color: #ffa07a;"&gt;" でログインしています。"&lt;/span&gt;)&lt;br /&gt;              (&lt;span style="color: #b0c4de;"&gt;:div&lt;/span&gt; (&lt;span style="color: #b0c4de;"&gt;:a&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:href&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"logout"&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"ログアウト"&lt;/span&gt;)))&lt;br /&gt;         (htm (&lt;span style="color: #b0c4de;"&gt;:div&lt;/span&gt; (&lt;span style="color: #b0c4de;"&gt;:a&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:href&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"login"&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"ログイン"&lt;/span&gt;))))&lt;br /&gt;     (htm (&lt;span style="color: #b0c4de;"&gt;:div&lt;/span&gt; (&lt;span style="color: #b0c4de;"&gt;:a&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:href&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"/secret"&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"ログインが必要なページへのリンク"&lt;/span&gt;))))))&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff7f24;"&gt;;;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;ログインページ&lt;br /&gt;&lt;/span&gt;(&lt;span style="color: #00ffff;"&gt;define-page&lt;/span&gt; (%login &lt;span style="color: #b0c4de;"&gt;:uri&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"/login"&lt;/span&gt;) (email messages)&lt;br /&gt;  (&lt;span style="color: #00ffff;"&gt;with-default-template&lt;/span&gt; (&lt;span style="color: #b0c4de;"&gt;:title&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"ログイン"&lt;/span&gt;)&lt;br /&gt;    (htm&lt;br /&gt;     (&lt;span style="color: #00ffff;"&gt;when&lt;/span&gt; messages&lt;br /&gt;       (htm (&lt;span style="color: #b0c4de;"&gt;:ul&lt;/span&gt; (&lt;span style="color: #00ffff;"&gt;loop&lt;/span&gt; for message in messages&lt;br /&gt;                       do (htm (&lt;span style="color: #b0c4de;"&gt;:li&lt;/span&gt; (str message)))))))&lt;br /&gt;     (&lt;span style="color: #b0c4de;"&gt;:form&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:action&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"authenticate"&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:method&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:post&lt;/span&gt;&lt;br /&gt;            (&lt;span style="color: #b0c4de;"&gt;:div&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"email"&lt;/span&gt;&lt;br /&gt;                  (&lt;span style="color: #b0c4de;"&gt;:input&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:type&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:text&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:name&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"email"&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:value&lt;/span&gt; email))&lt;br /&gt;            (&lt;span style="color: #b0c4de;"&gt;:div&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"パスワード"&lt;/span&gt;&lt;br /&gt;                  (&lt;span style="color: #b0c4de;"&gt;:input&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:type&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:password&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:name&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"password"&lt;/span&gt;))&lt;br /&gt;            (&lt;span style="color: #b0c4de;"&gt;:div&lt;/span&gt; (&lt;span style="color: #b0c4de;"&gt;:input&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:type&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:submit&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:value&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"ログイン"&lt;/span&gt;))))))&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff7f24;"&gt;;;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;認証&lt;br /&gt;&lt;/span&gt;(&lt;span style="color: #00ffff;"&gt;define-page&lt;/span&gt; (%authenticate &lt;span style="color: #b0c4de;"&gt;:uri&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"/authenticate"&lt;/span&gt;)&lt;br /&gt;    ((email &lt;span style="color: #b0c4de;"&gt;:init-form&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;""&lt;/span&gt;) (password &lt;span style="color: #b0c4de;"&gt;:init-form&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;""&lt;/span&gt;))&lt;br /&gt;  (&lt;span style="color: #00ffff;"&gt;let&lt;/span&gt; (messages)&lt;br /&gt;    (&lt;span style="color: #00ffff;"&gt;when&lt;/span&gt; (string= &lt;span style="color: #ffa07a;"&gt;""&lt;/span&gt; email)&lt;br /&gt;      (push &lt;span style="color: #ffa07a;"&gt;"email を入力してください。"&lt;/span&gt; messages))&lt;br /&gt;    (&lt;span style="color: #00ffff;"&gt;when&lt;/span&gt; (string= &lt;span style="color: #ffa07a;"&gt;""&lt;/span&gt; password)&lt;br /&gt;      (push &lt;span style="color: #ffa07a;"&gt;"パスワードを入力してください。"&lt;/span&gt; messages))&lt;br /&gt;    (&lt;span style="color: #00ffff;"&gt;if&lt;/span&gt; messages&lt;br /&gt;        (%login &lt;span style="color: #b0c4de;"&gt;:email&lt;/span&gt; email &lt;span style="color: #b0c4de;"&gt;:messages&lt;/span&gt; (reverse messages))&lt;br /&gt;        (&lt;span style="color: #00ffff;"&gt;let&lt;/span&gt; ((user (authenticate email password)))&lt;br /&gt;          (&lt;span style="color: #00ffff;"&gt;if&lt;/span&gt; user&lt;br /&gt;              (login user &lt;span style="color: #ffa07a;"&gt;"/"&lt;/span&gt;)&lt;br /&gt;              (%login &lt;span style="color: #b0c4de;"&gt;:email&lt;/span&gt; email))))))&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff7f24;"&gt;;;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;ログアウト&lt;br /&gt;&lt;/span&gt;(&lt;span style="color: #00ffff;"&gt;define-page&lt;/span&gt; (%logout &lt;span style="color: #b0c4de;"&gt;:uri&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"/logout"&lt;/span&gt;) ()&lt;br /&gt;  (logout &lt;span style="color: #ffa07a;"&gt;"/"&lt;/span&gt;))&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff7f24;"&gt;;;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;ログインが必要なページ&lt;br /&gt;&lt;/span&gt;(&lt;span style="color: #00ffff;"&gt;define-page&lt;/span&gt; (secrect &lt;span style="color: #b0c4de;"&gt;:uri&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"/secret"&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:login-require-p&lt;/span&gt; t) ()&lt;br /&gt;  (&lt;span style="color: #00ffff;"&gt;with-default-template&lt;/span&gt; (&lt;span style="color: #b0c4de;"&gt;:title&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"秘密のページ"&lt;/span&gt;)&lt;br /&gt;   (htm (&lt;span style="color: #b0c4de;"&gt;:p&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"このページはログインが必要なページです。"&lt;/span&gt;))))&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-4898829683499775168?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/RmSkzB4JbYXklhBykWTBDmnv5ss/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RmSkzB4JbYXklhBykWTBDmnv5ss/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/RmSkzB4JbYXklhBykWTBDmnv5ss/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RmSkzB4JbYXklhBykWTBDmnv5ss/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/vExUQo3O428" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/4898829683499775168/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=4898829683499775168" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/4898829683499775168?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/4898829683499775168?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/vExUQo3O428/common-lisp-web.html" title="Common Lisp で Web アプリを作るためのブランクプロジェクト" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>0</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/02/common-lisp-web.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUANSHY_eip7ImA9Wx9UEUk.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-2739897927730643707</id><published>2011-02-08T15:49:00.001+09:00</published><updated>2011-02-08T15:49:59.842+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-08T15:49:59.842+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Common Lisp" /><title>progs</title><content type="html">&lt;p&gt;たまにはこういうのもいいでしょう。&lt;/p&gt;&lt;p&gt;SERIES は次のようにネストしながら、横に長くなり過ぎる。&lt;/p&gt; &lt;pre class='src'&gt;(collect&lt;br /&gt;    (+ 10&lt;br /&gt;       (choose-if #'oddp&lt;br /&gt;                  (scan-range &lt;span style='color: #b0c4de;'&gt;:upto&lt;/span&gt; 5))))&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; (11 13 15)&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;そこで、パイプ的な動きをするマクロを書いてみた。ネストせず、処理の順番どおり、縦に書ける。多値には対応せず。&lt;/p&gt; &lt;pre class='src'&gt;(progs ()&lt;br /&gt;  (scan-range &lt;span style='color: #b0c4de;'&gt;:upto&lt;/span&gt; 5)&lt;br /&gt;  (choose-if #'oddp)&lt;br /&gt;  (+ 10)&lt;br /&gt;  (collect))&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; (11 13 15)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(progs (x)&lt;br /&gt;  (scan-range &lt;span style='color: #b0c4de;'&gt;:upto&lt;/span&gt; 5)&lt;br /&gt;  (choose-if #'oddp)&lt;br /&gt;  (* x x)&lt;br /&gt;  (collect))&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; (1 9 25)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(progs (choose-if)&lt;br /&gt;  (scan-range &lt;span style='color: #b0c4de;'&gt;:upto&lt;/span&gt; 5)&lt;br /&gt;  (choose-if #'oddp)&lt;br /&gt;  (- choose-if 10)&lt;br /&gt;  (collect))&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; (-9 -7 -5)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(progs (x)&lt;br /&gt;  (scan-symbols &lt;span style='color: #b0c4de;'&gt;:cl&lt;/span&gt;)&lt;br /&gt;  (collect-max (length (symbol-name x)) x))&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; LEAST-POSITIVE-NORMALIZED-DOUBLE-FLOAT&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;定義はこれ。&lt;/p&gt; &lt;pre class='src'&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;progs-body&lt;/span&gt; (var body)&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;let&lt;/span&gt; ((form (&lt;span style='color: #00ffff;'&gt;if&lt;/span&gt; (collect (choose-if (&lt;span style='color: #00ffff;'&gt;lambda&lt;/span&gt; (x) (eq var x))&lt;br /&gt;                                      (scan-lists-of-lists-fringe (cdar body))))&lt;br /&gt;                  (car body)&lt;br /&gt;                  (append (car body) (list var)))))&lt;br /&gt;    (&lt;span style='color: #00ffff;'&gt;if&lt;/span&gt; (endp (cdr body))&lt;br /&gt;        form&lt;br /&gt;        `(&lt;span style='color: #00ffff;'&gt;let&lt;/span&gt; ((,var ,form))&lt;br /&gt;           ,(progs-body var (cdr body))))))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defmacro&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;progs&lt;/span&gt; ((&lt;span style='color: #98fb98;'&gt;&amp;amp;optional&lt;/span&gt; (var (gensym))) &lt;span style='color: #98fb98;'&gt;&amp;amp;body&lt;/span&gt; body)&lt;br /&gt;  `(&lt;span style='color: #00ffff;'&gt;let&lt;/span&gt; ((,var ,(car body)))&lt;br /&gt;     ,(progs-body var (cdr body))))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;let に展開しているけど、 multiple-value-bind に展開すれば多値に対応できると思う。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-2739897927730643707?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Kp7tMk2_wSFtSLGNP4pV07ZqJuc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Kp7tMk2_wSFtSLGNP4pV07ZqJuc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Kp7tMk2_wSFtSLGNP4pV07ZqJuc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Kp7tMk2_wSFtSLGNP4pV07ZqJuc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/uNoOZZLa9oo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/2739897927730643707/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=2739897927730643707" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/2739897927730643707?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/2739897927730643707?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/uNoOZZLa9oo/progs.html" title="progs" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>0</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/02/progs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIFRnY9fSp7ImA9Wx9VFkQ.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-2789845780681518694</id><published>2011-02-03T02:14:00.001+09:00</published><updated>2011-02-03T11:01:57.865+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-03T11:01:57.865+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Common Lisp" /><category scheme="http://www.blogger.com/atom/ns#" term="Gnus" /><title>Eternal September で Gnus を使って comp.lang.lisp を読む</title><content type="html">&lt;p&gt;comp.lang.lisp を読むようにしようと思った。&lt;/p&gt;&lt;p&gt;ニュースサーバは &lt;a href="http://eternal-september.org/"&gt;Eternal September&lt;/a&gt; が使える。ありがたい。 &lt;a href="http://eternal-september.org/"&gt;http://eternal-september.org/&lt;/a&gt; で登録する。&lt;/p&gt;&lt;p&gt;~/.gnus&lt;/p&gt; &lt;pre class="src"&gt;(setq gnus-select-method '(nntp &lt;span style="color: #ffa07a;"&gt;"news.eternal-september.org"&lt;/span&gt;))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;~/.authinfo に External September から送られてきたメールに書いてある UserID と Password を書いておく。&lt;/p&gt; &lt;pre class="src"&gt;machine news.eternal-september.org login UserID force yes password Password&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Gnus は難しいが、以下の手順をしておけば、あとは Space キーだけで読める。必要に応じて C-c Tab で INFO が表示されるので読む。&lt;/p&gt; &lt;pre class="src"&gt;M-x gnus&lt;br /&gt;*Group* バッファが開いたら&lt;br /&gt;^&lt;br /&gt;*Server* バッファが開いたら nntp:news.eternal-september.org で&lt;br /&gt;RET&lt;br /&gt;しばらく待つとニュースグループの一覧が表示されるので comp.lang.lisp で&lt;br /&gt;u&lt;br /&gt;あるいは *Group* バッファで&lt;br /&gt;U comp.lang.lisp&lt;br /&gt;最初は未読が多過ぎるので&lt;br /&gt;c&lt;br /&gt;で全て即読にする。&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;comp.lang.forth と comp.lang.prolog も読んでみよう。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-2789845780681518694?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tp54Xx5Z1p41lAyNgk3dtEvG1M4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tp54Xx5Z1p41lAyNgk3dtEvG1M4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tp54Xx5Z1p41lAyNgk3dtEvG1M4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tp54Xx5Z1p41lAyNgk3dtEvG1M4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/p7y7yQ4JpVQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/2789845780681518694/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=2789845780681518694" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/2789845780681518694?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/2789845780681518694?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/p7y7yQ4JpVQ/eternal-september-gnus-complanglisp.html" title="Eternal September で Gnus を使って comp.lang.lisp を読む" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>0</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/02/eternal-september-gnus-complanglisp.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUGRn44eCp7ImA9Wx9VEEw.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-6139447218039120056</id><published>2011-01-26T13:30:00.001+09:00</published><updated>2011-01-26T13:30:27.030+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-26T13:30:27.030+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Common Lisp" /><title>現在の optimize 指定を取得する</title><content type="html">&lt;p&gt;SBCL 依存だけど sb-ext:describe-compiler-policy または sb-cltl2:declaration-information で取得できる。&lt;/p&gt; &lt;pre class='src'&gt;(sb-ext:describe-compiler-policy)&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;-&amp;gt;   Basic qualities:&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;COMPILATION-SPEED = 1&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;DEBUG = 3&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;SAFETY = 3&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;SPACE = 1&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;SPEED = 1&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;INHIBIT-WARNINGS = 1&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;     &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;Dependent qualities:&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;SB-C::CHECK-CONSTANT-MODIFICATION = 1 -&amp;gt; 3 (yes)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;SB-C::TYPE-CHECK = 1 -&amp;gt; 3 (full)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;SB-C::CHECK-TAG-EXISTENCE = 1 -&amp;gt; 3 (yes)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;SB-C::LET-CONVERSION = 1 -&amp;gt; 0 (off)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;SB-C:VERIFY-ARG-COUNT = 1 -&amp;gt; 3 (yes)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;SB-C::MERGE-TAIL-CALLS = 1 -&amp;gt; 0 (no)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;SB-C::INSERT-DEBUG-CATCH = 1 -&amp;gt; 3 (yes)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;SB-C::RECOGNIZE-SELF-CALLS = 1 -&amp;gt; 0 (no)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;SB-C::FLOAT-ACCURACY = 1 -&amp;gt; 3 (full)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;SB-C:INSERT-STEP-CONDITIONS = 1 -&amp;gt; 3 (full)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;SB-C::COMPUTE-DEBUG-FUN = 1 -&amp;gt; 3 (yes)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;SB-C::PRESERVE-SINGLE-USE-DEBUG-VARIABLES = 1 -&amp;gt; 3 (yes)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;SB-C::INSERT-ARRAY-BOUNDS-CHECKS = 1 -&amp;gt; 3 (yes)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;SB-C::STORE-XREF-DATA = 1 -&amp;gt; 3 (yes)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;SB-C:STORE-COVERAGE-DATA = 1 -&amp;gt; 0 (no)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(sb-cltl2:declaration-information 'optimize)&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; ((COMPILATION-SPEED 1) (DEBUG 3) (SAFETY 3) (SPACE 1) (SPEED 1)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;    &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;(INHIBIT-WARNINGS 1) (SB-C::CHECK-CONSTANT-MODIFICATION 1)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;    &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;(SB-C::TYPE-CHECK 1) (SB-C::CHECK-TAG-EXISTENCE 1) (SB-C::LET-CONVERSION 1)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;    &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;(SB-C:VERIFY-ARG-COUNT 1) (SB-C::MERGE-TAIL-CALLS 1)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;    &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;(SB-C::INSERT-DEBUG-CATCH 1) (SB-C::RECOGNIZE-SELF-CALLS 1)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;    &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;(SB-C::FLOAT-ACCURACY 1) (SB-C:INSERT-STEP-CONDITIONS 1)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;    &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;(SB-C::COMPUTE-DEBUG-FUN 1) (SB-C::PRESERVE-SINGLE-USE-DEBUG-VARIABLES 1)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;    &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;(SB-C::INSERT-ARRAY-BOUNDS-CHECKS 1) (SB-C::STORE-XREF-DATA 1)&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;    &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;(SB-C:STORE-COVERAGE-DATA 1))&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-6139447218039120056?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SiFlPTreTUnJcTMDmH-HfyTnbi8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SiFlPTreTUnJcTMDmH-HfyTnbi8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/SiFlPTreTUnJcTMDmH-HfyTnbi8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SiFlPTreTUnJcTMDmH-HfyTnbi8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/gt1bQNsAP7U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/6139447218039120056/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=6139447218039120056" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/6139447218039120056?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/6139447218039120056?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/gt1bQNsAP7U/optimize.html" title="現在の optimize 指定を取得する" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>0</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/01/optimize.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMFRHk8eip7ImA9Wx9VEEw.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-1521761383353405479</id><published>2011-01-15T05:38:00.001+09:00</published><updated>2011-01-26T13:33:35.772+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-26T13:33:35.772+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="beirc" /><category scheme="http://www.blogger.com/atom/ns#" term="Common Lisp" /><title>CLIM ベースの IRC クライアント beirc</title><content type="html">&lt;p&gt;今年は &lt;a href="http://www.cliki.net/clim-desktop"&gt;CLIM-desktop&lt;/a&gt; を流行っているようなので、 @g000001 さんから #Lisp_Scheme できいた、 CLIM ベースのクライアント &lt;a href="http://common-lisp.net/project/beirc/"&gt;beirc&lt;/a&gt; を使ってみました。&lt;/p&gt;&lt;p&gt;インストールは Quicklisp で。&lt;/p&gt; &lt;pre class="src"&gt;(ql:quickload &lt;span style="color: #ffa07a;"&gt;"beirc"&lt;/span&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;起動はレプルから。&lt;/p&gt; &lt;pre class="src"&gt;(beirc:beirc)&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;使い方（コマンド）は &lt;a href="http://www.cliki.net/beirc"&gt;CLiki&lt;/a&gt; のページが詳しいようですが、次の2つのコマンドがあれば何とかなるでしょう。&lt;/p&gt; &lt;ul&gt; &lt;li&gt;/Connect server nick&lt;/li&gt; &lt;li&gt;/Join channel&lt;/li&gt; &lt;/ul&gt;&lt;p&gt;~/.beirc.lisp に設定情報を書いおけば起動時に自動的にサーバに接続してくれたりします。また日本語まわりの設定もそのファイルに書いておけばいいかと思います。&lt;/p&gt;&lt;p&gt;~/.beirc.lisp&lt;/p&gt; &lt;pre class="src"&gt;(&lt;span style="color: #00ffff;"&gt;in-package&lt;/span&gt; &lt;span style="color: #b0c4de;"&gt;:beirc&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff7f24;"&gt;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;フォント&lt;br /&gt;&lt;/span&gt;(&lt;span style="color: #00ffff;"&gt;require&lt;/span&gt; &lt;span style="color: #7fffd4;"&gt;:mcclim-freetype&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff7f24;"&gt;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;uim での日本語入力 https://github.com/quek/mcclim-uim&lt;br /&gt;&lt;/span&gt;(&lt;span style="color: #00ffff;"&gt;require&lt;/span&gt; &lt;span style="color: #7fffd4;"&gt;:mcclim-uim&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff7f24;"&gt;;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;variables.lisp を参照。&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff7f24;"&gt;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;自動的に接続するサーバ&lt;br /&gt;&lt;/span&gt;(setq *auto-connect-list* '(&lt;span style="color: #ffa07a;"&gt;"irc.freenode.net"&lt;/span&gt;))&lt;br /&gt;&lt;span style="color: #ff7f24;"&gt;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;自動的に join するチャンネル&lt;br /&gt;&lt;/span&gt;(setq *auto-join-alist* '((&lt;span style="color: #ffa07a;"&gt;"irc.freenode.net"&lt;/span&gt; . (&lt;span style="color: #ffa07a;"&gt;"#lisp"&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;"#Lisp_Scheme"&lt;/span&gt;))))&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff7f24;"&gt;;; &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;ニックネーム&lt;br /&gt;&lt;/span&gt;(setq *default-nick* &lt;span style="color: #ffa07a;"&gt;"quek"&lt;/span&gt;)&lt;br /&gt;(setq *default-realname* &lt;span style="color: #ffa07a;"&gt;"Yoshinori Tahara"&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;(setq *hyperspec-base-url* &lt;span style="color: #ffa07a;"&gt;"file://localhost/usr/share/doc/hyperspec/"&lt;/span&gt;)&lt;br /&gt;(setq *default-web-browser* &lt;span style="color: #ffa07a;"&gt;"/usr/bin/opera"&lt;/span&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;ただ、SBCL だとちょっと問題があるので ~/.sbclcr にその対策もかねて、 beirc 起動用の関数を書いておきます。&lt;/p&gt; &lt;pre class="src"&gt;(&lt;span style="color: #00ffff;"&gt;defun&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;beirc&lt;/span&gt; ()&lt;br /&gt;  &lt;span style="color: #ffa07a;"&gt;"beirc を起動す2。"&lt;/span&gt;&lt;br /&gt;  (&lt;span style="color: #00ffff;"&gt;require&lt;/span&gt; &lt;span style="color: #7fffd4;"&gt;:beirc&lt;/span&gt;)&lt;br /&gt;  (eval (read-from-string &lt;span style="color: #ffa07a;"&gt;"&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ffc0cb; font-weight: bold;"&gt;(&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;progn (setf beirc:*beirc-user-init-file* \"~/.beirc.lisp\")&lt;br /&gt;       (beirc:beirc))&lt;br /&gt;"&lt;/span&gt;)))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;mcclim-uim の微妙さをがまんしてもらえれば、普通に使えます。&lt;/p&gt;&lt;p&gt;ところで &lt;a href="http://www.cliki.net/clim-desktop"&gt;CLIM-desktop&lt;/a&gt; を見ると Backtrace Dialog, Restarts Dialog とか McCLIM の機能としてあるんですね。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-1521761383353405479?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QJ9Ssy5RmeKKpWocdgGidcNTtqI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QJ9Ssy5RmeKKpWocdgGidcNTtqI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QJ9Ssy5RmeKKpWocdgGidcNTtqI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QJ9Ssy5RmeKKpWocdgGidcNTtqI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/SvKr416YZbo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/1521761383353405479/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=1521761383353405479" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/1521761383353405479?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/1521761383353405479?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/SvKr416YZbo/clim-irc-beirc.html" title="CLIM ベースの IRC クライアント beirc" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>0</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/01/clim-irc-beirc.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUABQX49cCp7ImA9Wx9XFko.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-5255040915921278523</id><published>2011-01-11T01:42:00.001+09:00</published><updated>2011-01-11T01:42:30.068+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-11T01:42:30.068+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Common Lisp" /><title>Common Lisp でパッケージのニックネームを変える</title><content type="html">&lt;p&gt;rename-package を使う。&lt;/p&gt; &lt;pre class='src'&gt;(&lt;span style='color: #00ffff;'&gt;defun&lt;/span&gt; &lt;span style='color: #87cefa;'&gt;set-package-nicknames&lt;/span&gt; (package &lt;span style='color: #98fb98;'&gt;&amp;amp;rest&lt;/span&gt; nicknames)&lt;br /&gt;  (rename-package package (package-name package) nicknames))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;defpackage&lt;/span&gt; &lt;span style='color: #98fb98;'&gt;:foo&lt;/span&gt;&lt;br /&gt;  (&lt;span style='color: #b0c4de;'&gt;:nicknames&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:bar&lt;/span&gt;))&lt;br /&gt;&lt;br /&gt;(values (package-name &lt;span style='color: #b0c4de;'&gt;:foo&lt;/span&gt;) (package-nicknames &lt;span style='color: #b0c4de;'&gt;:foo&lt;/span&gt;))&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; "FOO"&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;("BAR")&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(set-package-nickname &lt;span style='color: #b0c4de;'&gt;:foo&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:baz&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:baha&lt;/span&gt;)&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; #&amp;lt;PACKAGE "FOO"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(values (package-name &lt;span style='color: #b0c4de;'&gt;:foo&lt;/span&gt;) (package-nicknames &lt;span style='color: #b0c4de;'&gt;:foo&lt;/span&gt;))&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; "FOO"&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;("BAHA" "BAZ")&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(set-package-nickname &lt;span style='color: #b0c4de;'&gt;:foo&lt;/span&gt;)&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; #&amp;lt;PACKAGE "FOO"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(values (package-name &lt;span style='color: #b0c4de;'&gt;:foo&lt;/span&gt;) (package-nicknames &lt;span style='color: #b0c4de;'&gt;:foo&lt;/span&gt;))&lt;br /&gt;&lt;span style='color: #ff7f24;'&gt;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;=&amp;gt; "FOO"&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;   &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;NIL&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-5255040915921278523?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HF9AO6vufYiTXSncE0CceAmL3F8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HF9AO6vufYiTXSncE0CceAmL3F8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HF9AO6vufYiTXSncE0CceAmL3F8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HF9AO6vufYiTXSncE0CceAmL3F8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/dENR3SYNuj4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/5255040915921278523/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=5255040915921278523" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/5255040915921278523?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/5255040915921278523?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/dENR3SYNuj4/common-lisp.html" title="Common Lisp でパッケージのニックネームを変える" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>0</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/01/common-lisp.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cHQ3Y8fyp7ImA9Wx9XFU4.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-4054688045343340980</id><published>2011-01-09T08:57:00.001+09:00</published><updated>2011-01-09T08:57:12.877+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-09T08:57:12.877+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Common Lisp" /><category scheme="http://www.blogger.com/atom/ns#" term="Climacs" /><title>Climacs に Switch To View Other Window と Find File Other Window を実装</title><content type="html">&lt;p&gt;勝手に github に fork して Climacs をいじることにしてみた。 McCLIM も github に勝手に fork した。&lt;/p&gt;&lt;p&gt;&lt;a href='https://github.com/LaPingvino/Climacs'&gt;https://github.com/LaPingvino/Climacs&lt;/a&gt; もあるので、そのうち Pull Request できたらいいと思う。&lt;/p&gt;&lt;p&gt;Emacs の switch-to-buffer-other-window と find-file-other-window 相当を実装した。&lt;/p&gt;&lt;p&gt;window-commands.lisp&lt;/p&gt; &lt;pre class='src'&gt;&lt;span style='color: #ff7f24;'&gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;Commands for switching/find-file in other window&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;define-command&lt;/span&gt; (com-switch-to-view-other-window &lt;span style='color: #b0c4de;'&gt;:name&lt;/span&gt; t &lt;span style='color: #b0c4de;'&gt;:command-table&lt;/span&gt; window-table)&lt;br /&gt;    ((view 'view &lt;span style='color: #b0c4de;'&gt;:default&lt;/span&gt; (or (cadr (views *application-frame*)) (any-view))))&lt;br /&gt;  &lt;span style='color: #ffa07a;'&gt;"Prompt for a view name and switch to that view in other window.&lt;br /&gt;If the a view with that name does not exist, create a buffer-view&lt;br /&gt;with the name and switch to it. Uses the name of the next&lt;br /&gt;view (if any) as a default."&lt;/span&gt;&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;when&lt;/span&gt; (= 1 (length (windows *application-frame*)))&lt;br /&gt;    (com-split-window-horizontally t))&lt;br /&gt;  (com-other-window)&lt;br /&gt;  (com-switch-to-view view))&lt;br /&gt;&lt;br /&gt;(set-key `(com-switch-to-view-other-window ,*unsupplied-argument-marker*)&lt;br /&gt;         'window-table&lt;br /&gt;         '((#\x &lt;span style='color: #b0c4de;'&gt;:control&lt;/span&gt;) (#\4) (#\b)))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color: #00ffff;'&gt;define-command&lt;/span&gt; (com-find-file-other-window &lt;span style='color: #b0c4de;'&gt;:name&lt;/span&gt; t &lt;span style='color: #b0c4de;'&gt;:command-table&lt;/span&gt; window-table)&lt;br /&gt;    ((filepath 'pathname&lt;br /&gt;               &lt;span style='color: #b0c4de;'&gt;:prompt&lt;/span&gt; &lt;span style='color: #ffa07a;'&gt;"Find File in other window: "&lt;/span&gt;&lt;br /&gt;               &lt;span style='color: #b0c4de;'&gt;:prompt-mode&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:raw&lt;/span&gt;&lt;br /&gt;               &lt;span style='color: #b0c4de;'&gt;:default&lt;/span&gt; (esa-io::directory-of-current-buffer)&lt;br /&gt;               &lt;span style='color: #b0c4de;'&gt;:default-type&lt;/span&gt; 'pathname&lt;br /&gt;               &lt;span style='color: #b0c4de;'&gt;:insert-default&lt;/span&gt; t))&lt;br /&gt;  &lt;span style='color: #ffa07a;'&gt;"Prompt for a filename then edit that file in other window.&lt;br /&gt;If a buffer is already visiting that file, switch to that&lt;br /&gt;buffer. Does not create a file if the filename given does not&lt;br /&gt;name an existing file."&lt;/span&gt;&lt;br /&gt;  (&lt;span style='color: #00ffff;'&gt;when&lt;/span&gt; (= 1 (length (windows *application-frame*)))&lt;br /&gt;    (com-split-window-horizontally t))&lt;br /&gt;  (com-other-window)&lt;br /&gt;  (esa-io:com-find-file filepath))&lt;br /&gt;&lt;br /&gt;(set-key `(com-find-file-other-window ,*unsupplied-argument-marker*)&lt;br /&gt;         'window-table&lt;br /&gt;         '((#\x &lt;span style='color: #b0c4de;'&gt;:control&lt;/span&gt;) (#\4) (#\f)))&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-4054688045343340980?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hChTwz7NVBtlrjDQjUDLT9_-tHU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hChTwz7NVBtlrjDQjUDLT9_-tHU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hChTwz7NVBtlrjDQjUDLT9_-tHU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hChTwz7NVBtlrjDQjUDLT9_-tHU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/aEkxp3YFaU0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/4054688045343340980/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=4054688045343340980" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/4054688045343340980?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/4054688045343340980?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/aEkxp3YFaU0/climacs-switch-to-view-other-window.html" title="Climacs に Switch To View Other Window と Find File Other Window を実装" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>0</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/01/climacs-switch-to-view-other-window.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8FQ3g6cCp7ImA9Wx9XEkQ.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-2490825138675632864</id><published>2011-01-06T14:46:00.001+09:00</published><updated>2011-01-06T14:46:52.618+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-06T14:46:52.618+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Common Lisp" /><category scheme="http://www.blogger.com/atom/ns#" term="Climacs" /><title>Climacs での色（フェイス）の設定</title><content type="html">&lt;p&gt;climacs:climacs-rv で起動すると黒背景になる。でも、デフォルトの色付が合わない。そんな場合は次のように各 drawing-options を変更する。&lt;/p&gt; &lt;pre class='src'&gt;&lt;span style='color: #ff7f24;'&gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;lisp height&lt;br /&gt;&lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;;;;; &lt;/span&gt;&lt;span style='color: #ff7f24;'&gt;climacs:climacs-rv で起動するとデフォルトのフェイスが合わないので。&lt;br /&gt;&lt;/span&gt;(&lt;span style='color: #00ffff;'&gt;in-package&lt;/span&gt; &lt;span style='color: #b0c4de;'&gt;:drei-lisp-syntax&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;(setf&lt;br /&gt; *string-drawing-options* (make-drawing-options &lt;span style='color: #b0c4de;'&gt;:face&lt;/span&gt; (make-face &lt;span style='color: #b0c4de;'&gt;:ink&lt;/span&gt; +light-salmon+))&lt;br /&gt; *comment-drawing-options* (make-drawing-options &lt;span style='color: #b0c4de;'&gt;:face&lt;/span&gt; (make-face &lt;span style='color: #b0c4de;'&gt;:ink&lt;/span&gt; +chocolate1+))&lt;br /&gt; *keyword-drawing-options* (make-drawing-options &lt;span style='color: #b0c4de;'&gt;:face&lt;/span&gt; (make-face &lt;span style='color: #b0c4de;'&gt;:ink&lt;/span&gt; +light-steel-blue+))&lt;br /&gt; *special-variable-drawing-options* (make-drawing-options &lt;span style='color: #b0c4de;'&gt;:face&lt;/span&gt; (make-face &lt;span style='color: #b0c4de;'&gt;:ink&lt;/span&gt; +light-goldenrod+))&lt;br /&gt; *special-operator-drawing-options* (make-drawing-options&lt;br /&gt;                                     &lt;span style='color: #b0c4de;'&gt;:face&lt;/span&gt; (make-face &lt;span style='color: #b0c4de;'&gt;:ink&lt;/span&gt; +cyan1+&lt;br /&gt;                                                      &lt;span style='color: #b0c4de;'&gt;:style&lt;/span&gt; (make-text-style nil &lt;span style='color: #b0c4de;'&gt;:bold&lt;/span&gt; nil))))&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-2490825138675632864?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/iOYrZ_VJhMbmulnnr8cxeDOOWGI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iOYrZ_VJhMbmulnnr8cxeDOOWGI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/iOYrZ_VJhMbmulnnr8cxeDOOWGI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iOYrZ_VJhMbmulnnr8cxeDOOWGI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/BLA4xKjLvK4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/2490825138675632864/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=2490825138675632864" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/2490825138675632864?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/2490825138675632864?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/BLA4xKjLvK4/climacs.html" title="Climacs での色（フェイス）の設定" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>0</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/01/climacs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4ASH49fCp7ImA9Wx9XEkU.&quot;"><id>tag:blogger.com,1999:blog-1096313046657120208.post-4273180805813214047</id><published>2011-01-06T11:29:00.001+09:00</published><updated>2011-01-06T11:29:09.064+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-06T11:29:09.064+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Common Lisp" /><title>simple-date-time のパッチをもらった</title><content type="html">&lt;p&gt;たまたま #lisp に接続したら Axioplase さんから &lt;a href='https://github.com/quek/simple-date-time'&gt;simple-date-time&lt;/a&gt; について質問された。昨日 Axioplase さんから RFC 2822 のフォーマットで出力するパッチのメールをもらった。この件ではいろいろ嬉しい驚きがあった。&lt;/p&gt; &lt;ul&gt; &lt;li&gt;数ヶ月ぶりに #lisp したまさにその時に質問されたこと。&lt;/li&gt; &lt;li&gt;simple-date-time を使っている人がいたこと。&lt;/li&gt; &lt;li&gt;パッチのメールが綺麗な日本語だったこと。&lt;/li&gt; &lt;/ul&gt;&lt;p&gt;Axioplase さんありがとうございました。&lt;/p&gt;&lt;p&gt;simple-date-time は cl-win32ole を作るときに日時クラスが必要になって、でちっあげたもの。はなはだ効率の悪い実装になっている。アルゴリズムとか無視だし。申し訳ないです。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1096313046657120208-4273180805813214047?l=read-eval-print.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qsWV7MfsrRGcDHXsw3AZUc5YUxw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qsWV7MfsrRGcDHXsw3AZUc5YUxw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/qsWV7MfsrRGcDHXsw3AZUc5YUxw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qsWV7MfsrRGcDHXsw3AZUc5YUxw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/rztf/~4/29D1oshJPl4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://read-eval-print.blogspot.com/feeds/4273180805813214047/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1096313046657120208&amp;postID=4273180805813214047" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/4273180805813214047?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1096313046657120208/posts/default/4273180805813214047?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/rztf/~3/29D1oshJPl4/simple-date-time.html" title="simple-date-time のパッチをもらった" /><author><name>Yoshinori Tahara</name><uri>http://www.blogger.com/profile/12438780359950589602</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14367185389986246821" /></author><thr:total>0</thr:total><feedburner:origLink>http://read-eval-print.blogspot.com/2011/01/simple-date-time.html</feedburner:origLink></entry></feed>

