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-04-27

SLIME勉強会@新宿 4/26 (土) 13:00〜20:00 (5)

| 23:28 | SLIME勉強会@新宿 4/26 (土) 13:00〜20:00 (5) - わだばLisperになる を含むブックマーク はてなブックマーク - SLIME勉強会@新宿 4/26 (土) 13:00〜20:00 (5) - わだばLisperになる

雑談篇

(1)〜(4)のような感じで、SLIMEを俯瞰してみていました。

改めて確認してみると、使っていなかった便利機能が結構ありました。

自分は、slime-selectorは全然使っていなかったのですが、使ってみたところ結構便利なので、積極的に使っていこうという感じです。

また、SLIMEとanything.elを組み合わせたりすれば、もっと便利に使えるようになりそうです。(私はanything.elを活用できていないので実際にできるのかどうか良く分かっていませんが(笑))

本編は、3時間位だったと思うのですが、そこから4時間位雑談が続きました!

以下、雑談で出たネタを纏めてみたいと思います。

実際に勉強会として集合するのは、割とエネルギーが必要、IRCで勉強会というのはどうだろう。

→まあまあ良いのでは?

日本で、IRCのLISP部屋として盛り上がっているのはどこか

→どこにもないのでは?

海外のfreenode.netの#lispは過去ログが閲覧できるプログラムが動いていて、また、HyperSpecが呼べたりlisppateというペーストしたコードを綺麗に表示してくれるサイトと連携できるようになっていて、非常に便利そう。

lisppateの機能自体は、CLのプログラムとして配布されている。

そのなかの、colorize.lispはコードをハイライト表示でHTMLにしてくれるプログラムで便利に使えそう。

lisppasteは、asdf-install可能。…でも依存パッケージがリンク切れ…。

組み込み用途などでLISPの便利さを生かせないか

ECL等、Cのコードを生成してくれる処理系を使ってみたが、なかなか思ったようなのがない。

GOOは、インラインでCのコードを書けたり、作者が組み込みに興味があるようなので、Cや組み込み分野との親和性は高そう。

http://people.csail.mit.edu/jrb/goo/

http://people.csail.mit.edu/jrb/Projects/alien-goo-intro.html

http://people.csail.mit.edu/jrb/Projects/alien-goo-talk.pdf

vcgoo154a.zipなどもあるので、Windowsでも行けるかも

ちょっと違うけれど、CをS式風に書けるのもある。

http://www.cliki.net/scexp

コードが消失していて、

http://jsnell.iki.fi/tmp/scexp-0.9.tar.gz

に置いてあるのが見付かるだけ…。

リストの破壊的操作について。ポインタ操作系。
(defun nrev (lst)
  (do ((1st (cdr lst) (if (endp 1st) 1st (cdr 1st)))
       (2nd lst 1st)
       (3rd () 2nd))
      ((atom 2nd) 3rd)
    (rplacd 2nd 3rd)))

(let ((foo '(1 2 3 4)))
  (nrev foo))
;=> (4 3 2 1)

等々、rplacaや、rplacdを駆使した分かりづらいコード。

去年ちょっとしたOn Lispブームのようなものがあった気がするが、何でなんだろうか。

On LispはCLのマクロがテーマという非常に特殊な本だと思うんだけれど…。

→やっぱり、Paul Grahamがカリスマということなのでは?

xyzzyで、defpackageでexportを指定しても、exportしてくれないのはどういう理由?

→バグな様子。

CLには、edというエディタを呼び出す関数が標準で装備されている

→edは、Lispマシンでは、Zmacsを呼び出すものだった。

→4.x BSDがメインターゲットだったFranz Lispでは、viという関数があり、viを呼び出すようになっていた。

BSDだし勿論メジャーなエディタはEMACSではなくvi。

(調べたら、exもありました。vilや、exlもあって、これは編集後ロードするというもの)

viも昔は、LISP編集に便利な機能が沢山あったらしい(あった筈)

等々他にも沢山ネタがあったと思うのですが、メモ取ってなかったので忘れてしまいました…。

まとめ

自分の突発的な見切り発車で色々ご迷惑をお掛けすることがあったと思うのですが、お付き合い頂いて本当にありがとうございました!

次回、勉強会ですが、実際に現地に集合するのは、会場の確保等、なかなか難しいところがあるので、IRCで開催してみるのはどうかチャレンジしてみたいと思います!

SLIME勉強会@新宿 4/26 (土) 13:00〜20:00 (3)

| 21:51 | SLIME勉強会@新宿 4/26 (土) 13:00〜20:00 (3) - わだばLisperになる を含むブックマーク はてなブックマーク - SLIME勉強会@新宿 4/26 (土) 13:00〜20:00 (3) - わだばLisperになる

CVS版 slime/contrib以下のファイルを点検してみよう

contrib以下のファイルは、どうやら(slime-setup '(...))で読みこむらしい

bridge.el

詳細不明

inferior-slime.el

inferior-lispのようなものか?

slime-asdf.el

slime-load-systemの定義らしい。

slime-autodoc.el

エコーバッファに引数情報を表示してくれる機能

読み込むと少しと反応が変わる程度かも。

slime-banner.el

起動時の最初のアニメーションとか。

slime-c-p-c.el

in-pa→in-package形式の補完が可能になる

slime-editing-commands.el

便利なものがおおいので中身を把握しておくのが吉かも。

slime-fancy.el

このファイルで便利機能をまとめてロードできるらしい

slime-fuzzy.el

曖昧方式の補完C-c C-iの方

slime-highlight-edits.el

編集したところが色付きになり、コンパイルが通るまで目立つ状態になる。

若干好き嫌いは分かれるかも

slime-indentation.el

インデントの設定を纏めたもの。

ifのインデント等は、デフォルトでは癖がある。

slime-presentation-streams.el、slime-presentations.el

追記(tszさんからのツッコミコメント)

2008/04/28 00:39
slime-presentationですが、ハッシュテーブルなどの
表示不可能オブジェクトをreplにコピーアンドペーストする
あの機能のことの様です。
さらに、replに表示された#<>記法のオブジェクトを
右クリックして調べたり出来るみたいです。

なるほど! 読み込み不可オブジェクトをREPLで評価するためには、これを読み込む必要があったんですね!

プレゼン用なのだろうか、謎。

slime-references.el

sbcl専用マニュアル。SBCLの場合は、読み込んでおくと吉かも。

デバッガに入ったときに、

See also:

SBCL Manual, Package Locks [:node]

Common Lisp Hyperspec, 11.1.2.1.2 [:section]

のような表示になり、クリックするとSBCLの該当マニュアルページに飛べる。

slime-tramp.el

ssh接続で使う際のユーティリティ。クライアントとサーバでのパス名の変換など。

slime-typeout-frame.el

主にエコーバッファを別窓で表示させるためのもの。

slime-xref-browser.el

クロスリファレンスを表示してくれる、らしい。

swank-goo.goo

gooのswankサーバ

swank-kawa.scm

kawaでもswankできるらしい。

swank-mit-scheme.scm

1. You need MIT Scheme (version 7.7.0 and 7.7.90 seem to work).

ということで、MIT Schemeでも使えるらしい。

meter.lisp

なぜここにあるのか不明。

SLIME勉強会@新宿 4/26 (土) 13:00〜20:00 (2)

| 03:32 | SLIME勉強会@新宿 4/26 (土) 13:00〜20:00 (2) - わだばLisperになる を含むブックマーク はてなブックマーク - SLIME勉強会@新宿 4/26 (土) 13:00〜20:00 (2) - わだばLisperになる

SLIMEを使う

便利機能紹介

ここで紹介している機能のEMACSでの基本キーバインドに関しては、tszさんが分かりやすい一覧表で纏められていますので、そちらも参照して下さい!

式の評価

slime-pprint-eval-last-expression

C-c C-p便利。これを基本に使っても良いかも。

C-c C-cでコンパイル。

コンパイルしてエラーの個所を表示してくれる。

エラーになっている個所が色付きのアンダーラインで表示される。

M-n、M-pでソースファイルの該当個所場所に飛べるので便利!

マクロ展開

非常に便利なので、本当にお勧め。これの支援が無いとマクロが書けなくなる位、便利。

SLIME上では(macroexpand ...)と書く必要はないのだ!

  • 全部展開する

C-c M-m

関数定義のソースコードに飛ぶ

M-.でソースへ

M-,でもどる

という風にどんどん進める

処理系が対応している必要あり (SBCL、Clozure等は対応している)

関数名補完

c-p-c、Fuzzy(C-c M-i)方式等いろいろある。

c-p-cは、m-v-bi→multiple-value-bindと補完。ハイフンを入力する必要あり。

Fuzzyはなんとなくの感じから展開mvbind(C-c M-i)→multiple-value-bind等々

REPLの履歴

Bashのように履歴が辿れる。

REPL上で、M-n、M-p。M-rもある。Eshellっぽいキーバインド。

読み込み不可オブジェクトをREPLで読み込める

読み込めない筈の#<foo>等もよみこめる。主に対話操作で便利。

SLIME Fancyが読み込まれている必要ありかも。

複数の処理系を切り換えて使える。

C- - M-x slimeで切り換えられる。(slime-connectでない場合)

複数の処理系を同時起動可能。しかし、編集しているLISPファイルをどの処理系が担当しているのか把握できなくなることが多いので、あまりお勧めできないかも。

パッケージの移動とソースファイルとのシンクロ

C-c ~でソースファイルとソースファイルが指定しているパッケージを同期できる。

←割とファイルを開いた段階で自動で内容をみて判別してくれるのでは?(tsz)

←そういえば、そうかもしれませんね(笑) どういう時に使うんだろう…。自分は割と手癖で打ち込んでます(g000001)

ファイルのロード、コンパイル

C-c C-lでファイルのロードC-c C-kで、コンパイルしてからロード

ASDFのロード load-systems

asdf-installはないが、 (asdf:oos ~)はSLIMEから可能。

M-x slime-load-system

と打ち込んで、パッケージを選択。パッケージ名は補完が効く。

SLIME上で(asdf:oos ...)と打つ必要はないのだ!。

HyperSpecとの連携

非常に便利で、必須な機能。(C-c C-d h)

憶えるのが厄介な、FORMATの指示子を引くこともできる! (C-c C-d ~)

Cltl2も引きたい→ILISPにcltl2.elがあるんで、引き抜いてきてロードすれば使えます。

(eval-after-load "cltl2"
  (progn 
    (require 'cltl2)
    ;; SLIMEっぽく、slime-cltl2-lookupという名前のエイリアスを作成
    (defalias 'slime-cltl2-lookup 'cltl2-lookup)
    ;;ドキュメントの場所
    (setq cltl2-root-url "http://foo.local/docs/cltl/")))
バッファ間の移動など(slime-selector活用)

M-x slime-selectorでSLIMEを操作する上で便利なslime-selectorが起動。

割と頻繁うので、

(global-set-key [(control ?\;)] 'slime-selector)

等に便利な場所に割り当てると良いかも。

slime-selectorで切り換えられるもの

キー名前説明
?Selector help buffer.ヘルプ
cSLIME connections buffer.接続状況が確認できる。接続表示の上でkを押すことにより切断可能
d*sldb* buffer for the current connection.*sbdb*のバッファ
emost recently visited emacs-lisp-mode buffer.直近のelispバッファへ移動
iinferior-lisp* buffer.*inferior-lisp* bufferへ移動
lmost recently visited lisp-mode buffer.直近のlispバッファへ移動
rSLIME Read-Eval-Print-Loop.REPLへ移動
s *slime-scratch* buffer.emacsや、xyzzyの*scratch*のような感じで、式をC-jすると後に結果の文字が挿入されるのバッファ。*scratch*が好きな人にはおすすめ。
tSLIME threads buffer.スレッド別に表示される。選択してC-kを押すことでスレッドを終了できる。
v *slime-events* buffer.クライアントとサーバの通信の様子がみれる
インスペクタ

(C-c I)でオブジェクトをいろいろ調べられる

パッケージの場合、内容を確認できるのが便利。エクスポートされている関数一覧など見れる。

SLIME Fancyが読み込まれていないと、綺麗に表示されない?

デバッガ

tで詳細表示にトグル

M-n、M-pでソースと対応づけられながら進めることが可能。

内部で式の評価をすることも可能。

クロスリファレンス

(C-c >)、(C-c <)呼んでいる関数、呼ばれている関数を調べる。一覧も表示される。

プロファイリング

slime-toggle-profile-fdefinition

TRACEのように任意の関数を指定してプロファイリング。

結果表示で結果表示。呼ばれた回数等が表示される。

全部のプロファイリングを中止。

  • slime-profiled-functions

プロファイリング中の関数の一覧を表示

全部のコッカを閉じる(過不足なく)

slime-close-all-parens-in-sexp(C-c C-])

式をコメントアウト/復帰 slime-balanced-comment

slime-insert-balanced-commentsでコメントアウト

(do ((i 0 (1+ i)))
    ((= 10 i) (p__rint "foo?")))

;; コメントアウトしたい式の先頭で、slime-insert-balanced-comments
;; →
(do ((i 0 (1+ i)))
    ((= 10 i) #|(print "foo?")|#))

;; slime-remove-balanced-commentsで復帰
;; →
(do ((i 0 (1+ i)))
    ((= 10 i) (p__rint "foo?")))
;; 楽ちんだ!

slime-remove-balanced-commentsで復帰

(define-key slime-mode-map [(control ?c) ?\;] 'slime-insert-balanced-comments)
(define-key slime-mode-map [(control ?c) (meta ?\;)] 'slime-remove-balanced-comments)

等々を.emacsへ…。

引数の補完、便利なのか微妙

C-c C-sでずらっと補完。(map __ ) → (map result-type function first-sequence more-sequences...)

ディスアセンブル

(C-c M-d)

SLIME上では(disassemble ...)と書く必要はないのだ!

トレース

(C-c C-t)で指定した関数をTRACEしたりしてくれる。SLIME上では(trace ...)と書く必要はないのだ!

関数定義の取り消し

(C-c C-u) slime-undefine-function

SLIME上では(fmakunbound ...)と書く必要はないのだ!。まあ、そこまで便利でもないけど(笑)

参考資料等

SLIMEでどういうことができるかを解説した良いムービーがある。

Marco Baringer氏がSLIMEの一通りの使い方を解説してくれる、1時間程度のムービー。

まずは、これを一回観るのが手っ取り早い?

SLIME勉強会@新宿 4/26 (土) 13:00〜20:00 (1)

| 01:37 | SLIME勉強会@新宿 4/26 (土) 13:00〜20:00 (1) - わだばLisperになる を含むブックマーク はてなブックマーク - SLIME勉強会@新宿 4/26 (土) 13:00〜20:00 (1) - わだばLisperになる

SLIMEとは

仕組み

処理系がSWANKというサーバを起動しクライアントと通信しながら開発する仕組み

EMACSが主なクライアントとして開発が進められている。

EMACS以外にもクライアントはあり、CUSP等Eclipseで動くものがある。

SWANKにはCL以外にも色々あるようで、確認できている処理系としては、CL、MIT Scheme、Scheme48、Kawa、GOO、Dylan等がある模様。

とりあえず今回は、CLの勉強会なので、CLが対象ということで進めます。

SLIMEで日本語が上手く扱えるかの問題

日本語対応はとりあえずUTF-8が無難?

UTF-8で手軽に使えるもの
  • SBCL
  • Clozure CL
  • Allegro CL
  • CLISP
駄目っぽいもの (基本的に処理系が対応していない)
  • ECL
  • CMUCL
  • ABCL
  • LispWorks(処理系自体は、UTF-8は普通に扱える。SLIMEの説明では簡単に対応できると思う、書いてはいるが、まだ未対応っぽい…。)
未確認
  • MCL

使用形態

(1)SWANKサーバを立てて、クライアントと通信する方法

メリット:

サーバは別に起動させるので、起動が速いという印象がある。(g000001)

←別にどっちの方法でもあまり変わらないのでは?(NANRI)

←そう言われれば、そうかも(g000001)

デメリット:

別にする手間が面倒臭い。

(2)EMACSで起動する時にSWANKサーバとSLIMEのクライアントを起動してしまう方法

複数の処理系を切り換えて使う場合割と切り換えがスムース(な気がする)(g000001)

SWANKを別に起動する方法の場合の設定例

別に起動する場合は、CL側で、SWANKを起動する必要がある。

処理系に初期化ファイル等を渡して起動させる方法がメジャーな様子

/usr/local/sbcl/bin/sbcl --core /var/lisp/sbcl-1.0.16-x86_64-linux.core --load ~/etc/slime.lisp

等々

文字コードをちゃんとクライアントと合わせないと接続が切れる原因になるので注意。

slime.lispの例
;;~/etc/slime.lisp
;;   (swank:create-swank-server PORT) => ACTUAL-PORT
;;   で待機開始。

;; 文字コード設定等
#+sbcl (setq sb-impl::*default-external-format* :utf-8)
#+lispworks (setq STREAM::*DEFAULT-EXTERNAL-FORMAT* '(:utf-8 :eol-style :lf))
(setq swank::*coding-system* 
      #-(or cmu ecl abcl) "utf-8-unix"
      #+(or cmu ecl abcl) "iso-latin-1-unix")

#+cmu (setf swank:*communication-style* nil)

;; swank起動
(swank:create-server :port 
                     #+sbcl  4005
                     #+clisp 4006
                     #+cmu 4007
                     #+ecl 4008
                     #+allegro 4009
                     #+lispworks 4010
                     #+openmcl 4011
                     #+abcl 4012
                     :dont-close t)

輝け! 第1回 突発性CL勉強会@新宿 銀座ルノアール 4/26 (土) 13:00〜20:00 (0)

| 01:37 | 輝け! 第1回 突発性CL勉強会@新宿 銀座ルノアール 4/26 (土) 13:00〜20:00 (0) - わだばLisperになる を含むブックマーク はてなブックマーク - 輝け! 第1回 突発性CL勉強会@新宿 銀座ルノアール 4/26 (土) 13:00〜20:00 (0) - わだばLisperになる

本日は、先週突然全くのノープランで呼び掛けたCLに関するなんらかの勉強会を開催させて頂きました!

参加者は、いいだしっぺの私g000001と勉強熱心な熱きmokehehe氏、NANRI氏、tsz氏(アルファベット順)の3名様、合わせて4名。また、今回残念ながら時間や条件等の都合が合わなかった、佐野さん、ぬえさん、参加希望ありがとうございました!

それで、テーマですが、なんとなくの流れでSLIMEに決まりました。

開催場所ですが、適当にだらだらできそうという、私の漠然とした印象とノートPCの電源等が確保できるらしい、ということでルノアールがなんとなく選ばれました。

しかし、現地に集合し、お目あてのルノアールを訪れたところ、先週から改装工事!。ということで、いきなり出鼻が挫かれました…。

とりあえず、たまたま近くにルノアールがあったので、そちらに移動。

こちらは、若干落ち着けない感じで、ノートPCもテーブルに置くスペースもないし、電源もないみたい、という感じでしたが、なんとなく見切り発車で勉強会開始。

内容としては、私が言いだしっぺということもあり、私が勝手にSLIMEの機能を私が知ってる限り列挙したネタ元を作成し、それにツッコミを入れるという感じで進行。

以下、ログと準備したネタをつらつら書いて行きます。長いので何回かに分けます。