Lisp から Ruby への設計ステップ

この間、 Ruby の作者である まつもとゆきひろ(Matz)さん のメーリングリストの内容がちょっぴり注目を集めました。 中身は Ruby を設計する時、 Lisp をベースにして Ruby になっていった手順です。
最後の冗談っぽい感じからすると、どこまでホントなのかよくわかりませんが、 話として面白いなと思いました。 今回はそれを翻訳して紹介したいと思います。


原文はこちら。
Ruby は次のステップで設計されています。
  1. シンプルな lisp をベースにする (Common Lisp の前身のようなの)
  2. マクロと S 式を削除
  3. シンプルなオブジェクトシステムを追加 (CLOS よりずっと簡単なもの)
  4. 高階関数からインスピレーションを得たコードブロックを追加
  5. Smalltalk にみられるメソッドを追加
  6. Perl と同等の機能を追加 (オブジェクト指向のスタイルで)
この理屈でいくと Ruby はもともと Lisp だったんです。
これからは Ruby を MatzLisp と呼びましょう (^O^)


以下、補足や感想です。

1. Common Lisp
Lisp は方言の多い言語ですが、それをなんとかまとめようということでできたのが CL(Common Lisp) です。

2. マクロ
Ruby の特徴の 1 つとして強力なメタプログラミングがあります。 Lisp のマクロはこれを更に強力にしたようなものです。
ただ、強力すぎて言語自体をいじれまくるので、方言の大量発生の原因でもあります。 マクロを取り除いて制約を加えたというところでしょうか。

2. S 式
S 式は Lisp の独特の構文となっているヤツです。
こちらも諸刃の剣で、 Lisp の美しさの軸であり、とっつきにくさの原因でもあります。 また、 Clojure でも苦労しているように OO(オブジェクト指向)と Lisp 構文は語順が逆になります。
書きやすさと OO にこだわった Ruby では S 式がなくなるのは必然だったのかもしれません。 4. コードブロック
他の言語では無名関数と高階関数を使ってやるところを もっとエレガントに書けるようにした感じです。
『7つの言語 7つの世界』 のインタビューでも まつもとさん の気に入っているところの 1 つとして挙げれられています。

6. Perl
名前のとおり、 Ruby は Perl の後継を狙った言語ですが、 意外にも一番最後に追加されたようです。

MatzLisp
もとは酒の席でのネタだったみたいです。

 

Emacs Lisp モードを便利にする機能 3 選(auto-complete, eldoc, rainbow-delimiters)

今回は Emacs Lisp を編集する上で役に立つ機能を 3 つ(+1) 紹介します。

機能 概要
auto-complete 補完候補のポップアップ表示
eldoc 関数定義の表示
rainbow-delimiters-mode 括弧をレベルに応じて色分け
rainbow-mode 色名に色を付ける

auto-complete と eldoc は Emacs Lisp 編集用機能ですが、それ以外の言語でも使えるものがあります。
rainbow-delimiters-mode は Lisp 以外にも括弧の多い言語には使えると思います。
rainbow-mode は名前が似ていて紛らわしいかなと思って、ついでで紹介しました。 こちらは CSS や html モードで役に立つ機能です。


なお、それぞれの機能はパッケージを使ってインストールします。 パッケージ管理機能については以前の記事をご覧ください。 また、 Emacs Lisp 用以外では、どんな言語のパッケージがあるかはパッケージの一覧で、 "auto-complete", "ac" や "eldoc" などで検索してみてください。

auto-complete

emacs-lisp モードでは通常 M-TAB を使って補完を行います。 auto-complete を入れると Visual Studio のようなポップアップを使った補完ができるようになります。

使い方

使用する場合には、まず auto-complete-mode(マイナーモード) にします。
後述する設定をすれば emacs-lisp-mode などで auto-complete-mode になると思います。 モード行に AC と出ていれば、 auto-complete-mode です。


このモードでは何かを入力した時、補完候補が表示されます。
ここで、 TAB を押すと確定します。
emacs_ac_first.png

そのまま、もうちょっと待っていると補完候補のポップアップが表示されます。 ここでは TAB で補完候補を順次選んでいきます。
emacs_ac.png


なお、 auto-complete の作者の方は日本人なので、詳しいマニュアルもあります。

設定

auto-complete はパッケージを使ってインストールすることができます。

auto-complete をパッケージでインストールした後、 以下の記述を ~/.emacs.d/init.el に追加します。 これで emacs lisp のファイルを開くと auto-complete モードとなります。
(add-hook 'emacs-lisp-mode-hook '(lambda ()
                                   (require 'auto-complete)
                                   (auto-complete-mode t)
                                   ))
auto-complete には Emacs Lisp だけでなく、他の言語でも使用できるものあると最初に書きましたが、 それらを一つ一つ設定をしていくのは面倒です。
次のように記述すると auto-complete-config に登録されているモードであれば、 auto-complete-mode になります。
(require 'auto-complete-config)
(ac-config-default)

eldoc

eldoc は入力中に関数の定義を表示してくれます。 また、 eldoc-extension を入れることで、機能を少し拡張することができます。

使い方

eldoc-mode ではモード行に ElDoc と出ます。
このモードになっていれば、入力時などに関数定義がミニバッファーに表示されます。
emacs_eldoc.png

eldoc-extension も入れていると、定義の後に簡単な説明が追加されます。
カーソル位置の太字がハイライトに変わる機能もあるらしいのですが、 私の環境ではハイライトには変わりませんでした。 ただ、変えたい場合は設定で変えることもできます。

設定

eldoc はデフォルトでインストールされていると思います。 パッケージで eldoc-extension をインストールします。
その後、以下の記述を ~/.emacs.d/init.el に追加します。
(add-hook 'emacs-lisp-mode-hook '(lambda ()
                                   (require 'eldoc-extension)
                                   (eldoc-mode t)
                                   ))
また、 Emacs のカスタマイズ機能を使えば、カーソル位置の太字を任意の Face に変更することができます。
M-x customize-group eldoc でカスタマイズ画面を開いた後、 [Eldoc Highlight Function Argument] の項目で設定します。

emacs_eldoc_customize.png

rainbow-delimiters-mode

rainbow-delimiters-mode では深さレベルに応じて括弧を色分けして表示してくれます。

rainbow-delimiters-mode

デフォルトの色は若干色の違いが分かりづらいかもしれませんが、 M-x customize-group rainbow-delimiters-mode で色を変更することもできます。


rainbow-delimiters-mode のパッケージをインストールした後、 ~/.emacs.d/init.el に使用したいモードで有効になるように設定を記述します。
 ;; rainbow-delimiters-mode
 (defun my-rainbow-delimiters-mode-turn-on ()
   (rainbow-delimiters-mode t))  
 (add-hook 'emacs-lisp-mode-hook 'my-rainbow-delimiters-mode-turn-on)
 ;; (add-hook 'c-mode-common-hook 'my-rainbow-delimiters-mode-turn-on)
 ;;        :
ただし、 rainbow-delimiters-mode が有効になっていると、 以前紹介した htmlize を使ったコードハイライトの html の取得でエラーとなります。
一旦、 rainbow-delimiters-mode を無効にする必要があるのが、ちょっと面倒くさいです。

rainbow-mode

rainbow-mode は "blue" や "#0044CC" のような色の表記に対して、その色をつけます。
Emacs rainbow-mode


rainbow-mode のパッケージをインストールした後、 ~/.emacs.d/init.el に使用したいモードで有効になるように設定を記述します。
 ;; rainbow-mode
 (defun my-rainbow-mode-turn-on ()
   (rainbow-mode t))  
 (add-hook 'css-mode-hook 'my-rainbow-mode-turn-on)
 (add-hook 'html-mode-hook 'my-rainbow-mode-turn-on)


 

Snap.svg : ファイルの画像も扱える SVG 用 JavaScript ライブラリー

Adobe が SVG 用 の JavaScript ライブラリー である Snap.svg を公開しました。 これは SVG のファイルも扱えて、とてもよさげだったので、 今回はこの Snap.svg について紹介したいと思います。

Snap.svg とは

Snap.svg は SVG(Scalable Vector Graphics) を扱うための JavaScript ライブラリーです。 jQuery で DOM を扱うような感覚で、 SVG を使えるようにするというスタイルらしいです。
これは Apache 2 License のオープンソースで開発されています。 ただ、 JavaScript で SVG を扱うライブラリーには Raphaël というメジャーなライブラリーが既にあります。 Why Snap のページによるとRaphaël との違いは次の 2 点です。
  1. モダンブラウザーがターゲット
    • Raphaël がなるべく古いブラウザーでも動作させるというスタンスに対し、 Snap.svg はターゲットをモダンブラウザーにすることで、高度な機能を使えるようになる。
  2. SVG ファイルも扱える
    • Snap.svg の API で書いた SVG だけでなく、 ファイルに書かれた SVG も同様に扱える。
私が特にいいなと感じたのは 2 番目の SVG ファイルも扱える点です。
SVG 画像を 0 から JavaScript のコードで書こうとするとしんどいです。 SVG ファイルをロードして、それを操作できると非常に便利だと思います。
Snap.svg では、描画ツールで書いた SVG 画像を使うことが可能になります。 これで Illustrator を使う人が増えれば、 Adobe も嬉しいのでしょう。

使い方

まず、 Snap.svg のホームページ の [Download] のボタンを選択して、 Snap.svg-X.X.X.zip のファイルをダウンロードします。

この圧縮ファイルの dist フォルダー以下にある snap.svg.js または snap.svg-min.js を使います。 厳密にどちらを使えばいいかはよくわかりませんでしたが、 簡単な処理であれば、 min の方で良さそうです。


API の使い方は Getting Started のページがわかりやすいので、そちらをみて下さい。 また、 圧縮ファイルのなかの demos フォルダーの中にも豊富なサンプルがあります。


ここでは簡単なサンプルを 1 つ挙げてみたいと思います。
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <!-- 次の meta タグによって最新のレンダリングモードを指定 -->
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <!-- Snap.svg のファイルをロード -->
        <script src="snap.svg-min.js"></script>
    </head>
    <body>
        <script>
            // サイズを指定して Snap のオブジェクトを作成
            // svg の html 要素を指定することもできる。
            var s = Snap(400, 250);

            // 円の要素を作成。 デフォルトは黒の塗りつぶし
            var smallCircle = s.circle(70, 100, 40);

            // 要素を作成した後、属性で色などを変えている
            var bigCircle = s.circle(140, 100, 50);
            bigCircle.attr({
                fill: "#bada55",
                stroke: "#000",
                strokeWidth: 5
            });

            // SVG ファイルのロード
            Snap.load("mascot.svg", function (f) {
                // ファイルの画像の中から g の要素を取り出して、
                // 色を変えて追加
                var g = f.select("g");
                f.selectAll("polygon[fill='#09B39C']").attr({
                    fill: "#fc0"
                })
                s.append(g);
                g.drag();
            });
        </script>
    </body>
</html>
因みに IE が SVG にちゃんと対応したのは IE9 からですが、 IE9 以上でも実際のバージョンより古いバージョンとして動作することがあります。 そうならないための記述もヘッダー部に追加しています。

 
このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
8位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
3位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

09月 | 2013年10月 | 11月
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。