今年もやはりVLC media playerのアイコンがクリスマス仕様になっている様子。
こういう遊び心のあるソフトウェアは個人的に好感がもてます。
そして多分、今回も年明けまでこのアイコンのままだと予想。
今年もやはりVLC media playerのアイコンがクリスマス仕様になっている様子。
こういう遊び心のあるソフトウェアは個人的に好感がもてます。
そして多分、今回も年明けまでこのアイコンのままだと予想。
LISPファイルの編集時に関数の引数を表示するマイナーモードとして、Emacsではeldoc-mode、CLではslime-autodoc-modeがあるんですが、両者の表示形式が微妙に異なることが気になったのでついカッとなってeldocの方を軽く改造しました。反省はしていない。
gist: 244937 - GitHub参考画像を見れば分かると思いますが、ポイント位置の引数の強調方法がデフォル トでは太字ではなくハイライトになってます。
その他、関数・変数ともに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)
もっと使われてもいいのにと思う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)
)))
この関数の利点は
例: (add-hook 'emacs-lisp-mode-hook 'turn-on-eldoc-mode)
逆に不便な点、気にくわない点は
この辺は一応マクロを使えば解決するが...なんで関数なんでしょうね、これ。
(defmacro eval-after-load-1 (file &rest args)
`(eval-after-load ,file
(quote (progn ,@args))))
(put 'eval-after-load-1 'lisp-indent-function 1)
ひっそりと更新。
以前挑戦した「newLISPをSLIMEから動かす」が、一応お遊び程度に完成したので公開してみます。
http://github.com/kosh04/newlisp-files/tree/master >> swank-newlisp.lsp簡単なREPLが使えるくらいで、SLIMEの特徴であるシンボル名の補完、定義ファイルへのジャンプなどなど実装されていない残念な出来です。
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、もうちょっと他の人が言及してくれてもいいのに。と思うならまず自分からですかね。
ということが「LaTeX2e 美文書作成入門」に書かれていて、なんだかトリビアを覚 えた気分です。
( ・∀・)つ〃∩ヘェーヘェーヘェー
LaTeXで物書きをしている人にとっては常識だったりするんでしょうか、コレ。
以下書籍より引用(ただし手元にあるのは改訂第4版ではなく初版)
...そして,TEX第3.1版(1990年)の時点で次のような終結宣言をしました。
- もうこれ以上TEXは拡張しない。
- もし新しい不具合があれば修正して第3.14版,第3.141版,第3.1415版,...と番号を進めていき,自分の死と同時に第π版とする。それ以後はどんな不具合があっても誰も手をつけてはならない。
- TEXに関することはすべて文書化したので,このノウハウを生かして新たにソフトを作ることは自由である。
端末エミュレータのエスケープシーケンスを使ったアスキーアニメなんてものがある事を知ったのでちょっと自分でキャプチャしてみました。画像は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ファイルで再現できるのかもしれませんね。
VT100.net: Animation http://vt100.net/animation/
このブログ(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
別にそれほど困った話ではないけど、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に処理を投げているようだが...
(つづくかも)
Emacsのregexp-opt.elをxyzzyに移植してみました。
一応Emacs移植キットは使わずに自前で動くようにしてあります。 あまり実用的な出来ではないですが、よかったらどうぞ。
https://github.com/kosh04/xyzzy-lisp/tree -> site-lisp/ -> regexp-opt.lから入手できます。
-- 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\\)\\)"バグ・問題点:
(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]
乗り遅れた感はありますが、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使わなかったな...
細かい経緯は面倒なんで省略しますが、自分が大学内でLISPの話題をした際に 「なんでJAVAでLISPを動かす必要があるの?」 と質問されました。
特にこれはLISPに限った話ではなく、「なぜ他の言語をJAVAで実装する必要があるのか」 ということになりそうです。実際、JAVAで実装されたプログラミング言語は多々あります。
などなど...
で、「なぜJAVAなのか」と聞かれたら「便利だから」と答えたら身も蓋もないし… もうちょっと無い脳みそ振り絞って「何が便利なのか」を考えてみると、
こんなところでしょうか。("LISP"は各自他のプログラミング言語に置き換えてください)
他にもあると思いますが、自分がパッと思いつくのはこれくらいです。
ubuntuのgnome-dictionaryが簡易辞書として便利なので紹介。
ほとんどのリソースは外国語なので英英辞書くらいにはなるかなと思っていたら、日本語用の辞書サーバを提供しているところもあるので漢字の読みを調べることも出来そうです。
# もちろん細かく調べるときは手持ちの電子辞書か英辞郎に頼むんですが
Web用のインターフェースもあるのでクライアントをインストールする前に試用してみるのも良いかもしれません。
ちなみに日本語辞書用の辞書サーバなのに、そのサーバはフランスにあるみたい。
ブログの更新遅れも甚だしい今日この頃ですが 、ここにはあんまり技術的でな いどーでもいいことを書くのは自分の性格上ためらってしまうのです。 (どちらかといえば口下手か、単に面倒臭がりなだけなんだと思いますがね)
さすがに Lisp ばかりに手をつけるわけにもいかないので、 とりあえず今はオブジェクト指向の理解のために Java の勉強中。
その他書きたいことがあったような気がしたけど、毎度の事で頭の中でとろけ
てしまったみたいなので、今日はこの辺で。
# だめだこの性格…
$ echo *** > /dev/null
いくつかファイルを置いておいたので、よかったらどうぞ。
真面目にファイルの配布するならライセンスやマニュアルも考えるべきなんだろ うけど、今日はとりあえずここまで。gitに慣れるのに手間取って疲れた…
GitHubのwebページがUTF-8らしいので、それに伴いファイルの文字コードも一部 UTF-8になっています。で、xyzzyだとファイルのコンパイル・ロード用の関数が デフォルトではShift_JISしか対応しないようなので、compile-file/loadの代わ りにmc-compile-file/mc-load-file関数などを使って明示的に文字コードを指定 してくだしあ。
後でREADMEくらいは作ろう。
ブラウザの文字化けよりもライブラリを実際に使う時の利便を考慮して、元のsjisに戻しました。
配属先研究室の端末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改悪の悪い癖がでてきたなあ…
windows と併用している linux を vine4.2 から ubuntu-ja-8.10 に変えてみた。
インストールは 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)
このメモを次回につなげよう。 でも次回っていつだろうか?
らしい。ちょっと見てみると「既読ボタン」なんてものがあったので早速導入。 これは重宝しそうな予感。
Gmail -> 設定 -> Labs -> 既読ボタンの項目を有効にするあと「酒気帯びテスト」ってこれか。
Google、「真夜中のラブレター」を防ぐ「Mail Goggles」 - ITmedia News 実験サービス「Gmail Labs」が日本語化 送信取り消しや「酒気帯びテスト」も - ITmedia NewsInfoの参照 -- 開発ツールとしての Emacs http://www.netlaputa.ne.jp/~kose/LinuxWorld/#11
指定したシンボルに対応した Info を表示するには `info-lookup-symbol' を使えばいいのか。なるほど。
Elisp 用の Info は標準で入っているので、とりあえず C ライブラリのだけでも入れて おくことにする。以下、その手順。
$ mkdir -p ~/info/libc $ tar xzvf libc-info.tar.gz.tar -C ~/info/libc
(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)
* libc: (libc). The GNU C Library
特に c-mode と libc-info の関連付けを指定してないけど、 Emacs 側で勝手にマー ジしてくれるらしくこのままで使えるみたい。
でも、もっと多機能なものが既にあるからこのメモはあんまり当てにならないかもね。
#+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) を返す。…なんでだ?
なんというか、物凄くくだらない事に真剣になってしまったので ここに断片だけ残して、後で振り返って一人で悶絶しようと思う。
# 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 "↓")))
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 ほどのカットに成功したようです。
動作に変化はありませんが、プログラムの可読性が少しだけ上がった気がするの でここに残しておきます。
何気なく Windows Update で新しいフォントを入れたら見事にやられた。
Windows XP および Windows Server 2003 向けJIS2004 対応 MS ゴシック & MS 明朝フォントパッケージについてぼんやりしていても気づくほどフォントに違和感がありすぎる… しかも主に騒がれていたのは2007年。2年前の問題に反応する自分も自分だなあ。 ということでアンインストールさせていただきます
HaloScan.comのページが文字化けするなと思って HTML ソースを眺めていたら、ヘッダ部分が
<meta equiv="Content-Type" content="text/html; charset=iso-8859-1">
となっているんだが、UTF-8 が使えなくなったのだろうか。 以前は設定に "Character Encoding" なる項目があったはずなのにいつの間にかそれもなくなってるし。
以前書いたEmacs用のnewlisp-modeが本家様に気づかれたようです。さすがマイナー言語。
http://www.newlisp.org/code/newlisp.el
というかこれならシンボル補完とか色付けとかもっと頑張ればよかった。 最近newLISP弄るのはもっぱらxyzzyからだしなあ。
SLIME+newLISPを完成させるか。。。
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ではゆんゆん電波を飛ばしていた気がします。すいませんでした。
「Shibuya.lisp テクニカルトーク #2」が無事に開催されたようです。
自分はニコニコ動画から見させてもらいました。 →http://www.nicovideo.jp/mylist/11305224
個人的には処理系/性能について語るのもいいけど、それから何か作ってみた系 の発表が面白かったかな。やはり動くものは見ていて楽しい。
okuoku氏: SchemeでBluetoothスタックを書く Scheme(mosh)で外部プロトコルの処理をしようとする試み。 Wiiリモコンと通信するデモに思わず感嘆の声。 FFI(Foreign Function Interface)とは違うんだろう、たぶん。
和田英一氏: 私がLispでプログラムを書く理由 楽しいから←結論 本当に楽しそうに話すなあ。 ダメ学生の自分はPostscriptプログラム紹介の後半少しだれてしまいました、ごめんなさい。
林拓人/takuto_h: Cyanの現状と、これから 高校生が作った実験的言語Cyan(サイアン)の紹介。 「言語は本来、プログラムを書くためのもの。しかし、私は言語処理系しか書けない。」 彼に限らないが、子供の頃からプログラミングに慣れ親しむ環境があるってうらやましいなー。
一通り動画を見終わって改めてタイムテーブルを見ると、CLの発表者は少なかったんですね。(2人?)
残念ながら中継/動画配信されなかった数理システムの黒田氏の発表も、他の 「TT#2参加したよブログ」を見る限りかなりパンチのあるものだったらしい。 自分のような似非CLerがそれを聴いたら、きっとその場で畏縮してしまうんだろうなあ。。
ともあれ、動画を見てLISPに対するモチベーションが上がった気がしますね。
発表者の皆さんも運営の方々もお疲れ様でした。
newLISP is a Lisp-like, general-purpose scripting language.
((lambda (x y z) (list x y z)) 0 1 2 3 4 5) => (0 1 2)
("newLISP" 0) => "n"
(import "printf" "libc.so.6")
(printf "%s World" "HELLO") ;=> "HELLO World"
(match '(* 2 ? 4) '(0 1 2 3 4)) ;=> ((0 1) 3)
(unify '(p X Y a) '(p Y X X)) ;=> ((Y a) (X a))
(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
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))
もともとこのブログを作った趣旨が「xyzzyでこんな関数作ったよ、見てね」 のつもりだったのに、最近まですっかり忘れていたような気がする今日この頃です。
Xyzzy Wikiに投稿するのもありなんですが、あまりに雑多すぎて分類に困りそうなのでブログの方にしました。(気が小さいなんて言えないです…)普段使っている関数群なので、そこそこ枯れていると思います。
→http://paste.lisp.org/display/75922
以下軽く解説
;; 載せるの忘れてた… (global-set-key #\C-g 'keyboard-quit) ;; [ツール]->[共通設定]->[マーク行の行番号を反転]にチェック (setq *inverse-mark-line* t)
(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)))
今回はここまで。もう少し続きます。
今回の発表のUSTREAMでの中継/動画アップロードにつきまして 前回のTT#1では、発表者全員より撮影許可を頂けましたので、内容全編を中継/アップロード致しましたが、今回は、すべての発表者の方に撮影承諾を頂けておりませんので、一部内容の中継/アップロードができません。 Shibuya.lisp TT#2 ライトニングトークの発表内容決定!
(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実装しろってことかなあ。
なんと懐かしい…見ていたのは小・中学時代だったかな。
当たった懸賞の品に一喜一憂する姿とか、「当選の舞」とか、ぼさぼさ頭にチョ ンマゲ姿とか、ポスターか何かを見て下部のなすマークが大きくなったり(!?)と か、とにかく見ていて面白かった。日曜日の深夜が楽しみだったよ。
現在のインタビュー時の写真を見て「変わんないなー」とにんまり。 当時の電波少年のホームページ(あったんだ)を読みふけって、懐かしさのあまり もう一度にんまりしてしまった。
なすびさんも元気そうで何よりですね。 この人のポジティブ思考は見習うべきかも。
電波少年的懸賞生活 - 日本テレビxyzzyではロードされたモジュールの一覧はmodulesで参照できるわけですが、 autoload関数で指定された関数は呼び出されるまでロードされません。 そういうモジュール一覧を参照出来ないかと思ってこんなものを作りました。 利用する箇所が見当たらないので、ネタということで。
http://paste.lisp.org/display/75440まあ、autoload-function-pを弄っただけなんですが。 find-all-symbolsを使っているのでコンパイルしないと重いです。
ところで"hh-call"って何なんでしょう?$XYZZY/lispディレクトリ内には見つか らないし、検索してみても答えは出ず。。。HTML-Helpをcallするとか?
勉強不足以上に実践不足が否めないと思う今日この頃。 テストが終わった(笑)のでちまちまとアウトプットをしていこうと思います。
まあ、たいしたものではないですが。
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を弄ろうかと思います。
http://d.hatena.ne.jp/rubikitch/20081120 より
(count #\0 (format nil "~{~D~}" (loop :for i :from 0 :to 1000 :collect i)))
;=> 193
Commom Lisp は文字列を弄ることが出来るから面白い。
反省会というより、単なるログです。
[~/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だと縦幅が足りない… サイズの変更も出来るらしいんだけど、挫折(泣)