とりあえず, 242日目

今年ももう終わり.
昨日は, 最近22時に寝てたのに, 0時まで起きてた. ちょっとキツかった.
今日もそれくらいまで起きてるだろうから, ちょっと遅めに起きた.



さて, 来年は色々とモノが作れるといいな.
目標は, どうしよう.

大きくはこの2つかな.
何度も挑戦して, 挫折しているC++をできるようになりたいな.
あとは, Lispも楽しくなってきてるし.
簡単なOSも作ってみたいなあ.
やりたいことはいっぱい. でも中々手をつけない. だめだなあ.


あ, あと, もちろんブログは, 来年も毎日更新でいけたらいいな.
でもさすがにキビしいだろうな.

SBCL, Steel Bank Common Lispを家のLinuxに入れてみた

まずは, 本家からダウンロードしてきて, 展開.

$ tar xvjf sbcl-1.0-x86-linux-binary.tar.bz2

これで, 展開したディレクトリに, sbcl-1.0-x86-linuxというディレクトリが出来上がる.



次に, /usr/localディクトリにインストールをする.

$ sudo sh install.sh

次に, /usr/local/binを自分の環境変数PATHへ加える.
自分の場合, こんなのが書いてある.

path=($JAVA_HOME/bin /opt/bin /usr/local/bin $path)

あとは, 端末エミュレータを再起動するなり, 設定をsourceコマンド使って読み込ませるなりすればOK.
これで終わり, かな?


起動してみる.

$ sbcl
This is SBCL 1.0, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.
* (quit)

こんな感じ.
終了は, (quit). (bye)じゃダメ.
ちなみに, C-hが効かなかったりと, デフォではちょっと使いづらい.
ということで, rlwrapをインストールしてみたら快適になった.
こいつの導入は, ./configre, make, sudo make installで, /usr/local/に入って, すぐ終了する.



ついでにmanページが/usr/local/share/man/man1へ追加されてるのでそれも追加する.
自分は基本的に, manはEmacs上でしか読まないので, womanへ追加(.emacsへね).
こんな感じ.

(setq woman-manpath '("/usr/share/man" "/usr/share/man/ja" "/usr/local/share/man"))

manコマンドへの追加は, 環境変数MANPATHへ追記してやればいいのかな???
それとも, /etc/man.configへ追記???
おっ, ちょっと調べてみたら, コマンドmanpathで現在参照しているディレクトリが見える.


使い方がまだ全然分かんないや.
sbcl --load Lispファイルでsbcl立ち上げと同時に実行できんのかな.
拡張子faslが, コンパイルされたファイルでいいのか?
情報少くて大変.
簡単な使ってみました的な情報が全然無え. 一般的にどう使ってんのかとかが分からない.

EmacsにSLIMEを導入

まずは, ファイルのダウンロード. 当然, 本家からとってくる.
自分は, tgzのを取ってきた(なんか最近, tgzばっかだなあ. 昔は, zipばっかだったのに).
んで解凍.

$ tar xvzf slime-2.0.tgz

慣れたもんだ.



次に, こいつをEmacsのロードパスの通ったところに置く.
自分の場合, ~/site-lisp/slimeとした.
.emacsへの追記はこんな感じ.

(setq load-path (cons (expand-file-name "~/site-lisp/slime") load-path))

そして, 最低限これだけ書いてやる.

;; Lisp用にSLIMEの設定

;; lisp-mode
;(setq inferior-lisp-program "clisp")    ; clisp用
(setq inferior-lisp-program "sbcl")     ; sbcl用

(require 'slime)
(slime-setup)

あとは, Emacsを再起動して, M-x slimeとする.
すると, .lispファイルのコンパイルっぽいのが始まる(もしかしたら単純にロードしてるだけかも).
それが終了すると, ちょっとかっこいいアニメーションっぽいが出た後, こんなのが起動して使えるようになる.

; SLIME 2006-04-20
CL-USER> (+ 3 7)
10

関数のタブ補完が効いて, すごく使い易い.
REPLってやつらしい.
主なキーバインドは, TABで補完,
C-cC-cでSIGINTを使って, Lispプロセスに割込む(らしい. よく分からない. デバッガ?),
C-cC-oで直前のLisp式の結果をクリア, C-cC-tでバッファをクリアなど.
ここでも参考に〜.
あ, あと終了は, M-x slime-repl-quitみたい.


HyperSpecを引けるようにしたり.
HyperSpecって知らなかったんだけど, どうもCommon Lispの仕様書だかマニュアルだかみたい.
ここから取ってきた. 当然英語. 日本語ないのかなあ・・・.
とりあえず, doc/hyperspecディレクトリに解凍.

$ tar xvzf HyperSpec-7.0.tgz

これで, ~/doc/hyperspecディレクトリに, ディレクトHyperSpec, ファイルHyperSpec-Legalese.text, HyperSpec-README.textができる.
あとは, こいつを読むように設定を書けばいいのかな. ここを参考に記述.

;; HyperSpecを読み込む.
(setq common-lisp-hyperspec-root
      (concat "file://" (expand-file-name "~/doc/hyperspec/HyperSpec/"))
      common-lisp-hyperspec-symbol-table
      (expand-file-name "~/doc/hyperspec/HyperSpec/Data/Map_Sym.txt"))

あとは, M-x hyperspec-lookupで関数とか変数の検索が可能.
このマニュアルは, ブラウザで閲覧することになる.
これを見るのにFirefoxはさすがに使いづらいから, emacs-w3mを使うように設定する.
まずは, 自分のMomongaには, w3mだけで他のものが全然入ってなかったのでそれを片っぱしから入れる.

$ sudo yum install w3mmee-img.i686 w3mmee.i686 w3m-cgi.i686 w3mmee-cgi.i686 w3m-img.i686 w3m-emacs.noarch

入れてるこいつらの詳細がよく分かってなかったりする(^^;)
とりあえず, ここを参考に.emacsを記述.
昔設定したはずだけど起動しなくてちょっと焦った.

;; w3mの設定
(require 'w3m-load)

こいつを書き忘れてたみたい. 前は書かなくても使えたんだけどね. なんでだろう?
そしてやっと本題のHyperSpecw3mで見る, へ.
簡単に検索したら, .emacsへこれを足しゃいいみたい.

;; HyperSpecをw3mで見る
(defadvice common-lisp-hyperspec
  (around hyperspec-lookup-w3m () activate)
  (let* ((window-configuration (current-window-configuration))
         (browse-url-browser-function
          `(lambda (url new-window)
             (w3m-browse-url url nil)
             (let ((hs-map (copy-keymap w3m-mode-map)))
               (define-key hs-map (kbd "q")
                 (lambda ()
                   (interactive)
                   (kill-buffer nil)
                   (set-window-configuration ,window-configuration)))
               (use-local-map hs-map)))))
    ad-do-it))

これでw3mHyperSpecが見れた.



日本語の利用. これも先程のサイトの設定をそのまま適用.

;; 日本語利用のための設定(Lisp 環境側の対応も必要)
(setq slime-net-coding-system 'utf-8-unix)

これで'(a b "日本語")とか書いても大丈夫.


slime-autodoc-modeを設定.

;; カーソル付近にある単語の情報を表示
(slime-autodoc-mode)

REPLなんかで, printとかsetqとか関数の近くにカーソルがあるとき, その関数の取る引数をミニバッファに表示してくれる.



あとは, lisp-modeでマイナーモードslime-modeが起動するようにした.
ちょっと疲れた.
これすごいな. まだやることはある. キーバインドの確認や.
でもこれはメモらない(と思う). M-x help-for-help mとか参考にしたサイトにある情報でなんとか調べる.