2009年12月21日月曜日

[VLC][クリスマス]あと数日ですよ

今年もやはりVLC media playerのアイコンがクリスマス仕様になっている様子。
こういう遊び心のあるソフトウェアは個人的に好感がもてます。

そして多分、今回も年明けまでこのアイコンのままだと予想。

去年のスクリーンショット

2009年12月8日火曜日

今日の無題

対応するプラットフォームの多さ[1]が魅力の一つのnewLISPですが、MaemoというOSベースのインターネットタブレット"N810"に移植した人がいるようです。

(apply newLisp Maemo)

guiserver(Javaで書かれたnewLISPのGUI環境)も稼動するようでリンク先の参考画像はなかなか派手目。CUIの起動画面にも凝っていてちょっとカッコイイです。

[1] Linux, MacOSX, FreeBSD, OpenBSD, NetBSD, Solaris/SunOS, Win32(MinGW) などなど

関連リンク

2009年11月30日月曜日

[Emacs]eldocをほんの少し便利にする

LISPファイルの編集時に関数の引数を表示するマイナーモードとして、Emacsではeldoc-mode、CLではslime-autodoc-modeがあるんですが、両者の表示形式が微妙に異なることが気になったのでついカッとなってeldocの方を軽く改造しました。反省はしていない。

gist: 244937 - GitHub

参考画像を見れば分かると思いますが、ポイント位置の引数の強調方法がデフォル トでは太字ではなくハイライトになってます。

Eldocの表示デモ

その他、関数・変数ともにdocstringの表示が可能です。

ソースコードはGistに置いておくのでinstall-elispからインストールすればCL(SLIME)使いは幸せになれるかもしれません。

(install-elisp-from-gist 244937 "eldoc.el")

動作環境

Emacs22以上で動作確認。

無駄にCLのマクロを使っていますがバイトコンパイルすれば (require 'cl) がない状態でも使えるので安心です。


ここまで書いておいてあれですが、このeldoc.elの改造はミニバッファ表示方法がちょこっと変わった位のものなので特に目新しい機能はありません。

単に表示色を変更したいだけなら本来のeldocのfaceを弄ればそれっぽくなります。

(set-face-background 'eldoc-highlight-function-argument "darkseagreen2")
(set-face-bold-p 'eldoc-highlight-function-argument nil)

2009年11月11日水曜日

[Emacs]そんなことよりeval-after-load使おうぜ

もっと使われてもいいのにと思うEmacsの設定周りのメモ。

[関数] (eval-after-load FILE FORM)

この関数は、指定されたライブラリFILEがロードされているときにのみ2番目の引数FORMを評価するというもの。

例えばmigemoをロードする時の自分の設定はこんな感じ。

;; migemoを読み込む。存在しない場合はnilを返す
(load "migemo" 'noerror)

(eval-after-load "migemo"
 (quote
  (progn
    ;; この辺がmigemoをロードした後に評価される
    (defadvice isearch-mode (before migemo-off activate)
      "初期状態は常にnil"
      (setq migemo-isearch-enable-p nil))
    (fset 'toggle-migemo #'migemo-toggle-isearch-enable)
    (define-key isearch-mode-map (kbd "C-t") 'migemo-isearch-toggle-migemo)
    )))

この関数の利点は

  • ライブラリが存在しない場合はeval-after内のフォームが評価されない。
    つまりエラーにならない。
  • emacsの標準関数である (emacs/lisp/subr.el内で定義)。
    つまり自前で関数を用意しなくて良い。
  • 一度eval-after-loadが評価されれば、後からライブラリが読み込まれてもフォーム内部を評価してくれる。
    これは各種メジャーモードのフックに関数を引っ掛けて、フォームの評価を遅らせるのと同様の手段となる。
    例: (add-hook 'emacs-lisp-mode-hook 'turn-on-eldoc-mode)

逆に不便な点、気にくわない点は

  • 評価できるフォームが1つしか指定できない。
    => (progn ...) を使えば複数フォームを指定できる
  • 関数なので引数が必ず評価される。そのためにフォームをquoteするのが嫌。おまけにシングルクオート '(...) を使うとフォーム内のインデントが崩れる。
    => 代わりに (quote FORM) を使えば長いフォームもそれなりにインデントされる。

この辺は一応マクロを使えば解決するが...なんで関数なんでしょうね、これ。

(defmacro eval-after-load-1 (file &rest args)
 `(eval-after-load ,file
    (quote (progn ,@args))))
(put 'eval-after-load-1 'lisp-indent-function 1)

参考URL

2009年9月12日土曜日

Swank server for newLISP

ひっそりと更新。

以前挑戦した「newLISPをSLIMEから動かす」が、一応お遊び程度に完成したので公開してみます。

http://github.com/kosh04/newlisp-files/tree/master >> swank-newlisp.lsp

簡単なREPLが使えるくらいで、SLIMEの特徴であるシンボル名の補完、定義ファイルへのジャンプなどなど実装されていない残念な出来です。

2009年7月15日水曜日

今朝の無題

Lispは未来に生きている - リリカル☆Lisp開発日記 - http://blog.bugyo.tk/lyrical/2009/02/lisp-15.html

そろそろCLのuniversal-timeがキリ番になりますね。

---

そういえば自分のGitHubのリポジトリをちまちま更新しました。 主に個人用に作っているのでフォローしている人がいるとなんだか申し訳ない気分です。

今のところの更新頻度は emacs-lisp > newlisp-files >> xyzzy-lisp こんな感じです(左に行くほど頻度が高い)。 研究室の端末がDebianなのでEmacsを弄りがちで、xyzzyとの挙動の違いを自作のxyzzy.elで埋めるのが主な目的。

---

それにしてもnewLISPは話題に乗りませんねー。 毎回検索の上位にこのブログが入っているのを見ると嬉しいような悲しいような…

変な愛着が湧いて今でも手探りで調べているnewLISP、もうちょっと他の人が言及してくれてもいいのに。と思うならまず自分からですかね。

2009年7月10日金曜日

TeXのバージョンが円周率に近づいているらしい

ということが「LaTeX2e 美文書作成入門」に書かれていて、なんだかトリビアを覚 えた気分です。
( ・∀・)つ〃∩ヘェーヘェーヘェー

LaTeXで物書きをしている人にとっては常識だったりするんでしょうか、コレ。

以下書籍より引用(ただし手元にあるのは改訂第4版ではなく初版)

...そして,TEX第3.1版(1990年)の時点で次のような終結宣言をしました。

  • もうこれ以上TEXは拡張しない。
  • もし新しい不具合があれば修正して第3.14版,第3.141版,第3.1415版,...と番号を進めていき,自分の死と同時に第π版とする。それ以後はどんな不具合があっても誰も手をつけてはならない。
  • TEXに関することはすべて文書化したので,このノウハウを生かして新たにソフトを作ることは自由である。

2009年7月9日木曜日

[VT100]アスキーアニメーション[AA]

端末エミュレータのエスケープシーケンスを使ったアスキーアニメなんてものがある事を知ったのでちょっと自分でキャプチャしてみました。画像はGIFファイルです。

やり方は簡単で、エスケープシーケンスを含むテキストファイル(*.vt)を端末エミュレータで表示するだけ。ただしファイルの中身は一行づつ、パラパラ漫画のように時間差で表示させる方がいいみたいです(catコマンドを使うとアニメーションを見る余裕なく表示されてしまうので)。

今回はこの時間差表示を実現するためにnewlispをスクリプトとして使っていますが、端末で実行できるならCでも他のスクリプト言語で書いてもたぶんOK。

しかしこのアスキーアニメーション、実際に表示(というより再生)するために 当時の人は何の呪文を使っていたんでしょうかね。

使用したnewlispのソースは以下

ウィンドウのキャプチャ方法

上の画像はスクリーンキャストで保存した連番ファイルを結合してGIFファイルにしたものです。(本当は動画形式でもキャプチャしたんですけどね。GoogleVideoへのアップロードはすでに停止されているし、YouTubeのアカウントは持ってないし、ニコニコ動画だと見れない人もいるし)

スクリーンキャストの方法については以下が参考になります。というよりそのまま使っています。

Linuxでスクリーンキャストを作成するには - SourceForge.JP Magazine http://sourceforge.jp/magazine/07/03/23/0037212

これでウィンドウのキャプチャ画像がいくらかできたのでGIF形式でまとめる

$ convert *.miff -delay 90 出力ファイル.gif

しかしキャプチャ画像だとやたらカクカクしてますね。 なので一度実際に実行してみるか他の人がYouTubeにアップロードしたものを見ることをお勧めします。

これは面白い!

キャプチャ画像ラストはアスキーアニメーションつながりで有名な"sl"コマンドです。 もしかしたらこのslも*.vtファイルで再現できるのかもしれませんね。


参考リンク

2009年7月7日火曜日

今日の無題

このブログ(Blogger)に自作の動画を貼り付けようと思ったらGoogleVideoへのアッ
プロードはすでに停止されていたというオチ。

Official Google Video Blog: Turning Down Uploads at Google Video
- http://googlevideo.blogspot.com/2009/01/turning-down-uploads-at-google-video.html

2009年6月29日月曜日

あれ?

別にそれほど困った話ではないけど、xyzzyのsha-1,emacsのsha1関数を使った ファイルのチェックサムを求める方法がよく分からない。

テストしたファイルは newLISPv10.1(UTF-8_win32)

SHA1(newlisp.dll)= 5ef2a160350fde6312baa2a6fa3d964c308f7faf
SHA1(newlisp.exe)= 561ff028b606c3671393848e279b845c5fdf60c1

で、以下が結果。

# [cygwin]
/cygdrive/c/Program Files/newlisp$ sha1sum.exe newlisp.exe
561ff028b606c3671393848e279b845c5fdf60c1 *newlisp.exe

;; [xyzzy]
(with-open-file (fp "C:/Program Files/newlisp/newlisp.exe")
  (si:sha-1 fp))
;; => "ce3a7fd7fb67ddf2aff136dd1a16b943128b70f5"

;; [emacs]
(require 'sha1)
(with-temp-buffer
  (insert-file-contents "c:/Program Files/newlisp/newlisp.exe")
  (sha1 (buffer-string)))
;; => "5fc949c2297b7d890e086ec1b0293fb3b33f627b"

見事に3つとも別のハッシュ値が返ってきた。

http://www.newlisp.org/downloads/UTF-8_win32/SHA1.txtを見る限りはcygwinのsha1sum.exeの結果が正しいらしい。じゃあxyzzy,emacsの方は何を間違ったんだろうね。

[追記@2009-07-04T17:47:05]

NANRIさんからのコメントより、xyzzyの方は単なるエンコード指定忘れでした。

(with-open-file (fp "C:/Program Files/newlisp/newlisp.exe"
                    :encoding :binary)
  (si:sha-1 fp))
;; => "561ff028b606c3671393848e279b845c5fdf60c1"

残る問題はNTEmacs。 Emacs@ubuntuで上と同様にチェックサムを求めたら正しい値になりました。 sha1.el(sha1-el.el)を見る限り、それなりにファイルサイズが大きいときは外部プログ ラムsha1sumに処理を投げているようだが...

(つづくかも)

2009年6月3日水曜日

[xyzzy]regexp-optを移植

Emacsのregexp-opt.elをxyzzyに移植してみました。

一応Emacs移植キットは使わずに自前で動くようにしてあります。 あまり実用的な出来ではないですが、よかったらどうぞ。

https://github.com/kosh04/xyzzy-lisp/tree -> site-lisp/ -> regexp-opt.l

から入手できます。

regexp-opt.elとは?:

GNU Emacs Lispリファレンスマニュアル: 探索と一致
 -- Function: regexp-opt STRINGS &optional PAREN
    この関数は、文字列STRINGSのいずれかに一致する効率よい正規表現を返
    す。これは、たとえばフォントロック(font-lock)モードなどで、可能
    な限り高速な一致や探索を行う必要がある場合に有用である。

使い方:

regexp-opt.lを$XYZZYHOME/site-lisp/ディレクトリ内に置いてバイトコンパイル。 .xyzzyに(require "regexp-opt")と書いてxyzzyを再起動する。

コード例:

(regexp-opt '("aa" "ab" "ba" "bb"))
;;=> "a[ab]\\|b[ab]"

(regexp-opt '("defun" "lambda"))
;;=> "defun\\|lambda"

(regexp-opt '("defun" "defsubst" "defmacro" "defalias" "defvar" "defconst") t)
;;=> "\\(def\\(?:alias\\|const\\|macro\\|subst\\|un\\|var\\)\\)"
バグ・問題点:
  • Emacsが返す値と違う(というより冗長な)場合がある
    (regexp-opt '("define" "lambda" "fn" "define-macro" "lambda-macro") 'words)
    ;;=> "\\<\\(define\\(?:-macro\\|\\)\\|fn\\|lambda\\(?:-macro\\)?\\)\\>" [xyzzy]
    
    (regexp-opt '("define" "lambda" "fn" "define-macro" "lambda-macro") 'words)
    ;;=> "\\<\\(define\\(?:-macro\\)?\\|fn\\|lambda\\(?:-macro\\)?\\)\\>" [Emacs]
  • 引数の文字列リストが長すぎると、明らかに遅くなる
  • マクロのfsetって大丈夫? (si:*fset 'save-match-data #'ed::protect-match-data)

2009年5月26日火曜日

「10分でコーディング x 2 〜リストの破壊的操作篇〜」を解いてみる

乗り遅れた感はありますが、g00000さん出題のLISP問題を解いてみました。

10分でコーディング x 2 〜リストの破壊的操作篇〜 - わだばLisperになる - cadrグループ

リストの破壊的操作 - 日々ごちゃごちゃと考える 経由

(1) alistを破壊的にplistに変換する関数(nalist-to-plist)を書いて下さい。
(2) nplist-to-alistも作ってみて下さい。

まず自分がやったのは「リストの図を書く」こと。実際は紙の上で考えた。

;; 連想リスト:alist  '((foo . 1) (bar . 2))

   +-+    +-+
-->|1|--->|3|--->nil
   +-+    +-+
    |      |
    V      V
   +-+    +-+
   |2|->1 |4|->2
   +-+    +-+
    |      |
    V      V
   foo    bar

;; プロパティリスト:plist  '(foo 1 bar 2)

   +-+   +-+   +-+   +-+
-->|1|-->|2|-->|3|-->|4|-->nil
   +-+   +-+   +-+   +-+
    |     |     |     |
    V     V     V     V
   foo    1    bar    2

なるほど、確かにコンスセル数が同じだ。

で、このコンスセルを増やすことなくリスト操作を行うんだから →各コンスセルのcar/cdrの向きを操作すれば良さそうだ →じゃあrplaca/rplacdを使おう →出来上がり

...と書けば短いのに、それに気づくのに結構時間がかかった上、解答後に他の 人のコードを見てようやくrotatef/setfの存在に気づいたのはナイショです。

所要時間:(1)1時間(2)50分

しかも効率優先のための破壊的操作なのに無駄に再帰を使ったのもマイナスポイント。

CLの無い端末で作業をしていたのでEmacsLispでコーディング。 自宅のubuntu+SBCL 1.0.18+SLIMEでも動作確認しました。今回xyzzy使わなかったな...

2009年5月21日木曜日

「なぜJAVAなのか」と聞かれたら

細かい経緯は面倒なんで省略しますが、自分が大学内でLISPの話題をした際に 「なんでJAVAでLISPを動かす必要があるの?」 と質問されました。

特にこれはLISPに限った話ではなく、「なぜ他の言語をJAVAで実装する必要があるのか」 ということになりそうです。実際、JAVAで実装されたプログラミング言語は多々あります。

  • JRuby(ruby)
  • Rhino(javascript)
  • Jython(python)
  • Kawa(scheme)
  • ABCL(common-lisp)
  • JBasic(basic)

などなど...

で、「なぜJAVAなのか」と聞かれたら「便利だから」と答えたら身も蓋もないし… もうちょっと無い脳みそ振り絞って「何が便利なのか」を考えてみると、

  • 特定のプラットフォームに依存しなくなる
  • JAVAとLISPのコード間で双方アクセスが可能になる
  • 総じてLISPコード資産をJAVAで使える

こんなところでしょうか。("LISP"は各自他のプログラミング言語に置き換えてください)

他にもあると思いますが、自分がパッと思いつくのはこれくらいです。

2009年5月20日水曜日

DICT:2628

ubuntuのgnome-dictionaryが簡易辞書として便利なので紹介。

ほとんどのリソースは外国語なので英英辞書くらいにはなるかなと思っていたら、日本語用の辞書サーバを提供しているところもあるので漢字の読みを調べることも出来そうです。

# もちろん細かく調べるときは手持ちの電子辞書か英辞郎に頼むんですが

Web用のインターフェースもあるのでクライアントをインストールする前に試用してみるのも良いかもしれません。

ちなみに日本語辞書用の辞書サーバなのに、そのサーバはフランスにあるみたい。

2009年5月8日金曜日

今日の無題

ブログの更新遅れも甚だしい今日この頃ですが 、ここにはあんまり技術的でな いどーでもいいことを書くのは自分の性格上ためらってしまうのです。 (どちらかといえば口下手か、単に面倒臭がりなだけなんだと思いますがね)

さすがに Lisp ばかりに手をつけるわけにもいかないので、 とりあえず今はオブジェクト指向の理解のために Java の勉強中。

その他書きたいことがあったような気がしたけど、毎度の事で頭の中でとろけ てしまったみたいなので、今日はこの辺で。
# だめだこの性格…

$ echo *** > /dev/null

2009年4月19日日曜日

GitHubアカウントをとりました

いくつかファイルを置いておいたので、よかったらどうぞ。

GitHubアカウント - github.com/kosh04

  • xyzzy/
    • etc/
      • newLISP - newlisp-mode用キーワードファイル
    • site-lisp/
      • cl.l - xyzzyにないCL関数の移植のようなもの
      • corman_search.l - CLのsearch関数移植
      • cygwin.l - 主にmanコマンドを利用するため
      • newlisp.l - newLISP編集用メジャーモード
      • redef.l - xyzzy組み込み関数を再定義したもの
      • util.l - 自作関数など
  • emacs-lisp/
    • xyzzy.el - xyzzy/CommonLisp/SLIMEの便利そうな関数を色々移植したもの
  • newlisp-files/
    • init.lsp - CLっぽい関数とか
    • newlisp.el - newLISP編集用メジャーモード

真面目にファイルの配布するならライセンスやマニュアルも考えるべきなんだろ うけど、今日はとりあえずここまで。gitに慣れるのに手間取って疲れた…

[追記]

GitHubのwebページがUTF-8らしいので、それに伴いファイルの文字コードも一部 UTF-8になっています。で、xyzzyだとファイルのコンパイル・ロード用の関数が デフォルトではShift_JISしか対応しないようなので、compile-file/loadの代わ りにmc-compile-file/mc-load-file関数などを使って明示的に文字コードを指定 してくだしあ。

後でREADMEくらいは作ろう。

[追記 (2009-12-08)]

ブラウザの文字化けよりもライブラリを実際に使う時の利便を考慮して、元のsjisに戻しました。

今日の無題

2009年4月16日木曜日

参考にならないmanコマンドの文字化けについてのメモ

配属先研究室の端末Emacsのマニュアルコマンドの文字化けが気持ち悪い
ので、文字コードにはあまり知識がないけど、ない脳みそこねこね考えて
みる。あれはDebianだっかかな。

manプロセス側でなく、なるべくEmacs側で処理出来るようにするのが目的です。

---

うちのubuntu環境の文字コードは標準でUTF-8

(getenv "LANG")                         ; "ja_JP.UTF-8"
default-process-coding-system           ; (mule-utf-8 . mule-utf-8)
locale-coding-system                    ; utf-8


(1) manプロセスが処理した文字列をそのまま表示すると(つまりエスケー
    プシーケンス処理しない)と、こんな感じ。

(shell-command "man man") または
M-x: shell-command[RET] man

---

MAN(1)                        Manual pager utils                        MAN(1)


\345\220名\345\211前
       man - オンラインリファレンスマニュアルのインターフェース

\346\233書\345\274式
       man  [-c|-w|-tZT  device]  [-adhu7V]  [-m system[,...]] [-L locale] [-p
       string] [-M path] [-P pager]  [-r  prompt]  [-S  list]  [-e  extension]
       [[section] page ...] ...
       man -l [-7] [-tZT device] [-p string] [-P pager] [-r prompt] file ...
       man -k [apropos options] regexp ...
       man -f [whatis options] page ...

---

(2) 一方、Emacsのmanコマンドを介すると、こんな感じ。
    文字化け悪化

(man "man") または
M-x: man[RET] man

---

MAN(1)                                Manual pager utils                                MAN(1)

\345\220\345\220\215-\345\211\345\211\215-
       man - \343\202�\203潟\203�\202ゃ\203潟\203�\203\225\343\202<\203�\203潟\202鴻\203\236\343\203\213\343\203ャ\202≪\203�\201�\202ゃ\203潟\203帥\203若\203\225\343\202с\203若\202\271

\346\233\346\233後弱\274\217
       man  [-c|-w|-tZT  device] [-adhu7V] [-m system[,...]] [-L locale] [-p string] [-M path]
       [-P pager] [-r prompt] [-S list] [-e extension] [[section] page ...] ...
       man -l [-7] [-tZT device] [-p string] [-P pager] [-r prompt] file ...
       man -k [apropos options] regexp ...
       man -f [whatis options] page ...

---

ここでEmacsの文字のエンコード、デコード関数を使ってみる。
伝統的なLinuxならば文字コードはeuc-jpだろう。

(encode-coding-string "書式" 'euc-jp)   ; "\275\361\274\260"
(encode-coding-string "書式" 'utf-8)    ; "\346\233\270\345\274\217"


UTF-8エンコードした文字列の方が(1)の"書式"の文字付近のものと一致し
ている気がする。

---

自分の仮定が正しければマニュアル自体はUTF-8で通っていると思う。

問題なのは、

Emacsはmanプロセスと通信してバッファにその文字列をUTF-8で流してい
る。が、その文字列にはエスケープシーケンスも含まれていて、【本来日本
語文字になるはずのバイト列とマニュアル整形のためのエスケープシーケ
ンスが運悪く被ってしまっているのではないか?】

だから、Emacsのman関数側が処理の時にバイト列を解釈できずに文字化け
するのかもしれない。

自信ないがここまで書いた。一旦寝て後で考え直そう。

またEmacs改悪の悪い癖がでてきたなあ…

2009年4月7日火曜日

ubuntu インストール

windows と併用している linux を vine4.2 から ubuntu-ja-8.10 に変えてみた。

  • linux のインストールは何度かやったことがあるのでパーティション操作などは特に 苦労なし。ubuntu(と言うより GUI)楽だなあ。 以前に入れたもといえば opensuse,fedora,vine (LiveCD も含めれば slax,knoppix) …ディスクへのインストールは4度目か。苦労はしなくなったが上達した気がしないなあ。
  • インストールは windows とのデュアルブート。 windows 領域に ubuntu をインストールすることも可能なのだが、 以前に knoppix でそれを試した時は、あまり操作感がよろしくなかった印象だったので。マシンスペック が貧弱でなかったら仮想化なんかも出来そうなものだが...

  • SLIME の設定楽。 asdf も ubuntu の標準インストールで出来るみたい。まだ入れてない。 デフォルトでは sbcl がインストールされる。これは入れた。

  • バックアップをとったつもりがドットファイル(.bashrc とか)がなくなってた事に気づい て凹んだ。

  • emacs 周りはやっぱり面倒。 .emacs の微妙な違いとか、ライブラリとか。 こういう時にバージョン管理システムが役に立つのだろうかね。

  • root パスワードが分からなくて焦った。 (ubuntu では管理者権限の必要なコマンドは sudo が標準)

  • anthy(日本語入力)の以降もすべきだったかも。 そこまで使い込んでいないけど。

  • firefox の flash-plugin が adobe 純正のものでなかったので差し替え。 swfdec-mozzila -> adobe-flashplugin 単にインストールするだけだと swfdec が優先されるらしいので、これは削除する。

  • いつぞや作った Linux From Scratch がインストール時のパーティション操作のおかげで 起動できなくなった。後で直そう (-> /boot/grub/menu.lst)

このメモを次回につなげよう。 でも次回っていつだろうか?

2009年4月6日月曜日

[Gmail]既読ボタンを有効にする

Google Japan Blog: Gmail Labs が日本語に対応しました

らしい。ちょっと見てみると「既読ボタン」なんてものがあったので早速導入。 これは重宝しそうな予感。

Gmail -> 設定 -> Labs -> 既読ボタンの項目を有効にする

あと「酒気帯びテスト」ってこれか。

Google、「真夜中のラブレター」を防ぐ「Mail Goggles」 - ITmedia News 実験サービス「Gmail Labs」が日本語化 送信取り消しや「酒気帯びテスト」も - ITmedia News

[Emacs] シンボルから info を呼び出す

指定したシンボルに対応した Info を表示するには `info-lookup-symbol' を使えばいいのか。なるほど。

Elisp 用の Info は標準で入っているので、とりあえず C ライブラリのだけでも入れて おくことにする。以下、その手順。

  1. libc の info を持ってくる
    http://www.gnu.org/software/libc/manual/
    http://www.gnu.org/software/libc/manual/info/libc-info.tar.gz
  2. 適当なディレクトリに解凍する
    $ mkdir -p ~/info/libc
    $ tar xzvf libc-info.tar.gz.tar -C ~/info/libc
  3. .emacs に追加
    (require 'info)
    (add-to-list 'Info-additional-directory-list "~/info/libc/")
    ;; 標準では C-h S, <f1> S または M-x help S
    (global-set-key "\C-ch" 'info-lookup-symbol)
  4. Info-directory-list のディレクトリ内にあるファイル dir に以下の一行追加
    * libc: (libc).         The GNU C Library
  5. 各モードで info-lookup-symbol を呼び出して ウマー (゜Д゜)
    # c-mode では初回関数呼び出し時に明示的にモードを指定する必要あり

特に c-mode と libc-info の関連付けを指定してないけど、 Emacs 側で勝手にマー ジしてくれるらしくこのままで使えるみたい。

でも、もっと多機能なものが既にあるからこのメモはあんまり当てにならないかもね。

2009年4月3日金曜日

[LISP]マクロのエイリアス

マクロ名の定義にも setf が使えるらしいことに気づいたのでメモ。 ついでに xyzzy だと macro-function に setf 出来ないので定義しておく。 たぶん間違ってるけど。 # xyzzy, CLISP-2.44 で確認
#+xyzzy (defsetf macro-function si:*fset)

(progn
  (setf (macro-function 'if-progn)
        (macro-function 'when))
  (list (if-progn t "てー")
        (if-progn nil "てー")))
;=> ("てー" NIL)

(progn
  (setf (macro-function '&&)
        (macro-function 'and))
  (list (&& t "てー")
        (&& nil "てー")))
;=> ("てー" NIL)

(progn
  (setf (macro-function 'mvbind)
        (macro-function 'multiple-value-bind))
  (mvbind (a b c)
      (values 1 2 3)
    (list a b c)))
;=> (1 2 3)
; #+xyzzy だと (macro-function 'multiple-value-bind) => nil となりエラー

(progn
  (setf (macro-function 'defconst)
        (macro-function 'defconstant))
  (defconst e (exp 1))
  (list e (multiple-value-list
           (ignore-errors (let ((e pi)) e)))))
;=> (2.7182817 (NIL #<SYSTEM::SIMPLE-SOURCE-PROGRAM-ERROR #x19EE7919>))

(progn
  (setf (macro-function '++)
        (macro-function 'incf))
  (let ((n 1))
    (list n (++ n) (++ n))))
;=> (1 2 3)

(progn
  (setf (macro-function 'fn)
        (macro-function 'lambda))
  (remove-if (fn (x) (zerop (mod x 3)))
             '(0 1 2 3 4 5 6 7 8 9)))
;-> *** - FUNCTION: (FN (X) (ZEROP (MOD X 3))) is not a function name; try using a symbol instead
; #+GCL ではエラーにならずに (1 2 4 5 7 8) を返す。…なんでだ?

2009年3月27日金曜日

今日のバカ

なんというか、物凄くくだらない事に真剣になってしまったので ここに断片だけ残して、後で振り返って一人で悶絶しようと思う。

# LISP と全く関係ないですよ。

---
ABABABAABABA
BAAABAAA↓→→A→
←←AA←BAA↓B↓
↑↑↑BBA

ABABABAABABA
→←AAAABABBABB↓B
↑BBBBAAAABBBA↑B
↓BBABB→←BBA

A

(global-set-key #\S-Right (lambda () (interactive) (insert "→")))
(global-set-key #\S-Left (lambda () (interactive) (insert "←")))
(global-set-key #\S-Up (lambda () (interactive) (insert "↑")))
(global-set-key #\S-Down (lambda () (interactive) (insert "↓")))

2009年3月24日火曜日

[Elisp] font-lock の勉強中

newLISP を Emacs から弄るなら、関数・シンボルなどのキーワードの色付けは 必須項目な訳で、しぶしぶ Google 先生と $EMACS/lisp 内のファイル群を頼り に font-lock について調べています。

xyzzy ならキーワードファイルに単語を放り込んでハッシュで勝手に色分けして くれるのが楽チンだったんだが…

それはよしとして、Elispの色付けといえばこれが便利。

Lisp 関数だけに色付け http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=font-lock-func

で、紹介されている Elisp のソースをよく見たら、関数定義などは内部で呼び 出している関数が一部違うだけで重複している部分が結構あることに最近気づき ました。

「これはマクロの出番だ」と思い立って書き直してみたら、見事に(?)行数 1/2 ほどのカットに成功したようです。

http://gist.github.com/83749

[2009-04-12T18:44:56+09:00] typo に気づいたので修正

http://gist.github.com/93934

動作に変化はありませんが、プログラムの可読性が少しだけ上がった気がするの でここに残しておきます。

2009年3月22日日曜日

今日の無題

何気なく Windows Update で新しいフォントを入れたら見事にやられた

Windows XP および Windows Server 2003 向けJIS2004 対応 MS ゴシック & MS 明朝フォントパッケージについて
http://www.microsoft.com/japan/windows/products/windowsvista/jp_font/jis04/default.mspx

ぼんやりしていても気づくほどフォントに違和感がありすぎる… しかも主に騒がれていたのは2007年。2年前の問題に反応する自分も自分だなあ。 ということでアンインストールさせていただきます

2009年3月18日水曜日

今日の無題

haloscanどうした?

HaloScan.comのページが文字化けするなと思って HTML ソースを眺めていたら、ヘッダ部分が

<meta equiv="Content-Type" content="text/html; charset=iso-8859-1">

となっているんだが、UTF-8 が使えなくなったのだろうか。 以前は設定に "Character Encoding" なる項目があったはずなのにいつの間にかそれもなくなってるし。

最近買った本

  • 入門UNIXシェルプログラミング第2版 --- Bruce Blinn / 山下哲典 (訳)
  • 就活のバカヤロー --- 石渡嶺司 / 大沢仁
  • ふたつのスピカ (12-14) --- 柳沼行

2009年3月11日水曜日

本家にばれてた

以前書いたEmacs用のnewlisp-modeが本家様に気づかれたようです。さすがマイナー言語。

http://www.newlisp.org/code/newlisp.el

というかこれならシンボル補完とか色付けとかもっと頑張ればよかった。 最近newLISP弄るのはもっぱらxyzzyからだしなあ。

SLIME+newLISPを完成させるか。。。

Slimy hackathon #1 に参加してきた

g000001さん発案のSlimy Hackathonにちょこっとだけ参加してきました。
ハッカソンとはいえ連絡手段はLingrとSkypeだったので、ほとんど部屋に篭りきり生活でしたが(笑)

自分が行おうとしたタスクは2つ。

#### SLIME⇔Elispのコマンド対応

Common LispもEmacs Lispも元はMACLISPが祖先らしいから、CLの便利関数はきっとelispにもあるに違いないと考えたが始まり。CLのといいますか、SLIMEのコマンドですが。

で、出来たのがこれ → http://gist.github.com/75589

もう少しSLIMEに達者になっていればslime-who-callsとかslime-list-callersに対応するelispも探せたんじゃないかなと反省してます。とりあえずelisp-macroexpand-1は作ってみて結構便利なんじゃないかしら。

やっぱりelispだってLISP-2だしマクロ使えるしリスト遊びはできるし、LISPを学ぶには悪くないと思うなあ(あんまり深い再帰だと怒られるのが面倒だけど)。

#### newLISPをSLIMEから動かす

newLISPはどちらかといえばSchemeよりのLISPなんですが、swank-mit-scheme.scmなどScheme専用のswankサーバもあるらしい。「それならnewLISPでもswankサーバが建てられるんじゃね?」と思い立って基礎知識0から調べたらやっぱり完成はしませんでしたorz さすがに2日間はきつかった…

とはいえここで言い訳するのもアレですし、手ごたえが皆無というわけではなかったので、せめてnewLISPとSLIMEで通信が出来るくらいには完成させようかなと思います。出来るかな。


自分はこんな感じで、非常にまったりと参加させてもらったSlimy hackathonでしたが、結構楽しくやらせてもらいました。
あとSkypeではゆんゆん電波を飛ばしていた気がします。すいませんでした。

2009年3月3日火曜日

今日の無題

読書感想文#2

Shibuya.lisp テクニカルトーク #2」が無事に開催されたようです。

自分はニコニコ動画から見させてもらいました。 →http://www.nicovideo.jp/mylist/11305224

個人的には処理系/性能について語るのもいいけど、それから何か作ってみた系 の発表が面白かったかな。やはり動くものは見ていて楽しい。

特に印象に残ったTOP3

  • okuoku氏: SchemeでBluetoothスタックを書く Scheme(mosh)で外部プロトコルの処理をしようとする試み。 Wiiリモコンと通信するデモに思わず感嘆の声。 FFI(Foreign Function Interface)とは違うんだろう、たぶん。

  • 和田英一氏: 私がLispでプログラムを書く理由 楽しいから←結論 本当に楽しそうに話すなあ。 ダメ学生の自分はPostscriptプログラム紹介の後半少しだれてしまいました、ごめんなさい。

  • 林拓人/takuto_h: Cyanの現状と、これから 高校生が作った実験的言語Cyan(サイアン)の紹介。 「言語は本来、プログラムを書くためのもの。しかし、私は言語処理系しか書けない。」 彼に限らないが、子供の頃からプログラミングに慣れ親しむ環境があるってうらやましいなー。

一通り動画を見終わって改めてタイムテーブルを見ると、CLの発表者は少なかったんですね。(2人?)

残念ながら中継/動画配信されなかった数理システムの黒田氏の発表も、他の 「TT#2参加したよブログ」を見る限りかなりパンチのあるものだったらしい。 自分のような似非CLerがそれを聴いたら、きっとその場で畏縮してしまうんだろうなあ。。

ともあれ、動画を見てLISPに対するモチベーションが上がった気がしますね。

発表者の皆さんも運営の方々もお疲れ様でした。

2009年2月27日金曜日

newLISPの特徴、軽くまとめ

去年から少しずつ弄っていたnewLISPですが、 人様に見せるようなものは出来なかったのでとりあえず使ってみて分かったことだけでも書いておきます。 これからnewLISPを使ってみようかと思っている人の参考にでもなれば、と。

リンク

マニュアル・リファレンス

  • newLisp (newLISPのメモリ管理方法(ORO)についての翻訳)

サンプル・ライブラリ

日本語の情報源

今のところほとんど見つかりませんが...

特徴

  • 開発はC言語 (GUI部分はJava)
  • ライセンスはGPLv3
  • 主にスクリプト言語として利用する
    newLISP is a Lisp-like, general-purpose scripting language.
  • newLISP-GS: JavaベースのGUIライブラリが付属
    付属のエディタはこのGUI-Serverを呼び出している
  • プラットフォームは Windows *BSD Linux Solaris OSX …とにかくたくさん。
    Linux/Tru64 UNIX/*BSD/Mac OSX/SunOS/Solaris/AIX/Win32(MinGW)/OS2
  • 64ビット対応
  • IPv4とIPv6の切り替えが可能 (開発中)
  • 実行ファイルは200kバイトくらいとかなり小さい
  • 単体の実行ファイルが作れる - newlisp.exeとソースを結合する方法
  • HTTP/CGIサーバ専用モード - HTTP-only server mode

ライブラリ

とりあえず確認したライブラリ ※当方使ったことないです。OpenGLは面白いかも。
C-Libraries, Modules
  • MySQL SQLite GTK-server OpenGL freeGLUT GNU-GMP OpenSSL zlib FTP Postscript POP3 SMTP

言語の特徴

  • newLISP と CL/Scheme の比較を参照 (訳してみたもの)
  • ラムダ式はリストと同様に扱える。
  • 動的スコープ / 動的束縛
    この辺はEmacsLispに似ている。
  • ドット対が存在しない。
  • 関数の引数は足りなくても余分にあってもよい。足りない引数はnilに束縛される。
    これはnewLISP特有のものではなく、Interlispの特徴でもある。
    Lispの進化 957行目参照
    ((lambda (x y z) (list x y z)) 0 1 2 3 4 5) => (0 1 2)
  • Implicit indexing (暗黙のインデックス機能)
    リストや文字列などのシーケンスにアクセスする機能。
    ("newLISP" 0) => "n"
  • 関数の引数は基本的に値のコピーが渡される
    バージョン10 から一部破壊的な関数に置き換わっている
    マクロも引数を評価しない点では参照渡しとほぼ同等。
  • コンテキスト
    LISP-1(関数と変数の名前空間が共有)であるnewLISPに複数の名前空間を提供する機能
    CommonLispのパッケージの概念と似ているかもしれない
    これを使えばマクロ定義においての外部からの変数束縛を避けることが出来る。
    ハッシュの代用にもなる。
  • 共有ライブラリの呼び出しが可能
    (import "printf" "libc.so.6")
    (printf "%s World" "HELLO")  ;=> "HELLO World"
  • Perl互換正規表現 (PCRE: Perl-Compatible Regular Expressions)
  • Unicode対応 (UTF-8)
  • XMLサポート
  • ネットワークAPI多数 (TCP, UDP)
  • Prolog風パターンマッチ関数が利用できる
    (match '(* 2 ? 4) '(0 1 2 3 4)) ;=> ((0 1) 3)
    (unify '(p X Y a) '(p Y X X)) ;=> ((Y a) (X a))
  • 組み込み関数は350個くらい。
  • 以下は全て同じ文字列を表す。バックスラッシュが少し見やすくなるかも。
    • "C:\\home\\lxuser\\newlisp"
    • {C:\home\lxuser\newlisp}
    • [text]C:\home\lxuser\newlisp[/text]

主に不満な点

  • http://lisperblog.blogspot.com/2008/11/blog-post_18.html
  • 関数名に予約されていて変数に使えない名前がある。これはたまにイラッとくる。 例: fn sym name args
  • エラーが貧弱。(デバッガはあるらしいが)
  • 「リスト遊び」がしにくい。(ドット対がないためconsがほぼlistと同じ)
  • マクロが書きにくい。(名前空間共有、`,@がない、macroexpandがない)
  • シーケンスを扱う関数全てがunicode対応というわけではない。
  • (= nil '()) => nil
  • lambdaの代わりにfnが使えるとか、condのように複数条件分岐が使えるifとか、("foo" 0) => "f"とか、arcの機能がちらほら。歴史的に考えてnewLISPの方が先なんだろうけど。

ChangeLog

  • 2009/02/27 - 初版
  • 2011/02/22 - 内容の整理整頓
  • 2011/09/13 - Twitterのリンクを追加

2009年2月25日水曜日

[xyzzy]check-parens

(defun check-parens ()
  "バッファの括弧の釣り合いを調べる."
  (interactive)
  (handler-case
      (let ((home (point)))
        (goto-char (point-min))
        (while (forward-list))
        (goto-char home)
        (message "だいたいあってる")
        t)
    (simple-error (c)
      (message "このへん間違ってるかも")
      (ding)
      nil)))
(compile 'check-parens)
使い方 lisp-mode、lisp-interaction-modeで M-x: check-parens

これをもうちょっと弄ってbefore-save-buffer-hookとかに引っ掛ければ便利そう。

とか思いつつも最近は括弧の閉じ忘れをすることがなくなったので、ほとんど使って いない状況です。

元ネタ: http://calypso.tux.org/pipermail/xemacs-beta/2009-January/015729.html

2009年2月24日火曜日

[Emacs]tabba.elのせいだったのか

tabbar-modeを使うと基本的に「M-x b」等は通常操作と同じ一つ前に開いたバッファにもどります。ただ、kill-bufferしたときだけグループ化された前のファイルに戻ります。

Elisp/タブでバッファを切り替える

どうりでkill-bufferしたとき元のバッファに戻らないわけだ。。 パッチも紹介されているが、どうやらフック関数のコメントアウトだけなのでelispで修正できる範囲のよう。

(remove-hook 'kill-buffer-hook 'tabbar-buffer-kill-buffer-hook)

直った直った。すっきりした。

ちなみにtabbar.elの設定

(require 'tabbar)
(tabbar-mode (if window-system 1 -1))
(remove-hook 'kill-buffer-hook 'tabbar-buffer-kill-buffer-hook)
(when tabbar-mode
  (global-set-key [?\C-x ?\C-.] 'tabbar-forward)
  (global-set-key [?\C-x ?\C-,] 'tabbar-backward))

2009年2月22日日曜日

今日の無題

  • ブログトップが真っ白なんですが… --- この記事更新したら直った。なんだったんだろう?

xyzzyのべんりすぷ(汎用編)

もともとこのブログを作った趣旨が「xyzzyでこんな関数作ったよ、見てね」 のつもりだったのに、最近まですっかり忘れていたような気がする今日この頃です。

Xyzzy Wikiに投稿するのもありなんですが、あまりに雑多すぎて分類に困りそうなのでブログの方にしました。(気が小さいなんて言えないです…)

普段使っている関数群なので、そこそこ枯れていると思います。
http://paste.lisp.org/display/75922

以下軽く解説

keyboard-quit
ほとんどquitと同じですが、マークがクリアされます。
kill-region(C-w)のうっかりタイプを防ぐ効果があります。(それでもたまに誤爆しますが)
リージョンを反転表示するrv-regionとの併用がおすすめ。
;; 載せるの忘れてた…
(global-set-key #\C-g 'keyboard-quit)
;; [ツール]->[共通設定]->[マーク行の行番号を反転]にチェック
(setq *inverse-mark-line* t)
shell-goto-bol
shell-modeにて、(point)がプロンプト文字($とか>とか#とか)より右側にあるなら そこまでバック、それ以外は普通の(goto-bol)を呼び出します。
comit-delchar-or-maybe-eof
同じくshell-modeにて、(point)がバッファの末尾ならプロセスをkillします。
current-word
Google検索など、interactiveで文字列を受け取る関数に使えます。
(defun google (str)
  (interactive "sGoogle: " :default0 (current-word t))
  (long-operation
    (shell-execute (concat "http://www.google.com/search?q="
                           (si:www-url-encode (map-internal-to-utf-8 str)))
                   t)))
no-filenames-error
*scratch*バッファでC-x C-sとタイプしてしまったイライラを軽減します。
保存はC-x C-wでいいよね。
(define-key ctl-x-map #\C-w 'emacs-write-file)
add-menu-revert
xyzzy Part7 >>804 より、文字コードを指定してバッファを開き直す項目をコンテキストメニューに追加します。 revert-bufferのGUI版みたいなものです。 ファイル名を持たないバッファだとエラーになるけど、まあいいかな。
backward-delete-word
主にミニバッファでディレクトリをひとつ上にするときに使います。
もっと豪華なものが欲しいですか?

今回はここまで。もう少し続きます。

2009年2月21日土曜日

今日の無題

地方県民はUSTREAMで我慢すればいいや、と思っていた結果がこれですか。。。ぐはぁ(泣)
今回の発表のUSTREAMでの中継/動画アップロードにつきまして 前回のTT#1では、発表者全員より撮影許可を頂けましたので、内容全編を中継/アップロード致しましたが、今回は、すべての発表者の方に撮影承諾を頂けておりませんので、一部内容の中継/アップロードができません。 Shibuya.lisp TT#2 ライトニングトークの発表内容決定!

2009年2月17日火曜日

progvの途中

(let ((buffer-read-only nil))
  (declare (special buffer-read-only))
  (hogehoge))

Emacsのような動的束縛を使うなら上のように書くのがたぶん一般的なんだろうけど、動的束縛といえばprogvなんてものがあることに気づいたので以前自分で書いたものを引っ張ってきてみた。

(defmacro progv (symbols values &body body)
  (let ((label (gensym "progv-form"))
        (var (eval symbols))
        (val (eval values)))
    `(labels ((,label () ,@body))
       ((lambda (,@var)
          (declare (special ,@var))
          (funcall (function ,label)))
        ,@val))))

body部を変数束縛の外で実行する点では間違っていないと思う(たぶん)。 で、実行してみたところトップレベルではうまく動いているよう。

(defun hoge ()
  (let ((*x* 3))
    (progv '(*x*) '(4)
           (list *x* (symbol-value '*x*)))))
(hoge)
;=> (3 4)

ただしprogvを含む関数をコンパイルすると駄目になった。中を覗いてみると、

(si:closure-body (compile 'hoge))
=>
;; *制御文字の置き換えあり*
(lambda ()
  (system:*byte-code "^B^A^@廚^]^T^A^@^[^@Q^\^A
^A^\^A廛^U^B"
                     #(*x*
                       (lambda ()
                         (system:*byte-code "^@^B^@^E^@^A^@・・"
                                            #(*x*)))
                       (lambda #1=(*x*)
                         (declare (special . #1#))
                         (funcall #'#:progv-form350)))))

labelsの展開がうまくいってないらしく、内部関数名"#:progv-form350"が残っている。 ここまで辿ったけどコンパイルの動作がサッパリなのでここでお手上げ。

labels使わないでprogv実装しろってことかなあ。

2009年2月14日土曜日

今日の無題

あの時の話、聞かせてください!:第1回 電波少年の“なすび”に会いたい! - R25.jp

なんと懐かしい…見ていたのは小・中学時代だったかな。

当たった懸賞の品に一喜一憂する姿とか、「当選の舞」とか、ぼさぼさ頭にチョ ンマゲ姿とか、ポスターか何かを見て下部のなすマークが大きくなったり(!?)と か、とにかく見ていて面白かった。日曜日の深夜が楽しみだったよ。

現在のインタビュー時の写真を見て「変わんないなー」とにんまり。 当時の電波少年のホームページ(あったんだ)を読みふけって、懐かしさのあまり もう一度にんまりしてしまった。

なすびさんも元気そうで何よりですね。 この人のポジティブ思考は見習うべきかも。

電波少年的懸賞生活 - 日本テレビ

[xyzzy]autoloadされたモジュールの一覧

xyzzyではロードされたモジュールの一覧はmodulesで参照できるわけですが、 autoload関数で指定された関数は呼び出されるまでロードされません。 そういうモジュール一覧を参照出来ないかと思ってこんなものを作りました。 利用する箇所が見当たらないので、ネタということで。

http://paste.lisp.org/display/75440

まあ、autoload-function-pを弄っただけなんですが。 find-all-symbolsを使っているのでコンパイルしないと重いです。

ところで"hh-call"って何なんでしょう?$XYZZY/lispディレクトリ内には見つか らないし、検索してみても答えは出ず。。。HTML-Helpをcallするとか?

2009年2月10日火曜日

[xyzzy]HexlのPatch

勉強不足以上に実践不足が否めないと思う今日この頃。 テストが終わった(笑)のでちまちまとアウトプットをしていこうと思います。

まあ、たいしたものではないですが。

Hexl@xyzzyのpatch

NANRIさん配布のHexlに対するpatchです。今更な気がするのでひっそりと。 →http://xyzzy.s53.xrea.com/wiki/index.php?patch%2Fpatch%2Fhexl.l 先生、"patch/patch/hexl.l"ってなんですか…

;; Hexlにあると便利そうなおまけ
(defun hexl-coloring-hook ()
  "hexl-modeの表示に色を付ける."
  (make-local-variable 'regexp-keyword-list)
  (setq regexp-keyword-list (compile-regexp-keyword-list
                             '(("^\\w\\{8\\}:" nil 2)
                               ("  .+$" nil :comment)))))
(add-hook 'hexl-mode-hook 'hexl-coloring-hook)
;; バイナリファイルは自動的にhexl-mode
(pushnew '("\\.exe$" . hexl-mode) *auto-mode-alist* :test 'equal)

xyzzylispだけでhexl-modeを再現は一度挑戦して挫折したなあ。

Hexlのように"ADDRESS: BYTE TEXT"の形式でバッファ表示させようとしたけど、関数のコンパイルをしても1Mのファイル読み込みに10秒かかったところでアウト。バイト単位の読み込みはまずかったのかもしれない。でも実践CLにもMP3のID3パーサが紹介されているくらいだからlispでバイナリファイルを扱うのは無茶ではないんだと思う。

もしかしてMP3ファイルのヘッダ部分だけ読み込んでいるのかもしれないが


2009-02-11T18:15:41+09:00追記

NANRIさんからのコメントで、Yamamoto Shinjiさんが移植されたhexl.lがあるこ とを教えてもらいました。ありがとうございます。

ファイルのヘッダ部分を見ると、移植元のhexl.elのコードは1994年らしいです。

;; Copyright (C) 1989, 1994 Free Software Foundation, Inc.

一方、NANRIさん移植のhexl.lは2001年もの。

;; Copyright (C) 1989, 1994, 1998, 2001 Free Software Foundation, Inc.

さすがにこれだけ移植元の年数が違うと、hexl.elのコード自体もそれなりに変 更が加えられているみたいでした。

また、Yamamotoさんのhexl.lを試したのですがhexl-beginning-of-line (Control-a)の挙動がおかしいらしく、テキスト部のカーソル(reverse-region)が 追いつかないバグが残っているようです。

(setq hexl-exec-directory "C:/usr/local/emacs-22.3/bin/")
(require "hexl")

そんなわけで、コメントをいただいて恐縮ですがしばらくは使い慣れたHexlを弄ろうかと思います。

2009年1月28日水曜日

[CL] 0から1000までに含まれる0をカウントする

http://d.hatena.ne.jp/rubikitch/20081120 より

(count #\0 (format nil "~{~D~}" (loop :for i :from 0 :to 1000 :collect i)))
;=> 193

Commom Lisp は文字列を弄ることが出来るから面白い。

今日の無題

ああ…期末試験は近いよ

2009年1月18日日曜日

[PCL]第29回CL勉強会セルフ反省会[CADR]

反省会というより、単なるログです。

  • PCL第4章 特に疑問はないので省略
  • Lispマシンエミュレータの話題 第29回CL勉強会CADR Lispマシンで遊んでみよう篇の準備物 からエミュレータ本体とディスクイメージを落とす 今回はchaosサーバは使わない エミュレータは実行形式で配布されているのでコンパイルの必要なし(ソース同梱) Winバイナリもあるけど、色々不便らしいので今回はLinux版を使う 以下エミュレータ起動までの手順
    [~/lisp/]$ ls
    chaos-cadr.tar.gz
    disk.img.tar.gz
    usim.tar.gz
    [~/lisp/]$ tar fxvz usim.tar.gz
    [~/lisp/]$ tar fxvz disk.img.tar
    [~/lisp/]$ cd usim
    [~/lisp/usim]$ ln -s ../disk.img disk.img
    [~/lisp/usim]$ ./usim
    起動まで50秒弱 [Intel celeron M, 1.40GHz] 起動後に現在の日時を聞かれるので"月/日/年 時:分"のように答える
    ***CADR [Running]***
    Please type the date and time: 1/17/81 22:20
    Time is Saturday the seventeenth of January, 1981; 10:20:00 pm, OK? Yes
    This is band 1 of CADR diskmaker image.
     System     78.48
     Zmail      38.5
     Tape        6.5
     LMFS       21.34
     Symbolics   8.13
     Microcode 841
    Distribution Unknown, with associated machine UNKNOWN.
    _
    後はここからEmacsの*scratch*バッファよろしくS式を書くらしい
    見つけたキーバインド
    F2-f: ファイルシステムエディタ起動
    F2-l: Listener(最初の画面)に戻る
    F2-e: Zmacs起動, (ed)
    F2-m: Zmail起動
    キーボードは101配列、106配列がごっちゃになっていた (なぜ?)
    ---106配列
    1234567890-^\
    qwertyuiop@[
    asdfghjkl;:]
    zxcvbnm,./\
    
    !"#$%&'()~=~|
    QWERTYUIOP`{
    ASDFGHJKL+*}
    ZXCVBNM<>?_
    
    ---Lispマシンエミュレータ
    1234567890-^\
    qwertyuiop@[
    asdfghjkl;:]
    zxcvbnm,./\ (backslash)
    
    !@#$%^&*()_^|
    QWERTYUIOP@{
    ASDFGHJKL::}
    ZXCVBNM<>?|
    見つからなかったキー quote('),doublequote("),backquote(`),plus(+),tilde(~) 解像度が1024x768だと縦幅が足りない… サイズの変更も出来るらしいんだけど、挫折(泣)
Lispマシンエミュレータ起動画面

2009年1月6日火曜日

丑年

2009年の干支は己丑(つちのとうし)。

ウシといえばGNUという発想は安直すぎるだろうか…

今年はもう少し自己主張できるようになりたいです。