Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-05-26

cl-irc

| 13:15 | cl-irc - わだばLisperになる を含むブックマーク はてなブックマーク - cl-irc - わだばLisperになる

今回のライブラリ紹介は、IRCのBOTを作成するのに便利な、cl-ircです。

パッケージ名cl-irc
ClikiCLiki: cl-irc
ASDF-INSTALL

配布されているソースの中にマニュアルのURLを貼り付けてくれるBOTのサンプルが同梱されていて便利に使えます。

このbotは、

clhs let

のような発言があると、

http://www.lispworks.com/reference/HyperSpec/Body/s_let_l.htm

のようにURLを返してくれます。

自分は、irc.freenode.netの#Lisp_Scheme部屋にもたまに連れていったりしますが、常駐させていないため、割と必要なときにいなかったりして全然役に立っていません(笑)

2008-05-05

CLの開発環境/ライブラリ等の設定

| 18:01 | CLの開発環境/ライブラリ等の設定 - わだばLisperになる を含むブックマーク はてなブックマーク - CLの開発環境/ライブラリ等の設定 - わだばLisperになる

quekさんのletter: [Common Lisp] SBCL 環境 ライブラリ ~/.sbclrc

を読んで、確かにCLerの人々は、処理系をどういう設定で使っているのか、という情報は少ないなぁと思ったので、参考になるかどうかは疑問ですが、自分もどういう感じで使っているかを晒してみることにしました!

処理系

大した理由はないのですが、できるだけ沢山の処理系をできるだけ沢山のOSで動かすというのを目標にしています。

現在、SBCL、Clozure CL、Allegro CL、LispWorks、ECL、ABCL、CMUCL、MCLをMacOSX、Linuxの組み合わせで使っていて、MCL以外は、大体全部同じライブラリ環境で揃えています。ちなみにFFI系を利用するものが揃えられないのは、諦めています(^^;

ライブラリの設定

ライブラリ環境を揃えるのには、以前もこのブログで書いたasdf-addonsを利用しています。

asdf-addonsを利用すると、複数の処理系でライブラリを揃えるのが非常に楽なのでお勧めです。

他に似たものとしては、asdf-binary-locationsがあるようです。

処理系ごとの初期化ファイル

自分は、処理系ごとにSWANKが起動できて頻繁に利用するパッケージを全部読み込んだイメージをダンプしています。

イメージの作成にはmake-core.lispのような処理系で共通のファイルを作成して、各処理系が共通のライブラリを読み込んでダンプしています。

そして、作成したイメージを使ってSWANKを起動し、SLIMEで接続して利用しています。

各処理系毎の初期化ファイルは殆ど利用していませんが、Allegroの試用版だと処理系起動時にコアファイルとロードさせるファイルの両方を指定できないようなので、

.clinit.clに

;; .clinit.cl
;; -*- lisp -*-
;(princ "Hello! init file")

(and (find-package :swank)
     (load (merge-pathnames"etc/slime.lisp" (user-homedir-pathname))))

のようにして、SWANKを起動させるのに初期化ファイルを例外的に利用している位です。

まとめ

という感じで、自分は、環境をいちいちダンプしているのですが、ダンプするのもバッチ処理的なファイルを作成しておけば良いので割と頻繁にダンプしています。

イメージをダンプできないもの(LispWorksの評価版など)もあるのですが、この場合は、イメージ作成用のバッチファイルが、環境をロードするためのファイルになるようにしています。

2008-04-30

FARE-MATCHER

| 09:18 | FARE-MATCHER - わだばLisperになる を含むブックマーク はてなブックマーク - FARE-MATCHER - わだばLisperになる

今回は、先日Gauche本の勉強でも使ったFARE-MATCHERです。

これは、CLに色々なパターンマッチの構文を提供するものです。

パッケージ名fare-matcher
ClikiCLiki: fare-matcher
ASDF-INSTALL
ドキュメントCLiki: fare-matcher-docs

(asdf-install:install :fare-match)一発で可能です。

fareというつづりがどっかで見たことがあるなあ、と思っていたのですが、作者がLispマシンのまとめページ等でお馴染のFare Rideau氏でした。

なるほど、それで、fare-matcherなんですね。

使い方は、上のドキュメントに詳しいですが、matchの使い勝手は、結構良いのではないかと思いました。ecaseとcaseの関係のように、マッチしないとエラーになるematch。destructuring-bindの代わりに使えそうな、letm、これらのマクロの基本となっているifmatchがあります。

(use-package "FARE-MATCHER")

(ifmatch (list a b) '(a b)
	 (list a b) 
	 nil)
;=> (A B)

(let ((pat '(:foo :bar)))
  (match pat
    ((list a b c) (list a b c))
    ((list a b) (list a b))
    (_ "マッチしませんでした")))
;=> (:FOO :BAR)

(let ((pat '(:foo :bar :baz :quux)))
  (ematch pat
    ((list a b c) (list a b c))
    ((list a b) (list a b))))
;!>>> match-failed

(letm (list* a b c d) '(1 2 3 4 5)
  (list a b c d))
;=> (1 2 3 (4 5))

(letm (values a b) (values 1 2)
  (list a b))
;=> (1 2)

(ifmatch (and a (of-type integer *)) '(1)
	 a)

(ifmatch (and x (cons (of-type integer) *)) '(2)
	 x)
;=> (2)

(ifmatch (like-when (cons x y) (eql x y)) '(2 . 2) x)
;=> 2

(ifmatch (like-when `(,x ,@y) (eql x y)) '(2 . 2)
	 x)

(defun my-length (lst)
  (ematch lst
    (`(,* ,@tail) (1+ (my-length tail)))
    (() 0)))

(MY-LENGTH '(foo bar baz))
;=> 3

2008-04-22

ACL-COMPAT

| 22:47 | ACL-COMPAT - わだばLisperになる を含むブックマーク はてなブックマーク - ACL-COMPAT - わだばLisperになる

毎週火曜は適当にCLのライブラリを紹介することにしてみました。

今回は、ACL-COMPATですが、これは、Flanz社のAllegro CLとのコンパチビリティレイヤを他の処理系にも提供するものです。

元々Allegro CL用に書かれたものが他の処理系に移植される際にこのパッケージが使われることが多いようです。

割と依存しているパッケージが多いので知らない間にインストールされているかもしれません。

パッケージ名ACL-COMPAT
ClikiCLiki: ACL-COMPAT
ASDF-INSTALL

インストール

(asdf-install:install :acl-compat)一発で可能です。

パッケージが提供するもの

  • マルチプロセッシング
  • ソケット
  • ACLのEXCLや、NET.URI、SYSパッケージで定義されている一部ユーティリティ

等々、Allegro風に見せる層を被せるのでAllegroに馴れた人は便利に使える、という感じでしょうか。

自分は、if*の印象しかなかったのですが、改めて眺めてみると結構色々あるなと思いました。

2008-01-24

Vecto

| 18:12 | Vecto - わだばLisperになる を含むブックマーク はてなブックマーク - Vecto - わだばLisperになる

今回は、Vectoを試してみます。

VectoはCL-VECTORSの簡便なインターフェースを提供するものだそうで、これを利用して簡単にベクター画像をpngファイルとして出力することができます。

パッケージ名vecto
作者Zach Beane氏
本拠地サイトVecto - Simple Vector Drawing with Common Lisp
ClikiCLiki: Vecto
ASDF-INSTALL

インストール

(asdf-install:install :vecto)一発で、ウェブからパッケージを取得しインストール完了です。

試してみる。

手頃な感じで、綺麗な画像が作れるので、これは重宝するかもしれません。

;; 動作
(defpackage #:vecto-examples (:use #:cl #:vecto))
(in-package #:vecto-examples)

(with-canvas (:width 400 :height 30)
  (let ((font (get-font "/usr/share/fonts/truetype/ipamona/ipag-mona.ttf"))
	(file "/var/tmp/vecto.png"))
    (set-rgb-fill 0.95 0.60 0.25)
    (rounded-rectangle 0 0 400 30 5 5)
    (fill-path)
    (set-rgb-fill 1.0 0.65 0.3)
    (rounded-rectangle 2.5 2.5 395 25 5 5)
    (fill-path)
    (set-font font 20)
    (set-rgb-fill 0 0 0)
    (draw-string 2.5 7.5 "1万円分のスイーツ、夢と散る(´・ω・`)")
    (save-png file)))
;
;
  • 出力画像

2008-01-19

cl-serializer

| 05:31 | cl-serializer - わだばLisperになる を含むブックマーク はてなブックマーク - cl-serializer - わだばLisperになる

今回は、cl-serializerを試してみます。

シリアライズって何ですか?という私なのですが、調べてみたところ、処理系内部のオブジェクトデータの外部へ入出力するためのものなんですね。

パッケージ名cl-serializer
本拠地サイトcl-serializer
ClikiCLiki: cl-serializer
ASDF-INSTALL

インストール

asdfに対応はしているのですが、依存するパッケージがことごとく、Clikiに登録されておらず、darcで引っ張ってこないといけません。これが、結構手間です。

自分は、darcで引っ張ってきて、tarボールにまとめ、asdf-installをしました。


$ cd /var/tmp
$ darcs get http://common-lisp.net/~loliveira/darcs/babel                   
$ darcs get --partial http://common-lisp.net/project/cl-def/darcs/cl-def    
$ darcs get http://common-lisp.net/project/stefil/darcs/stefil              
$ darcs get http://common-lisp.net/project/defclass-star/darcs/defclass-star
$ darcs get http://common-lisp.net/project/cl-serializer/darcs/cl-serializer

$ tar zcvf ....

(asdf-install:install "http://cffi-net.accela.net/releases/cffi-grovel-r2.tgz")
(asdf-install:install "/var/tmp/babel.tar.gz")
(asdf-install:install "/var/tmp/cl-def.tar.gz")
(asdf-install:install "/var/tmp/stefil.tar.gz")
(asdf-install:install "/var/tmp/defclass-star.tar.gz")
(asdf-install:install "/var/tmp/cl-serializer.tar.gz")

試してみる


(require :cl-serializer)

;; データ
(defvar obj '(a (b c) a b (d e (f g (h i)))))

;; 書き出し
(let ((sr (cl-serializer:serialize obj)))
  (with-open-file (out "/var/tmp/ser.dat" :direction :output :if-exists :supersede
		       :element-type 'unsigned-byte)
    (series:collect-stream out (series:scan sr) #'write-byte)))

;; 読み込み
(with-open-file (in "/var/tmp/ser.dat" :element-type 'unsigned-byte)
  (pprint (cl-serializer:deserialize (coerce (series:collect (series:scan-stream in #'read-byte)) 'vector))))
;=> (A (B C) A B (D E (F G (H I))))

serializeでシリアライズして、deserializeで戻し。

なるほど、なるほど。

私には用途が思い付きませんが、きっと凄いものなのでしょう(´▽`*)

2008-01-16

cl-audioscrobbler

| 00:09 | cl-audioscrobbler - わだばLisperになる を含むブックマーク はてなブックマーク - cl-audioscrobbler - わだばLisperになる

今回は、cl-audioscrobblerを試してみます。

これは、last.fmに曲情報をポストしたりする、Audioscrobblerと連携するパッケージです。

この前私はlast.fmに曲情報をポストするコードを書いて認証が通らず頓挫したりしましたが、そんな私も一応作る前にClikiを調べて、last.fm関連のものが無いかは確認してみたつもりでした。これを発見したときには、なんだ、そのものズバリがあるんじゃないかよ!、と思ってしまいました。

Clikiの検索では、存外、目的のパッケージが見付けられないことが多い気がします。

この前も、AllegroのHTMLパーザを移植してClikiに公開した人が、「それ、もう移植されてるよ」と指摘される、なんてことがありました。

ちなみに、私もClikiでpxmlutilsを発見できずに、Allegroのオープンソース版をSBCLに移植した後で発見するという、全く同じ体験をしました。

移植ははちょっと直せば良いので簡単ではあるのですが、同じことをしてる人が他にも沢山いるような気がしてなりません(笑)

pxmlutilsっていう名前が良くないと思うなあ。

パッケージ名cl-audioscrobbler
本拠地サイトcl-audioscrobbler
ClikiCLiki: cl-audioscrobbler
ASDF-INSTALL

インストール

(asdf-install:install :cl-audioscrobbler)一発です。

試してみる


(require :cl-audioscrobbler)

;; クライアント作成
(defparameter *c*
  (cl-audioscrobbler::make-client "user" "password" "tst" "1.0"))

;; 曲情報をポスト
(cl-audioscrobbler::post-song *c* :1.1
			      "Bonnie Pink"
			      "Even So"
			      "Private Laughter"
			      "179"
			      "1")

という感じで曲情報がポストできます。

プロジェクトのサイトには非常に丁寧に作られたドキュメントが沢山用意されていて非常に親切です。

2008-01-14

cl-glfw

| 22:33 | cl-glfw - わだばLisperになる を含むブックマーク はてなブックマーク - cl-glfw - わだばLisperになる

今回は、cl-glfwをインストール。

glfwのCommon Lispバインディングの様子。

パッケージ名cl-glfw
本拠地サイト不明
ClikiCLiki: cl-glfw
ASDF-INSTALL

インストール

(asdf-install:install :cl-glfw)一発です。

glfw(libglfw.so)が必要なので、予めインストールして置く必要があります。

試してみる

デモが附属してくるので試してみます。

(load "cl-glfwのソースの場所/cl-glfw_0.3/examples/gears.lisp")

するとGLではお馴染みの歯車がぐるぐる回ります。

2008-01-13

ttf-ascii

| 17:45 | ttf-ascii - わだばLisperになる を含むブックマーク はてなブックマーク - ttf-ascii - わだばLisperになる

TTFファイルから、アスキーアートのバナーを作るらしいパッケージ。とりあえず、試しでインストール。

パッケージ名ttf-ascii
本拠地サイトhttp://www.yagc.ndo.co.uk/code/ttf-ascii/
ClikiCLiki: ttf-ascii
ASDF-INSTALL×
インストール方法ASDFには対応している。

インストール

このパッケージは、ASDFには対応しているのですが、bzip2で圧縮されているため、asdf-installできず。最近のASDF-INSTALLだとbz2も扱えるのでしょうか…。

面倒なので、asdf-installをbz2も扱えるように変更してみました。CL-PPCREとか、KMRCL依存というのに問題ありな気が激しくしますが、面倒だったので…。(find-packageで判定してオリジナルと動作を切り分ければ、幾分ましかもしれません)

;; 判定する関数をでっちあげ
(defun get-archive-type (name)
  (let ((file-type (kmrcl:command-output "~A ~A" "file" (namestring name))))
    (cond ((ppcre:scan "bzip2" file-type) :bz2)
	  ((ppcre:scan "gzip" file-type) :gz)
	  ('T :unknown))))

(defun get-tar-directory (packagename)
  (let* ((tar (with-output-to-string (o)
                (or
                 (sb-ext:run-program *tar-program*
                                     (list (case (get-archive-type packagename)
					     (:gz "-tzf")
					     (:bz2 "-tjf")
					     (otherwise (error "unknown archive type")))
					   (namestring packagename))
                                     :output o
                                     :search t
                                     :wait t)
                 (error "can't list archive"))))
         (first-line (subseq tar 0 (position #\newline tar))))
    (if (find #\/ first-line)
        (subseq first-line 0 (position #\/ first-line))
        first-line)))

(defun untar-package (source packagename)
  (with-output-to-string (o)
    (or
     (sb-ext:run-program *tar-program*
			 (list "-C" (namestring source)
			       (case (get-archive-type packagename)
				 (:gz "-xzvf")
				 (:bz2 "-xjvf")
				 (otherwise (error "unknown archive type")))
			       (namestring packagename))
			 :output o
			 :search t
			 :wait t)
     (error "can't untar"))))

それで、このパッケージは、ZPB-TTFパッケージに依存しているので、(asdf-install:install :zpb-ttf)でインストールします。

試してみる。

ドキュメントはないですが、ソース本体であるfont.lispの最後にテストが書いてあるので、それを真似て試してみます。

ちなみに、シンボルはエクスポートされていない様子です。

日本語フォントは無理かなーと思って試してみたのですが、ちゃんと表示されました。

(let ((font-loader
       (zpb-ttf:open-font-loader "/usr/share/fonts/truetype/kochi/kochi-gothic-subst.ttf")))
  (ttf-ascii::print-message (ttf-ascii::make-message font-loader "漢" 64 64))
  (zpb-ttf:close-font-loader font-loader))
;=>
################################################################
##########+#####################################################
#########++##################++############++###################
########++++#################+++++#########+++++################
#######+++++#################++++++########++++++###############
#######++++++################+++++#########++++++###############
########+++++################+++++#########+++++################
########++++++##+++++++++++++++++++++++++++++++++++++++++++++###
#########+++++##+++++++++++++++++++++++++++++++++++++++++++++###
#########++++++#+++++++++++++++++++++++++++++++++++++++++++++###
##########+++++++++++++++++++++++++++++++++++++++++++++++++++###
###########++++#+++++++++++++++++++++++++++++++++++++++++++++###
###########++################+++++++++++++++++++################
#############################+++++++++++++++++++################
#############################+++++++++++++++++++################
########################+++++++++++++++++++++++++++++###########
########################+++++++++++++++++++++++++++++###########
######+#################+++++++++++++++++++++++++++++###########
####+++#################+++++++++++++++++++++++++++++###########
###+++++################++++#########+++#########++++###########
###++++++###############++++#########+++#########++++###########
####+++++###############++++#########+++#########++++###########
####++++++##############++++#########+++#########++++###########
#####+++++##############++++#########+++#########++++###########
#####++++++#############++++#########+++#########++++###########
######+++++#############++++#########+++#########++++###########
######++++++############++++#########+++#########++++###########
#######++++#############+++++++++++++++++++++++++++++###########
#######++###############+++++++++++++++++++++++++++++###########
########################+++++++++++++++++++++++++++++###########
########################+++++++++++++++++++++++++++++###########
########################+++++#######+++++#######+++++###########
####################################+++++#######################
####################################+++++#######################
##############++#####+++++++++++++++++++++++++++++++++++########
##############+++####+++++++++++++++++++++++++++++++++++########
#############++++####+++++++++++++++++++++++++++++++++++########
#############+++++###+++++++++++++++++++++++++++++++++++########
############++++++###+++++++++++++++++++++++++++++++++++########
############++++++################++++++########################
###########+++++++################+++++#########################
###########++++++#################+++++#########################
##########+++++++++++++++++++++++++++++++++++++++++++++++++++###
##########+++++++++++++++++++++++++++++++++++++++++++++++++++###
#########++++++++++++++++++++++++++++++++++++++++++++++++++++###
#########++++++#+++++++++++++++++++++++++++++++++++++++++++++###
#########++++++#+++++++++++++++++++++++++++++++++++++++++++++###
########++++++#################+++++++#+++++####################
########++++++#################++++++##++++++###################
#######+++++++################+++++++###+++++###################
#######++++++################++++++#####+++++++#################
######+++++++################++++++######+++++++################
######++++++#################++++++######++++++++###############
#####+++++++###############+++++++#########+++++++##############
#####++++++###############++++++++#########+++++++++############
####++++++###########++#+++++++++###########++++++++++##########
####++++++#########+++++++++++###############+++++++++++########
###+++++++#####++++++++++++++##################+++++++++++#+####
#########+#####+++++++++++++####################++++++++++++####
################++++++++++########################+++++++++#####
################+++++++++############################+++++######
#################++++###########################################
################+###############################################
################################################################

cl-sparsematrix

| 16:07 | cl-sparsematrix - わだばLisperになる を含むブックマーク はてなブックマーク - cl-sparsematrix - わだばLisperになる

Clikiで更新されたものを片っ端からインストールしてみるということは、当然ながら自分が理解できる以外のものもインストールするということであり、今回は、疎行列に関してのパッケージなわけですが、疎行列って何?という私が試してみるのも無理がありますね(´▽`*)

ということで、インストールしただけで終了しました…。

作者は、Tamás K Papp氏で、他にも色々面白そうなパッケージを作成されている方のようです。

パッケージ名cl-sparsematrix
本拠地サイト404 Not Found
ClikiCLiki: cl-sparsematrix
ASDF-INSTALL
(asdf-install:install :cl-sparsematrix)

インストール

asdf-install可能なので、(asdf-install:install :cl-sparsematrix)すると、関連するパッケージを芋蔓式に取得します。

cl-numlib、ffa、cl-utilities等がインストールされるようです。

丁寧なPDFのドキュメントが附属してきます。

2008-01-12

lisp-unit

| 16:54 | lisp-unit - わだばLisperになる を含むブックマーク はてなブックマーク - lisp-unit - わだばLisperになる

Clikiからは新しく登録されたり更新されたパッケージ(ライブラリ)のRSSがフィードされているのですが、ふと思い立って、更新されたパッケージを追い掛けてやたらインストールして、試したログをここに書いてみることにしました。

色々な面白いパッケージが沢山あるのですが、如何せん情報がみつけられないことが多いので、片っ端からインストールしてみれば、何か面白いもの発見できるかな、という安易な考えです。

とりあえず、今回は、lisp-unitを試してみることにしました。前までは、LispUnitという名前だったのですが、この度名前をlisp-unitに変更したようです。

パッケージ名lisp-unit
本拠地サイトno title
ClikiCLiki: lisp-unit
ASDF-INSTALL
(asdf-install:install :lisp-unit)

インストール

asdf-install可能なので、(asdf-install:install :lisp-unit)で一発インストール完了です。

使ってみる

かなり古くからある、リグレッションテストのパッケージ:RTと大体同じような使い勝手に思えました。

テストをDEFINE-TESTで定義して、RUN-TESTで実行するところなど共通点は多いと思います。

(defpackage #:cl-2008-01-12 
  (:use #:cl))

(in-package #:cl-2008-01-12)

(defun fib (n)
  (cond ((< n 2) n)
	('T (+ (fib (1- n))
	       (fib (- n 2))))))

(defun fib-iter (n)
  (do ((cnt n (1- cnt))
       (a1 1 (+ a1 a2))
       (a2 0 a1))
      ((< cnt 2) a1)))

のようなファイル(cl-2008-01-12.lisp)があるとすると、

(require :lisp-unit)

(load "cl-2008-01-12")

(defpackage :test_cl-2008-01-12
  (:use #:cl #:lisp-unit))


(in-package #:test_cl-2008-01-12)


(define-test fib
  (assert-eql 55 (cl-2008-01-12::fib 10))
  (assert-eql 1 (cl-2008-01-12::fib 1))

  (loop :for i from 1 :to 30
        :do (assert-eql (cl-2008-01-12::fib-iter i) (cl-2008-01-12::fib i)))
  
  )

(run-all-tests :test_cl-2008-01-12)

(cl-2008-01-12::fib-iter 0)
;=>FIB: 32 assertions passed, 0 failed.

のように書いてテストが書けます。

RTでは、deftestに一つずつ別の名前を付けなくちゃいけなかったりするので、自分は、それ用のマクロを定義して使ったりしてましたが、lisp-unitはRTより使い勝手は良いようです。

本拠地のサイトに丁寧な説明が用意されています。

自分も一時ユニットテストを使っていたのですが、テストを書くのが段々面倒になってしまい、ひたすらSLIMEのコンパイルエラーの指摘に頼ってコードを書くようになってしまいました。

これを使ってもう少し、精神衛生上すっきりしたコード書きができるようになりたいものです。

SLIMEで支援用ELISPを書いてCompile Defunと同じ位簡単にテストまで完了したいという妄想はあるのですが、なかなか自分の力量的に難しいなあ。