| 公式ページ | http://www.clisp.org/ |
| 最新バージョン | 2.46 |
英語原文: http://clisp.sourceforge.net/summary.html
Common Lisp は高水準、汎用目的、オブジェクト指向、動的、関数型といった 特徴を備えたプログラミング言語です。
CLISP はドイツの Karlsruhe 大学の Bruno Haible、Munich 大学の Michael Stoll らによって開発された Common Lisp の実装です。ANSI Common Lisp に 規定された標準に加えて、多くの拡張を備えた Lisp です。
CLISP はインタプリタとコンパイラ、デバッガ、CLOS、MOP、FFI、国際化メッ セージ、正規表現、ソケットインターフェース、ここに列挙した以上のものを 含んでいます。CLX、Garnet や CLUE/CLIO を通じて X11 インターフェースが 利用可能ですし、コマンドラインの行編集機能が readline ライブラリによっ て提供されています。また、CLISP は Maxima や ACL2 といったCommon Lisp パッケージを動作させることができます。
CLISP はほとんどの GNU や UNIX ライクなシステム(Linux, FreeBSD, NetBSD, OpenBSD, Solaris, Tru64, HP-UX, BeOS, NeXTstep, IRIX, AIX …)、 そのほかのシステム(Windows NT/2000/XP, Windows 95/98/ME)で動作します。 最小限必要なメモリは 4MB です。
CLISP は GNU GPL ライセンスの元で配布されるフリーフソフトウェアです。プ ロプライエタリな商用ソフトウェアをCLISP と共に配布することも可能です。 CLISP 配布物のなかの COPYRIGHT ファイルを御覧ください。
ユーザーインターフェースは英語、ドイツ語、フランス語、スペイン語、オラ ンダ語、ロシア語、デンマーク語が提供されており、実行時に変更することが できます。
英語原文 http://clisp.sourceforge.net/propaganda.html
Common Lisp は
Common Lisp プログラム は
我々の Common Lisp 実装 CLISP は
Common Lisp は以下のものを提供します
我々の Common Lisp 実装 CLISP は以下のものを提供します
CLISP は Unicode 3.2 を完全にサポートしています。xterm で動作している日本語で書かれた Lisp ファイルを示します。
.. image:: ../files/fibjap-xterm.gif
ここに CLISP の new-clx モジュール(+ xshape 拡張)のデモがあります。(訳注:画像は原文参照)
.. image:: ../files/new-clx-sokoban.gif
CLISP は CLOS、入出力、リスト処理、整数演算(CLISP の多倍長整数はほかの Common Lisp 実装の大半よりパフォーマンスが良いです) ほとんどの分野で他 の ANSI CL 実装と同じくらいの速度です。もっとも CLISP が苦手とする分野 は浮動小数点演算の領域です。目立つほどひどく性能が 悪いという点はありま せんし、 Java, Perl, TCL, Scheme インタプリタより良いパフォーマンスです が, CLISP は他のオープンソースな Common Lisp 実装 CMUCL (これは C や FORTRAN と同等程度の性能です)よりは遅いです。もしあなたが数値計算を多 用するならば、おそらく CMUCL を選んだほうが良いでしょう。それ以外では CLISP は賢い選択です。
CLISP の新機能 (2.39)
METHOD-COMBINATION キーワードで指定されたものが適用されます.
このバージョンから win32aux.d の DoInterruptible が `改良`_ されました. 今迄割り込み可能な I/O 毎に CreateThread でスレッドを生成するという聞く からに遅いコードから,イベントを使うコード(CreateEvent を試してだめだっ たら CreateThread へ…となりました)になりました.ちなみに作者の Bruno 氏も Windows で動けばいいやと考えて Thread API の `勉強がてら適当に作った`_ と ML で認めています.パッチ作者の Arseny Slobodyuk に感謝!!
効果は I/O 回数に比例するので Bufferd I/O ではあまり影響がないようです が,非 Bufferd I/O (:bufferd を nil) だと大幅に性能が向上しているようです.
.. `改良`: http://clisp.cvs.sourceforge.net/clisp/clisp/src/win32aux.d?r1=1.48&r2=1.49 .. `勉強がてら適当に作った`: http://sourceforge.net/mailarchive/forum.php?thread_id=10297501&forum_id=6768
CLISP for Win32 日本語の使い方
コンソールから使うと制限が多いので,Emacs と SLIME を組み合わせて使います. Emacs は Takashi Hiromatsu さんの NTEmacs のバイナリ を使うと便利です.
clisp-2.46-full.zip を任意の場所に展開し,clisp-directory のパスを調 整して,御自分の .emacs の中に内容をすべてコピーしてください.
;;; -*- mode: emacs-lisp coding: shift_jis -*- ;;; ;;; CLISP & SLIME package ;;; ;;; 1. clisp-directory をインストールパスに合わせて設定する ;;; 2. M-x clisp-start ;;; 3. M-x slime-connect ;;; ;;; Tips: HyperSpec をダウンロードしてパスを設定しておくと便利です ;;; (setq clisp-directory "/home/onjo/lisp/clisp-2.46-full") ;;; ここを書き換えてください!! (setq slime-directory (concat clisp-directory "/slime")) (pushnew slime-directory load-path) ;; 以下省略
そして,M-x eval-buffer で評価するか,emacs を再起動するかして .emacs の内容を有効にした後,
M-x clisp-start M-x slime-connect
の順でタイプすることで SLIME を使い始める事ができます.Emacs と組み合わ せればフルセットの Lisp 開発環境です!! Happy Hacking!!
まだ何のサンプルもありませんが,使用例やサンプルについては今後,徐々に 増していけたら良いなーと思ってます.
さらに Common Lisp Hyper Spec ( 最新版 ) を ~/doc/HyperSpec に置いておくと `C-c H` で Common Lisp の関数/変数のドキュメントが参照できます.
#!/home/onjo/local/bin/clisp -K full -Emisc 1:1
(write-line ";;; Loading Libraries ...")
(eval-when (:load :execute)
(setf (getenv "LANG") "C")
;;(compile-file "~/lisp/site/asdf/asdf")
;;(load "~/lisp/site/asdf/asdf")
(compile-file "~/lisp/build/sbcl/contrib/asdf/asdf")
(load "~/lisp/build/sbcl/contrib/asdf/asdf"))
(pushnew
(merge-pathnames "lisp/asd/" (user-homedir-pathname))
asdf::*central-registry*)
(asdf:oos 'asdf:load-op :cl-fad)
(asdf:oos 'asdf:load-op :cl-interpol)
(asdf:oos 'asdf:load-op :cl-ppcre)
(asdf:oos 'asdf:load-op :cl-who)
(asdf:oos 'asdf:load-op :html-template)
#-clisp (asdf:oos 'asdf:load-op :hunchentoot)
(asdf:oos 'asdf:load-op :drakma)
(asdf:oos 'asdf:load-op :unification)
(asdf:oos 'asdf:load-op :cl-dot)
#-sbcl (asdf:oos 'asdf:load-op :md5)
(asdf:oos 'asdf:load-op :xmls)
(asdf:oos 'asdf:load-op :s-xml)
#+sbcl (asdf:oos 'asdf:load-op :s-xml-rpc)
(asdf:oos 'asdf:load-op :cffi)
(asdf:oos 'asdf:load-op :cffi-uffi-compat)
(asdf:oos 'asdf:load-op :cl-gd)
(asdf:oos 'asdf:load-op :yacc)
(asdf:oos 'asdf:load-op :kmrcl)
(asdf:oos 'asdf:load-op :cl-plus)
(asdf:oos 'asdf:load-op :cl-utilities)
(asdf:oos 'asdf:load-op :parenscript)
(asdf:oos 'asdf:load-op :cl-json)
(asdf:oos 'asdf:load-op :alexandria)
(asdf:oos 'asdf:load-op :arnesi)
#-clisp
(asdf:oos 'asdf:load-op :fiveam)
(asdf:oos 'asdf:load-op :cells)
(asdf:oos 'asdf:load-op :skippy)
(asdf:oos 'asdf:load-op :screamer)
(asdf:oos 'asdf:load-op :iterate)
(asdf:oos 'asdf:load-op :log4cl)
(asdf:oos 'asdf:load-op :series)
(asdf:oos 'asdf:load-op :ironclad)
(asdf:oos 'asdf:load-op :swank)
#-clisp
(asdf:oos 'asdf:load-op :pg)
;(asdf:oos 'asdf:load-op :clsql)
;(asdf:oos 'asdf:load-op :clsql-uffi)
;(clsql-sys::push-library-path #p"/usr/lib/")
;(asdf:oos 'asdf:load-op :clsql-sqlite3)
;(cffi:load-foreign-library "libsqlite3.so")
;(setf cffi:*foreign-library-directories* '(#P"/home/onjo/lisp/lib/base/clsql-3.8.1/uffi/"))
;(cffi:load-foreign-library "clsql_uffi.so")
;;(asdf:oos 'asdf:load-op :uffi)
(asdf:oos 'asdf:load-op :curl)
(asdf:oos 'asdf:load-op :puri)
(asdf:oos 'asdf:load-op :acl-compat)
(asdf:oos 'asdf:load-op :htmlgen)
#-clisp
(asdf:oos 'asdf:load-op :aserve)
#-clisp
(asdf:oos 'asdf:load-op :webactions)
#+sbcl
(asdf:oos 'asdf:load-op :hunchentoot)
(asdf:oos 'asdf:load-op :lw-compat)
(asdf:oos 'asdf:load-op :closer-mop)
(asdf:oos 'asdf:load-op :contextl)
(asdf:oos 'asdf:load-op :cldoc)
(asdf:oos 'asdf:load-op :html-encode)
;; (asdf:oos 'asdf:load-op :colorize)
(asdf:oos 'asdf:load-op :runes)
(asdf:oos 'asdf:load-op :cxml)
;; #+clisp (asdf:oos 'asdf:load-op :clisp-sqlite)
(asdf:oos 'asdf:load-op :rt)
#-clisp
;(asdf:oos 'asdf:load-op :bordeaux-threads)
#-clisp
;(asdf:oos 'asdf:load-op :timer)
#-clisp
;(asdf:oos 'asdf:load-op :cl-muproc)
(asdf:oos 'asdf:load-op :pygen)
(asdf:oos 'asdf:load-op :packer)
(asdf:oos 'asdf:load-op :trivial-sockets)
(asdf:oos 'asdf:load-op :trivial-gray-streams)
(asdf:oos 'asdf:load-op :flexi-streams)
(asdf:oos 'asdf:load-op :iso8601-date)
(asdf:oos 'asdf:load-op :local-time)
(asdf:oos 'asdf:load-op :cl-store)
(asdf:oos 'asdf:load-op :cl-prevalence)
;; (load (merge-pathnames "lisp/unstable/lisa/install.lisp" (user-homedir-pathname)))
(asdf:oos 'asdf:load-op :moptilities)
(asdf:oos 'asdf:load-op :asdf-system-connections)
(asdf:oos 'asdf:load-op :cl-containers)
(asdf:oos 'asdf:load-op :metatilities-base)
(asdf:oos 'asdf:load-op :metatilities)
(asdf:oos 'asdf:load-op :metabang-dynamic-classes)
(asdf:oos 'asdf:load-op :metabang-bind)
(asdf:oos 'asdf:load-op :defsystem-compatibility)
(asdf:oos 'asdf:load-op :cl-mathstats)
#-clisp
(asdf:oos 'asdf:load-op :cl-variates)
(asdf:oos 'asdf:load-op :cl-markdown)
;(without-package-lock (clos)
; (load "~/lisp/lib/common/lisa/install.lisp"))
;(without-package-lock (clos)
; (load "~/lisp/lib/common/lisa/install-clisp.lisp"))
(asdf:oos 'asdf:load-op :lisa)
(load (merge-pathnames "lisp/lib/common/XML/Load-XMLisp.lisp" (user-homedir-pathname)))
(in-package :cl-user)
;;; clocc
(load "/home/onjo/lisp/lib/common/clocc/clocc")
(compile-file (translate-logical-pathname "clocc:src;defsystem;defsystem"))
(load (translate-logical-pathname "clocc:src;defsystem;defsystem"))
;; * compile some systems
(dolist (l '("clocc:src;port;" "clocc:src;cllib;" "clocc:src;ext;queues;"
"clocc:src;port;configuration;" "clocc:src;port;environment;"
"clocc:src;ext;union-find;" "clocc:src;tools;metering;"
#+nil"clocc:src;f2cl;" #+nil"clocc:src;f2cl;packages;"))
(mk:add-registry-location (translate-logical-pathname l)))
(mk:oos "port" :compile)
;;(mk:oos "cllib" :compile)
;;(mk:oos "metering" :compile)
(mk:oos "port" :load)
;;(mk:oos "cllib" :load)
#+clisp
(gc)
#+sbcl
(gc :full t)
(load "../lib/unstable/maxima/src/maxima.system")
(mk:compile-system :maxima)
(mk:load-system :maxima)
(write-line ";;; Dump image ...")
#+clisp
(loop repeat 100 do (gc))
(saveinitmem "lispinit" :init-function #'(lambda ()
(cffi:load-foreign-library "libcurl.so")
(cffi:load-foreign-library "/home/onjo/lisp/lib/unstable/cl-curl/clcurl.so")))
(when (probe-file "clisp.mem")
(delete-file "clisp.mem"))
(rename-file "lispinit.mem" "clisp.mem")
(write-line ";;; Setup ShellScript ...")
(with-open-file (s "~/bin/clisp" :direction :output :if-exists :supersede)
(write-line "#!/bin/sh" s)
;(format s "~A -modern -K full -M ~A $@"
(format s "~A -K full -M ~A $@"
(namestring #p"~/local/bin/clisp")
(namestring #p"~/lisp/build/clisp.mem")))
ちょっと長いので CLISP拡張モジュールHOWTO へ分離しました。
エンコーディング (encoding) はストリーム (STREAM) を経由した入出力の間 の文字列 (CHARACTERs) とバイト列の対応関係です.
EXT:ENCODING は次ような要素から構成されるオブジェクトです.
文字セット (character set)
これは表現可能な文字と,I/O チャネルを通して渡される文字 (CHARACTER) の集合です.これに従って文字はバイト列に変換されます. つまり,文字列と (VECTOR (UNSIGNED-BYTE 8)) の対応や,文字ストリー ムとバイトストリームとの対応における「文字と (UNSIGNED-BYTE 8) の対 応」の集合です.このコンテキストでは,例えば CHARSET:UTF-8 と CHARSET:UCS-4 は同じ文字集合を表現していますが,異なるエンコーディ ングであるという事になります.
行終端モード (line terminator mode)
これは,改行文字の表現方法を規定します.
EXT:ENCODING は型でもあります.それは,文字集合内で符号化可能な文字の集 合を表現します.このコンテキストでは,文字列からバイト列への変換方法は 無視されます.また,行終端モードも同様に無視されます.TYPEP や SUBTYPEP はエンコーディング型にたいして使用可能です
(SUBTYPEP CHARSET:UTF-8 CHARSET:UTF-16) ? T ; ? T (SUBTYPEP CHARSET:UTF-16 CHARSET:UTF-8) ? T ; ? T (SUBTYPEP CHARSET:ASCII CHARSET:ISO-8859-1) ? T ; ? T (SUBTYPEP CHARSET:ISO-8859-1 CHARSET:ASCII) ? NIL ; ? T
プラットフォーム依存
CLISP をコンパイル時の UNICODE フラグなしでコンパイルすると,一つの文字 セット(プラットフォームネイティブの 8bit 文字セット)のみが使える状態 になります.CLHS の 13 章,文字列の章を参照してください [CHLS-13].
プラットフォーム依存
コンパイル時に UNICODE フラグありでコンパイルした場合のみ,以下の文字セッ トがサポートされます.CHARSET パッケージの定数シンボルに対応した値とし て見えます.
CHARSET パッケージ内のシンボル
このエンコーディングは非常に良い性質を持っています.
:
(LOOP :for i :from 0 :to CHAR-CODE-LIMIT :for c = (CODE-CHAR i)
always (OR (NOT (TYPEP c CHARSET:ISO-8859-1))(EQUALP (EXT:CONVERT-STRING-TO-BYTES (STRING c) CHARSET:ISO-8859-1) (VECTOR i)))) ? T
例えば,CLISP の CODE-CHAR/CHAR-CODE はそれぞれの領域で互換性が あります.
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
MIME で規定されているように,3byte を 4 文字で表現し,76 文字毎に 改行されます.
これは,伝統的な文字集合ではありませんが(自然言語中の文字をバ イトにマップしません),バイト列と文字列との関係を定義している ため,EXT:ENCODING クラスの中で規定されます.
プラットフォーム依存:
GNU libc 2.2 もしくはそれ以上を備えている GNU システムか,GNU libiconv ライブラリがインストールされている UNIX や Win32 環境での み利用可能です.
iconv ライブラリ関数によって提供させる文字集合がエンコーディン グとして使用可能です.エンコーディングは EXT:MAKE-ENCODING 関 数の :CHARSET 引数に文字集合名文字列を渡す事で作成できます.
EXT:ENCODING がビルトインのものと iconv ともに利用可能だった場 合にはビルトインのものが使われます.これは,より効率的で,かつ 全てのプラットフォームで後半に利用できるからです.
エンコーディングはグローバル変数には設定されていません.なぜな らば,iconv でサポートされている全ての文字集合のリストを得る方 法が無いからです.
標準的な UNIX システム(GNU/Linux や GNU/Hurd などの GNU シス テム)や GNU libiconv では `iconv -l` でこのリストを得る事がで きます.
我々が GNU libc 2.2 もしくは GNUl libiconv のみを使う理由は, 他の iconv 実装は多種多様に壊れているからです.我々は,それら のバグのによって CLISP がランダムにクラッシュする事までは面倒 をみたくありません.もし,あなたのお使いのシステムが GNU libiconv のテストスイートをパスする iconv の実装を提供している のなら,<clisp-list@lists.sourceforge.net> (http://lists.sourceforge.net/lists/listinfo/clisp-list) まで 報せてください.将来のバージョンの CLISP はその iconv を使うよ うになるでしょう.
30.5.3. 行終端 (Line Terminators) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
行終端モードは,以下の 3 つのキーワードのうちのいずれかです.
UNIX
改行文字 #\Newline は ASCII の LF 文字 (U000A) で表現されます.
MAC
改行文字 #\Newline は ASCII の CR 文字 (U000D) で表現されます.
DOS
改行文字 #\Newline は ASCII の CR 文字 (U000D) と続く ASCII LF 文字 (U000A) で表現されます.
Windows プログラムはたいてい :DOS 行終端を使いますが,ときどき :UNIX 行 終端を受けつけたり :MAC 行終端を出力したりします.
HTTP プロトコルは :DOS 行終端を要求しています.
行終端モードはファイル/パイプ/ソケットなどへの出力に対してだけ意味があ ります.入力時には,3 種類全ての行終端が認識されます.CLHS の 13.8 節 `入出力における改行の扱い` [CHLS-13.1.8] を参照してください.
関数 (EXT:MAKE-ENCODING &KEY :CHARSET :LINE-TERMINATOR
INPUT-ERROR-ACTION :OUTPUT-ERROR-ACTION) は EXT:ENCODING を返します.:CHARSET 引数はエンコーディング,文字列,もしくは :DEFAULT のいずれ かでなければなりません.:LINE-TERMINATOR 引数の値にはキーワード :UNIX,
MAC, :DOS のいずれかを指定してください.
INPUT-ERROR-ACTION 引数は,バイト列を文字に変換している途中で,不正なバイト列が出現した時に何がおこるかを指定します.その値は :ERROR,
IGNORE, もしくは代りに使用される文字です.UNICODE 文字 #\uFFFD が入力シーケンス中のエラーを表すのによく使用されます.
.. The :OUTPUT-ERROR-ACTION argument specifies what happens when an invalid character is encountered while converting characters to bytes. Its value can be :ERROR, :IGNORE, a byte to be used instead, or a character to be used instead. The UNICODE character #\uFFFD can be used here only if it is encodable in the character set.
OUTPUT-ERROR-ACTION 引数は,文字をバイトに変換している途中で,不正な文字が出現した場合に何がおこるかを指定します.その値は :ERROR, :IGNORE, もしくはかわりに使用される文字です.ユニコード文字 #\uFFFD は,それが文 字集合のなかでエンコード可能であった場合にのみ使用されます.
プラットフォーム依存:
CLISP が UNICODE コンパイル時フラグ付きでビルドされていた場合のみ使用可能です.
関数 (EXT:ENCODING-CHARSET encoding) は,エンコーディングの文字集合をシ ンボルもしくは文字列として返します.
Warning:
(STRING (EXT:ENCODING-CHARSET encoding)) は MIME 名として有効である必要はありません.
ファイル/パイプ/ソケットなど全てのストリームはエンコーディングを含んで います.加えて下記の SYMBOL-MACRO はグローバルな EXT:ENCODING を含んで います.
SYMBOL-MACRO `CUSTOM:*DEFAULT-FILE-ENCODING*`. SYMBOL-MACRO `CUSTOM:*DEFAULT-FILE-ENCODING*` は新しく作成されるファイル/パイプ/ソケッ ト ストリームで :EXTERNAL-FORMAT 引数が指定されていない場合に使われるエ ンコーディングです.
プラットフォーム依存:
CLISP が UNICODE コンパイル時フラグ付きでビルドされていた場合のみ使用可能です.
下記の SYMBOL-MACRO が存在します.
`CUSTOM:*PATHNAME-ENCODING*`:
ファイルシステム中のパス名に使われるエンコーディングです.通常 1:1 エンコーディングを使用すべきです.行終端モードは無視されます.
`CUSTOM:*TERMINAL-ENCODING*`:
端末とのやりとり,特に `*TERMINAL-IO*` ストリームで使用されるエンコー ディングです.
`CUSTOM:*MISC-ENCODING*`:
環境変数やコマンドラインオプションなどにアクセスする際に使用される エンコーディングです.行終端モードは無視されます.
`CUSTOM:*FOREIGN-ENCODING*`:
?FFI? (使用できるプラットフォームは限定されています) を通じてやり とりする文字列で使用されます.もしすべての文字が 1 バイトに対応して いる 1:1 エンコーディングが設定されているならば,そのエンコーディン グが使用されます.
.. is the encoding for strings passed through the ?FFI? (some platforms only). If it is a 1:1 encoding, i.e. an encoding in which every character is represented by one byte, it is also used for passing characters through the ?FFI?.
デフォルトエンコーディングオブジェクトは `-Edomain enconding` 引数に従っ て初期化されます.
Reminder:
SYMBOL-MACRO に対しては EXT:LETF/EXT:LETF を使う必要があります.LET/LET* は正しく動作しません!
エンコーディングは文字列と対応するエンコーディングに従ったバイトベクタ 表現との変換にも使用されます.
`(EXT:CONVERT-STRING-FROM-BYTES vector encoding &KEY :START :END)`
`(VECTOR (UNSIGNED-BYTE 8))` ベクタの :start から :end で指定された 部分シークエンスを与えられたエンコーディングに従って文字列に変換し, 変換した文字列を返します.
`(EXT:CONVERT-STRING-TO-BYTES string encoding &KEY :START :END)`
文字列の :start から :end で指定された部分文字列を,指定されたエン コーディングに従って `(VECTOR (UNSIGNED-BYTE 8))` のバイト列に変換 し,変換した結果のバイトベクタを返します.
$Last Update: 2007/09/09 21:18:48 $