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)