#:g1: com.informatimago.common-lisp.lisp.ibclの紹介

Posted 2014-11-24 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の329日目です。

com.informatimago.common-lisp.lisp.ibclとはなにか

 com.informatimago.common-lisp.lisp.ibclは、Pascal Bourguignon氏作のイメージ指向でCommon Lispを使うためのユーティリティです。

パッケージ情報

パッケージ名com.informatimago.common-lisp.lisp.ibcl
Quicklisp

インストール方法

(ql:quickload :com.informatimago.common-lisp.lisp.ibcl)

試してみる

 ibclとはImage based Common Lispの略とのことで、Common LispをSmalltalkのようにイメージ指向で使うことを支援する環境になります。
どんなユーティリティがあるかというと、exportされているのは、

位ですが、clパッケージに対応するibclと、cl-userに対するibcl-userは定義時のソースコードを記録するようになっています。

(cl:in-package :ibcl-user)

(defpackage :latumofis (:use :ibcl))

(cl:in-package :latumofis)

(defun lomilwa (x) (montino x)) ;==> (PROGN (SETF (SOURCE 'LOMILWA ':FUNCTION) '(DEFUN LOMILWA (X) (MONTINO X))) (CL:DEFUN LOMILWA (X) (MONTINO X)))

(defun montino (x) x)

(source 'lomilwa :function) ;=> (DEFUN LOMILWA ; (X) ; (MONTINO X)) ; #<PACKAGE "MAKANITO">

(source 'montino :function) ;=> (DEFUN MONTINO ; (X) ; X) ; #<PACKAGE "MAKANITO">

(list-sources) ; (DEFINE-CONDITION IBCL::SIMPLE-PACKAGE-ERROR (PACKAGE-ERROR SIMPLE-ERROR) ; NIL) ; #<PACKAGE "COM.INFORMATIMAGO.COMMON-LISP.LISP.IMAGE-BASED-COMMON-LISP">) ; ((IBCL::NORMALIZE-PACKAGE-DESIGNATOR :FUNCTION) ; (DEFUN IBCL::NORMALIZE-PACKAGE-DESIGNATOR ; (PACKAGE) ; (LET ((IBCL::PACK (CL:FIND-PACKAGE PACKAGE))) ; (IF IBCL::PACK ; (PACKAGE-NAME IBCL::PACK) ; (ERROR 'IBCL::SIMPLE-PACKAGE-ERROR :PACKAGE PACKAGE :FORMAT-CONTROL ; ...

(list-packages-with-sources) ;=> (#<PACKAGE "LATUMOFIS"> ; #<PACKAGE "COM.INFORMATIMAGO.COMMON-LISP.LISP.IMAGE-BASED-COMMON-LISP-USER"> ; #<PACKAGE "COM.INFORMATIMAGO.COMMON-LISP.LISP.IMAGE-BASED-COMMON-LISP"> ; #<PACKAGE "COM.INFORMATIMAGO.COMMON-LISP.LISP.CL-SAVING-DEFINES"> ; #<PACKAGE "COM.INFORMATIMAGO.COMMON-LISP.LISP.SOURCE"> #<PACKAGE "SWANK-REPL"> ; ...

という感じで定義とソースを管理でき、save-sourcesでファイルに書き出せます。

(save-sources "/tmp/latumofis.lisp" :line-spacing 2)
;;;; -*- mode:lisp -*-
;;;; Generated from sources saved by COM.INFORMATIMAGO.COMMON-LISP.LISP.SOURCE

(in-package "LATUMOFIS")

(defun lomilwa (x) (montino x))

(defun montino (x) x)

;;;; THE END ;;;;

 以上ように定義のソースコードはイメージの中に残るので、イメージをダンプすればソースを編集して再定義することも可能です。

編集にはソース全体をファイルに書き出しても良いでしょうし、定義をエディタに渡してどうにかすることもできそうです。

まとめ

 今回は、com.informatimago.common-lisp.lisp.ibclを紹介してみました。
Interlisp-DはSmalltalkと同じマシンで稼動し、同じようにイメージ指向でしたが、プロジェクトを書き出すmake-packageというユーティリティがあり、依存関係等を管理しつつ書き出したい定義を選択してファイルにまとめてくれるというものでした。
com.informatimago.common-lisp.lisp.ibclを使えば、make-packageのようなことが可能になりますね。

comments powered by Disqus