2009年3月11日水曜日

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))