<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6623412995465682794</id><updated>2011-04-22T03:03:54.119+08:00</updated><category term='Arc'/><category term='ffi'/><category term='String'/><category term='Corman Lisp'/><category term='Lispwork'/><category term='Common Lisp'/><category term='SQL'/><category term='Java'/><category term='Allegro Lisp'/><title type='text'>(assert (equal programming 'fun))</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://plummprog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://plummprog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Plumm</name><uri>http://www.blogger.com/profile/01079833530407761100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6623412995465682794.post-6309421166816217970</id><published>2008-01-31T13:42:00.000+08:00</published><updated>2008-01-31T13:43:51.364+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Arc'/><title type='text'>Arc is out</title><content type='html'>Lisp 的一個分支, 由 Paul Graham 製作的 Arc 出了. 詳情請見 http://paulgraham.com/arc0.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6623412995465682794-6309421166816217970?l=plummprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plummprog.blogspot.com/feeds/6309421166816217970/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6623412995465682794&amp;postID=6309421166816217970' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/6309421166816217970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/6309421166816217970'/><link rel='alternate' type='text/html' href='http://plummprog.blogspot.com/2008/01/arc-is-out.html' title='Arc is out'/><author><name>Plumm</name><uri>http://www.blogger.com/profile/01079833530407761100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6623412995465682794.post-886652841285971953</id><published>2008-01-04T09:03:00.000+08:00</published><updated>2008-01-04T09:06:23.763+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='Lispwork'/><title type='text'>LispWorks Personal Edition now supports Mac OS X 10.5 (Leopard).</title><content type='html'>目前最新版的 Lispwork 個人版 ( 也就是免費版 )&lt;br /&gt;  已經支援到 Mac OS X 10.5 (Leopard) 了, 雖然我沒用 Mac,&lt;br /&gt;  但是不少厲害的程式設計師都是用 Mac 的, 可以考慮用用看...&lt;br /&gt;&lt;br /&gt;  而且這個個人版是 10.5.2, 比之前的 Windows 的個人板 10.5.1 還多一級說.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6623412995465682794-886652841285971953?l=plummprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plummprog.blogspot.com/feeds/886652841285971953/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6623412995465682794&amp;postID=886652841285971953' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/886652841285971953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/886652841285971953'/><link rel='alternate' type='text/html' href='http://plummprog.blogspot.com/2008/01/lispworks-personal-edition-now-supports.html' title='LispWorks Personal Edition now supports Mac OS X 10.5 (Leopard).'/><author><name>Plumm</name><uri>http://www.blogger.com/profile/01079833530407761100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6623412995465682794.post-6352591131414784078</id><published>2007-08-30T15:13:00.000+08:00</published><updated>2007-08-30T15:17:29.154+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Allegro Lisp'/><title type='text'>Common Lisp 和 Java 的橋樑(Allegro Lisp)</title><content type='html'>Allegro Lisp 提供了兩個和 Java 之間橋樑的方法, 一個是 JLinker, 這個算是使用 native call 或 socket 方式, 由 Lisp 端呼叫 Java 的函式, 不過, 由於 Lisp 是動態語言, 要呼叫 Java 的程式不免要定義一端 Java 靜態語言的型別等等, 使得在定義宣告和實際使用方式上, 我是覺得有點類似 Lisp ffi&lt;br /&gt;也就是 Lisp 呼叫 C 那樣的宣告的感覺.&lt;br /&gt;&lt;br /&gt;另一個方式是直接將 Lisp Code compile 成 JVM bytecode class,&lt;br /&gt;不過這個方式, 雖然表面上是 Lisp, 但是實際上已經用的是和 Java 類似的語法.&lt;br /&gt;( 這個要 Allegro Lisp 專業版以上才有支援 )&lt;br /&gt;&lt;br /&gt;可以說是兩種方式雖然都能使用到 Java 的 Library, 但是實際上都不算太好用.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6623412995465682794-6352591131414784078?l=plummprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plummprog.blogspot.com/feeds/6352591131414784078/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6623412995465682794&amp;postID=6352591131414784078' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/6352591131414784078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/6352591131414784078'/><link rel='alternate' type='text/html' href='http://plummprog.blogspot.com/2007/08/common-lisp-java-allegro-lisp.html' title='Common Lisp 和 Java 的橋樑(Allegro Lisp)'/><author><name>Plumm</name><uri>http://www.blogger.com/profile/01079833530407761100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6623412995465682794.post-2484047804010920893</id><published>2007-08-24T08:55:00.000+08:00</published><updated>2007-08-24T09:05:33.186+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><title type='text'>*macroexpand-hook*</title><content type='html'>Common Lisp 的巨集, 可以在展開時加入一個 hook,&lt;br /&gt;讓你控制 Common Lisp 的展開的情形.&lt;br /&gt;&lt;br /&gt;像是這樣&lt;pre&gt;&lt;br /&gt;(defun hook (expander form env)&lt;br /&gt;  (format t "Now expanding: ~S~%" form)&lt;br /&gt;  (funcall expander form env))&lt;/pre&gt;&lt;br /&gt;建立一個基本的函式, 讓它於巨集展開之時並顯示&lt;br /&gt;&lt;br /&gt;hook 是一個接收三個引數的函式, 最重要的是中間的引數 form.&lt;br /&gt;另外 hook 函式中必須使用 compiled 函式較為安全,&lt;br /&gt;以免造成巨集重複展開的無窮廻圈.&lt;br /&gt;&lt;br /&gt;任意建一個巨集如下 :&lt;pre&gt;&lt;br /&gt;(defmacro machook (x y) &lt;br /&gt;  `(/ (+ ,x ,y) 2))&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;讓它展開, 這邊使用 let 讓它的 scope 不會擴展到全域&lt;pre&gt;&lt;br /&gt;(let ((*macroexpand-hook* #'hook))&lt;br /&gt;  (macroexpand '(machook 1 2)))&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;就可以出現以下的結果了&lt;pre&gt;&lt;br /&gt;Now expanding: (MACHOOK 1 2)&lt;br /&gt;(/ (+ 1 2) 2)&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6623412995465682794-2484047804010920893?l=plummprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plummprog.blogspot.com/feeds/2484047804010920893/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6623412995465682794&amp;postID=2484047804010920893' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/2484047804010920893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/2484047804010920893'/><link rel='alternate' type='text/html' href='http://plummprog.blogspot.com/2007/08/macroexpand-hook.html' title='*macroexpand-hook*'/><author><name>Plumm</name><uri>http://www.blogger.com/profile/01079833530407761100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6623412995465682794.post-3045055334345011300</id><published>2007-07-09T14:09:00.000+08:00</published><updated>2007-07-09T14:11:45.806+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='Allegro Lisp'/><title type='text'>Allegro Lisp 之 OLE 物件之使用</title><content type='html'>先定義 InternetExplorer 物件&lt;br /&gt;(ole:def-ole-linkage #:msx :application "InternetExplorer")&lt;br /&gt;&lt;br /&gt;建立物件&lt;br /&gt;(setq browser (make-instance 'msx:InternetExplorer))&lt;br /&gt;&lt;br /&gt;連至 OLE Server&lt;br /&gt;(ole:connect-to-server browser :inplace nil)&lt;br /&gt;&lt;br /&gt;設定 OLE 物件屬性, 此例之 Visible 設為 true&lt;br /&gt;(setf (msx:Visible browser) t) &lt;br /&gt;&lt;br /&gt;呼叫 OLE 物件函式, 此例呼叫 Navigate2 函式&lt;br /&gt;(msx:Navigate2 browser "www.franz.com")&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6623412995465682794-3045055334345011300?l=plummprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plummprog.blogspot.com/feeds/3045055334345011300/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6623412995465682794&amp;postID=3045055334345011300' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/3045055334345011300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/3045055334345011300'/><link rel='alternate' type='text/html' href='http://plummprog.blogspot.com/2007/07/allegro-lisp-ole.html' title='Allegro Lisp 之 OLE 物件之使用'/><author><name>Plumm</name><uri>http://www.blogger.com/profile/01079833530407761100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6623412995465682794.post-7032597004466809389</id><published>2007-06-23T13:43:00.000+08:00</published><updated>2007-06-23T13:53:24.654+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='Allegro Lisp'/><title type='text'>談談 Allegro Lisp 的 socket 機制</title><content type='html'>要做到一個 robust 的 socket server,&lt;br /&gt;必須能夠處理 read 及 write 的 blocking 機制,&lt;br /&gt;也就是說, read 和 write 都不能 block 掉整個 thread&lt;br /&gt;基本上用多執行緒也是一個方式, 只是讓 thread 停在那邊,&lt;br /&gt;我覺得不是一個好的 socket 的 server 架構.&lt;br /&gt;&lt;br /&gt;一般來說, read 時停住是比較容易被查覺的, 也比較容易處理,&lt;br /&gt;如 Java 的 setSoTimeout, 當 Timeout 時會丟出 InterruptedIOException,&lt;br /&gt;但是 write-timeout 的話呢? Java 最好還是用 nio 吧,&lt;br /&gt;用 select 這種類似 C 的處理方式較穩 ( 雖然不太漂亮就是了 ).&lt;br /&gt;&lt;br /&gt;不過本文主題是 Allegro Lisp, Allegro Lisp 在處理 read 的方式來說&lt;br /&gt;較穩的是用 listen 先來查看是否可以 read, 再下 read 指令,&lt;br /&gt;可是 write 呢? 沒有, Allegro Lisp 不像 Lispwork 有 write-timeout 的機制&lt;br /&gt;不過還是可以用 system timeout 來處理, 方式如下&lt;br /&gt;(setq s (socket:make-socket :remote-host "127.0.0.1" :remote-port 7035))&lt;br /&gt;&lt;br /&gt;(dotimes (i 10000000)&lt;br /&gt;  (sys:with-timeout (1)&lt;br /&gt;    (write-sequence #(1 2 3 4 5 6 7 8 9 10) s)&lt;br /&gt;    (force-output s))&lt;br /&gt;  (format t "~a~%" i)&lt;br /&gt;  (sleep 0.1))&lt;br /&gt;&lt;br /&gt;註: read 和 write 的不同點&lt;br /&gt;read 是對 socket 讀資料, 如果 socket 沒資料就會 block 在那邊&lt;br /&gt;write 一般就算對方不讀任何資料, 也要等到 buffer 爆 (default 約 33000 byte)&lt;br /&gt;才會 block 在那邊&lt;br /&gt;&lt;br /&gt;一般處理方式主要有:&lt;br /&gt;1. 使用非同步 I/O&lt;br /&gt;2. 在 read/write 前先偵測狀態, 或是使用事件式來處理&lt;br /&gt;3. 使用 timeout 機制&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6623412995465682794-7032597004466809389?l=plummprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plummprog.blogspot.com/feeds/7032597004466809389/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6623412995465682794&amp;postID=7032597004466809389' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/7032597004466809389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/7032597004466809389'/><link rel='alternate' type='text/html' href='http://plummprog.blogspot.com/2007/06/allegro-lisp-socket.html' title='談談 Allegro Lisp 的 socket 機制'/><author><name>Plumm</name><uri>http://www.blogger.com/profile/01079833530407761100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6623412995465682794.post-3757640102031590850</id><published>2007-06-22T08:04:00.000+08:00</published><updated>2007-06-22T08:07:15.373+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='Allegro Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='Lispwork'/><title type='text'>中文字碼轉換 CP950</title><content type='html'>Allegro Lisp 的方式如下 &lt;br /&gt;(excl:octets-to-string (excl:string-to-octets "中文"))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Lispwork 的方式如下 (目前只適用 Lispwork Windows 版, 感謝大陸網友 Binghe 提供)&lt;br /&gt;(ef:decode-external-string (ef:encode-lisp-string "你好" '(win32:code-page :id 950)) '(win32:code-page :id 950))&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6623412995465682794-3757640102031590850?l=plummprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plummprog.blogspot.com/feeds/3757640102031590850/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6623412995465682794&amp;postID=3757640102031590850' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/3757640102031590850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/3757640102031590850'/><link rel='alternate' type='text/html' href='http://plummprog.blogspot.com/2007/06/cp950.html' title='中文字碼轉換 CP950'/><author><name>Plumm</name><uri>http://www.blogger.com/profile/01079833530407761100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6623412995465682794.post-8599982315982474318</id><published>2007-06-21T12:53:00.000+08:00</published><updated>2007-06-22T08:07:38.902+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><title type='text'>dump hex sequence</title><content type='html'>(defun my-code-char (c)&lt;br /&gt;               (if (or (&lt; c 20)&lt;br /&gt;                       (&gt; c 80))&lt;br /&gt;                 #\.&lt;br /&gt;                 (char-code c)))&lt;br /&gt;&lt;br /&gt;(defun dump-hex-sequence (seq)&lt;br /&gt;              (do ((index 0 (1+ index))&lt;br /&gt;                   (length (length seq))&lt;br /&gt;                   (chars  (make-string 16 :initial-element #\space)))&lt;br /&gt;                  ((&gt;= index length)&lt;br /&gt;                     (when (not (= (mod index 16) 0))&lt;br /&gt;                        (dotimes (i (- 16 (mod index 16)))&lt;br /&gt;                          (format t "   "))&lt;br /&gt;                        (format t ":~a~%" chars)))&lt;br /&gt;                (when (= (mod index 16) 0)&lt;br /&gt;                  (format t "~6,'0XH: " index))&lt;br /&gt;                (format t "~2,'0X " (aref seq index))&lt;br /&gt;                (setf (aref chars (mod index 16)) (my-code-char (aref seq index)))&lt;br /&gt;                (when (= (mod index 16) 15)&lt;br /&gt;                  (format t ":~a~%" chars)&lt;br /&gt;                  (fill chars #\space))))&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6623412995465682794-8599982315982474318?l=plummprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plummprog.blogspot.com/feeds/8599982315982474318/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6623412995465682794&amp;postID=8599982315982474318' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/8599982315982474318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/8599982315982474318'/><link rel='alternate' type='text/html' href='http://plummprog.blogspot.com/2007/06/dump-hex-sequence.html' title='dump hex sequence'/><author><name>Plumm</name><uri>http://www.blogger.com/profile/01079833530407761100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6623412995465682794.post-4912386868581648510</id><published>2007-06-12T15:27:00.000+08:00</published><updated>2007-06-22T08:07:57.672+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><title type='text'>Kenny Tilton 的 class 定義 defmodel</title><content type='html'>(defmacro defmd (class superclasses &amp;rest mdspec) &lt;br /&gt;  `(defmodel ,class (,@superclasses model) &lt;br /&gt;     ,@(let (definitargs class-options slots) &lt;br /&gt;         (loop with skip &lt;br /&gt;             for (spec next) on mdspec &lt;br /&gt;             if skip &lt;br /&gt;             do (setf skip nil) &lt;br /&gt;             else do (etypecase spec &lt;br /&gt;                       (cons &lt;br /&gt;                        (cond &lt;br /&gt;                         ((keywordp (car spec)) &lt;br /&gt;                          (assert (find (car spec) '(:documentation &lt;br /&gt;:metaclass))) &lt;br /&gt;                          (push spec class-options)) &lt;br /&gt;                         ((find (cadr spec) '(:initarg :type :ps &lt;br /&gt;:persistable :cell :initform :allocation :reader :writer :accessor &lt;br /&gt;:documentation)) &lt;br /&gt;                          (push (apply 'defmd-canonicalize-slot spec) &lt;br /&gt;slots)) &lt;br /&gt;                         (t ;; shortform (slotname initform &amp;rest &lt;br /&gt;slotdef-key-values) &lt;br /&gt;                          (push (apply 'defmd-canonicalize-slot &lt;br /&gt;                                  (list* (car spec) :initform (cadr &lt;br /&gt;spec) (cddr spec))) slots)))) &lt;br /&gt;                       (keyword &lt;br /&gt;                        (setf definitargs (append definitargs (list spec &lt;br /&gt;next))) &lt;br /&gt;                        (setf skip t)) &lt;br /&gt;                       (symbol (push (list spec :initform nil &lt;br /&gt;                                       :initarg (intern (symbol-name &lt;br /&gt;spec) :keyword) &lt;br /&gt;                                       :accessor spec) slots))) &lt;br /&gt;             finally &lt;br /&gt;               (return (list* (nreverse slots) &lt;br /&gt;                         (delete nil &lt;br /&gt;                           (list* `(:default-initargs ,@definitargs) &lt;br /&gt;                             (nreverse class-options)))))))))&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6623412995465682794-4912386868581648510?l=plummprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plummprog.blogspot.com/feeds/4912386868581648510/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6623412995465682794&amp;postID=4912386868581648510' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/4912386868581648510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/4912386868581648510'/><link rel='alternate' type='text/html' href='http://plummprog.blogspot.com/2007/06/ken-tilton-class-defmodel.html' title='Kenny Tilton 的 class 定義 defmodel'/><author><name>Plumm</name><uri>http://www.blogger.com/profile/01079833530407761100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6623412995465682794.post-644854738655884680</id><published>2007-06-06T17:35:00.001+08:00</published><updated>2007-06-06T17:35:31.512+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='Lispwork'/><title type='text'>Lispwork 的 Thread 程式範例</title><content type='html'>(loop for n below 1000 do &lt;br /&gt;      (mp:process-run-function &lt;br /&gt;       (gensym) ; name &lt;br /&gt;       nil      ; keywords &lt;br /&gt;       #'(lambda (s n) ; function &lt;br /&gt;           (format s "running thread ~D~%" n) &lt;br /&gt;           (sleep 10)) &lt;br /&gt;       *standard-output* n)) ; arguments to function&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6623412995465682794-644854738655884680?l=plummprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plummprog.blogspot.com/feeds/644854738655884680/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6623412995465682794&amp;postID=644854738655884680' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/644854738655884680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/644854738655884680'/><link rel='alternate' type='text/html' href='http://plummprog.blogspot.com/2007/06/lispwork-thread.html' title='Lispwork 的 Thread 程式範例'/><author><name>Plumm</name><uri>http://www.blogger.com/profile/01079833530407761100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6623412995465682794.post-225179396536981738</id><published>2007-05-16T10:32:00.000+08:00</published><updated>2007-05-16T10:34:03.956+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><title type='text'>Common Lisp 用查詢網站</title><content type='html'>&lt;a href="http://lispdoc.com/"&gt;http://lispdoc.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;一般 Common Lisp 的資訊可以從這邊查&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6623412995465682794-225179396536981738?l=plummprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plummprog.blogspot.com/feeds/225179396536981738/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6623412995465682794&amp;postID=225179396536981738' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/225179396536981738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/225179396536981738'/><link rel='alternate' type='text/html' href='http://plummprog.blogspot.com/2007/05/common-lisp.html' title='Common Lisp 用查詢網站'/><author><name>Plumm</name><uri>http://www.blogger.com/profile/01079833530407761100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6623412995465682794.post-8586926903011045105</id><published>2007-05-11T13:24:00.000+08:00</published><updated>2007-05-11T13:46:37.144+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='String'/><title type='text'>String 運算簡介(1)</title><content type='html'>(defun nth-digit (digits i) &lt;br /&gt;  "The i-th element of a character string of digits, as an integer 0 to 9."&lt;br /&gt;  (- (char-code (char digits i)) #.(char-code #\0)))&lt;br /&gt;&lt;br /&gt;這一串是代表什麼意思呢?&lt;br /&gt;其實就是 digits[i]-'0' 的意思.&lt;br /&gt;&lt;br /&gt;char-code 將字元轉成數值&lt;br /&gt;char 取出字串中的字元&lt;br /&gt;#\0 為 '0' 字元&lt;br /&gt;#. 表示 reader 在 read 時就先做 read time evaluation&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6623412995465682794-8586926903011045105?l=plummprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plummprog.blogspot.com/feeds/8586926903011045105/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6623412995465682794&amp;postID=8586926903011045105' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/8586926903011045105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/8586926903011045105'/><link rel='alternate' type='text/html' href='http://plummprog.blogspot.com/2007/05/string-1.html' title='String 運算簡介(1)'/><author><name>Plumm</name><uri>http://www.blogger.com/profile/01079833530407761100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6623412995465682794.post-3885127297840833602</id><published>2007-04-27T12:55:00.000+08:00</published><updated>2007-04-27T13:04:06.046+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>CLSQL 簡介(1) - SELECT</title><content type='html'>Common Lisp 套件中最常用的 SQL 套件就是 CLSQL,&lt;br /&gt;這邊先簡介一下它的用法 ^^&lt;br /&gt;&lt;br /&gt;首先, 先用 asdf 載入 ( asdf 另外擇日介紹 @@ )&lt;br /&gt;(asdf:oos 'asdf:load-op :clsql)&lt;br /&gt;&lt;br /&gt;資料庫的第一步是連線&lt;br /&gt;(clsql:connect '("database" "username" "password") :database-type :oracle)&lt;br /&gt;這邊是連到 database 指定 username/password ( 這邊連線參數依不同資料庫會不同 )&lt;br /&gt;後面指定 database-type, 因為每個 database 會略有不同, 所以還是指定一下較好&lt;br /&gt;&lt;br /&gt;接下來就直接下 query 的 SQL SELECT 了&lt;br /&gt;(clsql:query "SELECT * FROM FTP_CONFIG WHERE PGID = '1_ppbt0w'")&lt;br /&gt;這邊不用特別指定連線是因為我們只有一個資料庫連線, 它會設為 default&lt;br /&gt;使用 query 可以和一般 SQL 一樣的內容&lt;br /&gt;&lt;br /&gt;(clsql:query (format nil "SELECT * FROM FTP_CONFIG WHERE PGID = '~a'" "1_ppbt0w"))&lt;br /&gt;如果要指定參數的話, 使用 format 來設定 ( format 另外擇日介紹 )&lt;br /&gt;其中 ~a 表示一般你沒特別要求就用這個, 算是汎用的表示法, 會抓後面的值&lt;br /&gt;所以後面要給變數值也可以...&lt;br /&gt;&lt;br /&gt;不過這樣用字串好像沒發揮到 Lisp 的特色, 底下有一種類似 Lisp 語法的表示法,&lt;br /&gt;不過要使用之前要先開啟 SQL Reader Macro, 方法如下 :&lt;br /&gt;(clsql:locally-enable-sql-reader-syntax)&lt;br /&gt;&lt;br /&gt;開啟之後就可以使用 [ ] 表示 SQL 中的關鍵字&lt;br /&gt;&lt;br /&gt;(clsql:query [select [*] :from [FTP_CONFIG] :where [= [PGID] "1_ppbt0w"]])&lt;br /&gt;這樣寫就比較接近 Lisp 了...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6623412995465682794-3885127297840833602?l=plummprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plummprog.blogspot.com/feeds/3885127297840833602/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6623412995465682794&amp;postID=3885127297840833602' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/3885127297840833602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/3885127297840833602'/><link rel='alternate' type='text/html' href='http://plummprog.blogspot.com/2007/04/clsql-1-select.html' title='CLSQL 簡介(1) - SELECT'/><author><name>Plumm</name><uri>http://www.blogger.com/profile/01079833530407761100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6623412995465682794.post-1913208843839768522</id><published>2007-04-24T10:14:00.000+08:00</published><updated>2007-04-27T12:55:01.256+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ffi'/><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='Lispwork'/><title type='text'>Lispwork FLI 簡介</title><content type='html'>本日要介紹的是 Common Lisp 的 FFI(Foreign Function Interface)的使用.&lt;br /&gt;FFI 是 Common Lisp 和 C 程式溝通的介面, 雖然 Common Lisp 中有較泛用的 UFFI, CFFI 等等.&lt;br /&gt;不過那些據我測試都比較難用, 因此這邊先來介紹 Lispwork 專屬的 FLI(Foriegn Library Interface)&lt;br /&gt;&lt;br /&gt;這裡的範例主要是使用 FindWindow 找出某個視窗, 並用 SetWindowText 修改其 Title&lt;br /&gt;&lt;br /&gt;; 設定 Type : HWND&lt;br /&gt;(fli:define-c-typedef fli-hwnd&lt;br /&gt;  (:unsigned :long))&lt;br /&gt;&lt;br /&gt;這邊在 Lispwork 中已經是內建的 Package 了( 自動載入 )&lt;br /&gt;所以不用下什麼 load require 或是 asdf-load 之類的載入指令&lt;br /&gt;一開始最重要的是宣告 HWND 這個型態...&lt;br /&gt;在 windows.h 中我們得知 HWND 是 unsigned long&lt;br /&gt;所以就比照它的宣告一下 fli-hwnd 是 unsigned long&lt;br /&gt;&lt;br /&gt;; 設定 Find Window&lt;br /&gt;(fli:define-foreign-function (find-window "FindWindowW")&lt;br /&gt;  ((lpstring1 (:reference-pass :ef-wc-string :allow-null t))&lt;br /&gt;   (lpstring2 (:reference-pass :ef-wc-string :allow-null t))) &lt;br /&gt;  :result-type fli-hwnd)&lt;br /&gt;&lt;br /&gt;定義 Function, 其實, 如果是 CFFI 的話,&lt;br /&gt;還多一個步驟是, 宣告使用的 library user32.dll, 並載入 user32.dll&lt;br /&gt;不過 Lispwork 的 FLI 覺得這個太常用了, 已經幫你載入了,&lt;br /&gt;所以不用特別宣告&lt;br /&gt;&lt;br /&gt;這裡定義 find-window 為 "FindWindowW" (後面的 W 代表是 Unicode 版)&lt;br /&gt;參數給兩個, 為了省麻煩我用 lpstring1 及 lpstring2 代替&lt;br /&gt;其實可以用真正的意義啦, 一個是 class 名稱, 一個是 title 名稱&lt;br /&gt;後面的參數意義如下:&lt;br /&gt;:reference-pass 表示這是 constant &lt;br /&gt;:ef-wc-string 表示這是 WCHAR 的字串&lt;br /&gt;所以合在一起就是 LPCWSTR 的意思&lt;br /&gt;:allow-null t 表示傳入 Common Lisp 的 nil 時會自動轉成 NULL&lt;br /&gt;傳回值為 fli-hwnd&lt;br /&gt;&lt;br /&gt;; 設定 Set Window Text&lt;br /&gt;(fli:define-foreign-function (set-window-text "SetWindowTextW")&lt;br /&gt;  ((hwnd fli-hwnd)&lt;br /&gt;   (lpstring1 (:reference-pass :ef-wc-string :allow-null t)))&lt;br /&gt;  :result-type :boolean&lt;br /&gt;  :documentation "Sets the text of the window titlebar.")&lt;br /&gt;&lt;br /&gt;這個和上面的沒什咩不同, 不過多了一個 :documentation 表示函式註解&lt;br /&gt;在 Common Lisp 中其實函式註解都可以查得到的&lt;br /&gt;&lt;br /&gt;接下來就可以試試&lt;br /&gt;(set-window-text (find-window nil 字串) 字串)&lt;br /&gt;看看所指定的視窗的 Title 是否有改變&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6623412995465682794-1913208843839768522?l=plummprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plummprog.blogspot.com/feeds/1913208843839768522/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6623412995465682794&amp;postID=1913208843839768522' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/1913208843839768522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/1913208843839768522'/><link rel='alternate' type='text/html' href='http://plummprog.blogspot.com/2007/04/lispwork-fli.html' title='Lispwork FLI 簡介'/><author><name>Plumm</name><uri>http://www.blogger.com/profile/01079833530407761100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6623412995465682794.post-5414197600491430682</id><published>2007-04-24T09:01:00.000+08:00</published><updated>2007-04-24T09:03:58.104+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='Lispwork'/><title type='text'>Lispworks 5.0 特價中</title><content type='html'>Lispworks 到四月底截止, 原本 $1,500 的 5.0 專業版加上一年維護, 現在只要 $1,200.&lt;br /&gt;不過 $1,200 還是很貴就是了.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6623412995465682794-5414197600491430682?l=plummprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plummprog.blogspot.com/feeds/5414197600491430682/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6623412995465682794&amp;postID=5414197600491430682' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/5414197600491430682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/5414197600491430682'/><link rel='alternate' type='text/html' href='http://plummprog.blogspot.com/2007/04/lispworks-50.html' title='Lispworks 5.0 特價中'/><author><name>Plumm</name><uri>http://www.blogger.com/profile/01079833530407761100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6623412995465682794.post-943044204618213497</id><published>2007-02-07T11:48:00.000+08:00</published><updated>2007-02-07T11:50:30.188+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><title type='text'>IBM 最近的文章 The Beauty of Lisp</title><content type='html'>&lt;a href="http://www-128.ibm.com/developerworks/java/library/j-cb02067.html"&gt;http://www-128.ibm.com/developerworks/java/library/j-cb02067.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;雖然只是很淺顯的介紹, 不過對於完全沒看過 Lisp 的人可以看一看.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6623412995465682794-943044204618213497?l=plummprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plummprog.blogspot.com/feeds/943044204618213497/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6623412995465682794&amp;postID=943044204618213497' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/943044204618213497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/943044204618213497'/><link rel='alternate' type='text/html' href='http://plummprog.blogspot.com/2007/02/ibm-beauty-of-lisp.html' title='IBM 最近的文章 The Beauty of Lisp'/><author><name>Plumm</name><uri>http://www.blogger.com/profile/01079833530407761100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6623412995465682794.post-4944876138177686483</id><published>2007-02-01T14:43:00.000+08:00</published><updated>2007-02-01T16:54:31.764+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><title type='text'>initform-0</title><content type='html'>&lt;pre&gt;&lt;br /&gt;(defun initform-0 (&amp;rest rest) &lt;br /&gt;   (loop for item in rest collect &lt;br /&gt;      `(,item :initform 0)))&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;以上定義是因為 defclass 時如果要定義一堆欄位都是初始值是 0 的,&lt;br /&gt;將其集中起來, 減少重複.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(let ((argument (initform-0 'x 'y 'w 'h 'rowgap 'colgap &lt;br /&gt;                   'distb 'font 'ychar 'x-magr 'y-magr))) &lt;br /&gt;  `(defclass-simple DCSLableAndBlock () &lt;br /&gt;     ((style :initform "00") &lt;br /&gt;      (text  :initform "") &lt;br /&gt;      ,@argument)))&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;以上是使用時的範例, 不過實際使用是要加上 eval 或 eval-when 等等&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6623412995465682794-4944876138177686483?l=plummprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plummprog.blogspot.com/feeds/4944876138177686483/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6623412995465682794&amp;postID=4944876138177686483' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/4944876138177686483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/4944876138177686483'/><link rel='alternate' type='text/html' href='http://plummprog.blogspot.com/2007/02/initform-0.html' title='initform-0'/><author><name>Plumm</name><uri>http://www.blogger.com/profile/01079833530407761100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6623412995465682794.post-8207830906474153321</id><published>2007-02-01T14:39:00.000+08:00</published><updated>2007-02-01T14:45:39.027+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><title type='text'>defclass-simple</title><content type='html'>&lt;pre&gt;&lt;br /&gt;(defmacro defclass-simple (class parent-class definition) &lt;br /&gt;  `(defclass ,class ,parent-class &lt;br /&gt;      (loop for item in definition collect &lt;br /&gt;         (let ((name (car item))) &lt;br /&gt;             (append item `(:accessor ,name :initarg ,(intern (symbol- &lt;br /&gt;name name) :keyword)))))))&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;簡化 defclass 時, 各欄位的 accessor 及 initarg 直接和名稱相同.&lt;br /&gt;( 這個版本並不相容於所有的 defclass, 但是它算是簡便的作法 )&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6623412995465682794-8207830906474153321?l=plummprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plummprog.blogspot.com/feeds/8207830906474153321/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6623412995465682794&amp;postID=8207830906474153321' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/8207830906474153321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/8207830906474153321'/><link rel='alternate' type='text/html' href='http://plummprog.blogspot.com/2007/02/defclass-simple.html' title='defclass-simple'/><author><name>Plumm</name><uri>http://www.blogger.com/profile/01079833530407761100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6623412995465682794.post-2002131365375809227</id><published>2007-01-17T09:30:00.000+08:00</published><updated>2007-01-17T09:33:15.989+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='Corman Lisp'/><title type='text'>Corman Lisp 3.0 Update 2 推出</title><content type='html'>&lt;a href="http://www.cormanlisp.com"&gt;Corman Lisp&lt;/a&gt; 3.0 Update 2 出了&lt;br /&gt;可以下指令 (auto-update) 來下載 Update 2&lt;br /&gt;&lt;br /&gt;Update 2 還是沒修正 Socket 的問題就是了 @@&lt;br /&gt;&lt;br /&gt;另外, Roger Corman 的更新及回應速度感覺還是蠻慢的,&lt;br /&gt;以月來計算的 @_@&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6623412995465682794-2002131365375809227?l=plummprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plummprog.blogspot.com/feeds/2002131365375809227/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6623412995465682794&amp;postID=2002131365375809227' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/2002131365375809227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/2002131365375809227'/><link rel='alternate' type='text/html' href='http://plummprog.blogspot.com/2007/01/corman-lisp-30-update-2.html' title='Corman Lisp 3.0 Update 2 推出'/><author><name>Plumm</name><uri>http://www.blogger.com/profile/01079833530407761100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6623412995465682794.post-1209338694274422436</id><published>2007-01-15T11:54:00.001+08:00</published><updated>2007-01-17T09:15:41.134+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><title type='text'></title><content type='html'>目前 Common Lisp 的 Implementation 及問題(Win32 Only)&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;商用版&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Allegro Common Lisp : 個人版免費, 但是有 Heap Size 限制, 程式介面很難用&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Lispwork : 個人版免費, 但是有 Heap Size, 使用時間以及無法 deliver 的限制&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Corman Lisp : 個人版免費, 但是程式和 &lt;span class="caps"&gt;ANSI &lt;/span&gt;相容性低, bug 多, 它有公開原始碼, 可以自己幫它修 bug 就是了&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;免費版&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;span class="caps"&gt;CLISP &lt;/span&gt;: 不支援多執行緒, 且 compile 成 bytecode 速度較慢.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span class="caps"&gt;SBCL &lt;/span&gt;: Windows 版本不支援多執行緒, 且目前沒有支援 Big-5 編碼.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6623412995465682794-1209338694274422436?l=plummprog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plummprog.blogspot.com/feeds/1209338694274422436/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6623412995465682794&amp;postID=1209338694274422436' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/1209338694274422436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6623412995465682794/posts/default/1209338694274422436'/><link rel='alternate' type='text/html' href='http://plummprog.blogspot.com/2007/01/common-lisp-implementation-win32-only.html' title=''/><author><name>Plumm</name><uri>http://www.blogger.com/profile/01079833530407761100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
