CMU AIレポジトリ探検 (2) Source Compare — #:g1

Posted 2011-03-20 01:59:00 GMT

かれこれ20年程前のCMUでは、CLでポータブルに利用できる開発ツールがないことをどうにかしようというLisp-Utilitiesというプロジェクトがあったようです。
Symbolicsや、XeroxのLISPマシンでは当時でも色々揃っており、開発ツール自体がなかった訳ではないので処理系を跨いでポータブルであることが主眼だった様子。
Mark Kantrowitz氏が中心人物のようで、
CMU-CS-91-143
Portable Utilities for Common Lisp: User Guide & Implementation Notes
Mark Kantrowitz
May 1991
74 pages
というレポートに6つのツールの内容が纏められています(自分もどこから拾ってきたのか分かりませんが、現在はダウンロードできるリンクがみつけられませんでした)
上記のレポートによれば、このプロジェクトの成果物は一式でダウンロードできるようですが、現在まとまってダウンロードできるところは消滅している様子。
しかし探してみるとCMUのAIリポジトリでそれぞれのツールが単体で配布されていることをみつけました。
今回は、その内の一つであるSource Compareについてです。
- Source Compare (SC): A 'diff' program for Common Lisp
内容は、このリンクから分かると思いますが、所謂diffです。

(sc:source-compare "cadr78/lispm2/let.lisp.1" "cadr99/sys2/let.lisp.1")
のようにすると、
===========================================================================
Source compare of cadr78/lispm2/let.lisp.1 with cadr99/sys2/let.lisp.1
===========================================================================
14c14
**** File cadr78/lispm2/let.lisp.1, After "(remprop 'let* 'source-file-name)"
< (defmacro let (pairs . body)
<        (do ((pairs pairs (cdr pairs))
---
**** File cadr99/sys2/let.lisp.1, After "(remprop 'let* 'source-file-name)"
> (defmacro let (pairs &body body)
>        (do ((pairs pairs (cdr pairs))
===========================================================================
115c115
**** File cadr78/lispm2/let.lisp.1, After "(defun let-macro-hair (pattern code cell)"
< (defmacro let* (pairs . body)
<        (do ((a (reverse pairs) (cdr a))
---
**** File cadr99/sys2/let.lisp.1, After "(defun let-macro-hair (pattern code cell)"
> (defmacro let* (pairs &body body)
>        (do ((a (reverse pairs) (cdr a))
===========================================================================
Done.
のように結果が出力されます。
LISPのコメントを無視できたりしてLISPフレンドリーなのが長所でしょうか。(オプションで挙動を変更できます)
ちなみに、同じファイルをdiff -uすると、
diff -u cadr78/lispm2/let.lisp.1 cadr99/sys2/let.lisp.1
--- cadr/lispm2/let.lisp.1       2009-01-03 09:28:22.000000000 +0900
+++ cadr99/sys2/let.lisp.1       2009-01-03 14:37:00.000000000 +0900
@@ -1,4 +1,4 @@
-;;;-*- Mode: Lisp; Package: System-Internals -*-
+;;;-*- Mode:LISP; Package:SYSTEM-INTERNALS; Base:8 -*-

;; Destructuring DEFUN must be added to this at some point.

@@ -11,7 +11,7 @@ (remprop 'let 'source-file-name) (remprop 'let* 'source-file-name)

-(defmacro let (pairs . body) +(defmacro let (pairs &body body) (do ((pairs pairs (cdr pairs)) (vars nil) (let-macro-vals nil) @@ -112,7 +112,7 @@ (let-macro-get-last-var (car pattern)) (let-macro-get-last-var (cdr pattern))))))

-(defmacro let* (pairs . body) +(defmacro let* (pairs &body body) (do ((a (reverse pairs) (cdr a)) (b body `((let (,(car a)) . ,b)))) ((null a)

こんな感じになります。

紹介ついでに、ASDF対応にして、githubにアップしてみました。
適切な場所に、
git clone git://github.com/g000001/source-compare.git
すれば、
;; quicklisp
(ql:quickload :source-compare)
できると思います。

comments powered by Disqus