はじめまして。新卒の茂木です。

社内勉強会で elisp の基本的な概念について紹介したので、資料を公開します。 資料のうち説明不足な点もありますので、ざっくりとした要点を紹介したいと思います。

資料

どんな人に向けたもの?

  • elisp を触ったことがない人
  • 興味はあるけど、どうにも「とっつきにくい...」と思っている人
  • 自分で elisp を組んで、emacs をカスタマイズしたい思っている人

elisp を学ぶメリット

発表した資料では以下のようにまとめています。

  • lisp 系言語の基本を学べる
  • emacs という環境が用意されている
  • 印象に残りやすい

どういうことか少し詳しく解説します。

lisp 系言語の基本を学べる

elisp は 数ある lisp の派生言語の一つです。他と仕様が異なる部分は多いのですが、見た目や「式」など共通点もあります。 elisp を学ぶことで括弧に対する恐怖感が薄れ、scheme や clojure を学ぶ際の心理的障壁が小さくなりますし、elisp で学んだ文法の共通点を利用できます。

つまりひとつ学ぶだけで他の言語にも応用が効き、まさに一石N鳥となる可能性があるのです。

emacs という環境が用意されている

これだけだと「別に elisp じゃなくていいじゃん」となります。 ですが elisp では勉強したことが、確実に生きる環境(emacs)が用意されています。これが他の lisp 派生言語にはない大きな特徴だと思います。

elisp を学ぶとエンジニアが日常的に使用するエディタにも、大きな革命が起きるのです。

何故なら emacs を拡張するためのプラグインのほとんどが elisp で書かれているからです。 elisp を学ぶとプラグインを自作して、自在に使うことができます。そして elisp の高い表現力で、どんなことでも実現できるようになるでしょう。 エディタはエンジニアがとても長くお付き合いするものです。必然的に自作プラグインも日常的に使うことになります。 自分で作ったものを使い込んでいき、ブラッシュアップしていく場として最適ではないでしょうか。

印象に残りやすい

elisp はマイナーな言語と言えるかと思います。ひとつは「括弧が多い見た目がどうにも受け付けない」という人も多いということ。「elisp 自体が仕事で使われる言語ではない」などが理由に挙げられるでしょう。

一方で、エンジニアとして希少な言語を書けるということは、ある意味それが自分の強みとなる可能性があると、私は思います。 第一に公開した時に他者の記憶に残りやすいということ。第二に使用用途に特化したニッチな開発がしやすいというのが理由です。

という風にいかにもそれっぽい理屈を述べていますが、誰得プラグインを自由に自作できることは、単純に楽しかったりします。 あくまで個人的な意見ですが。

elisp の特徴的な評価方法について説明します。 関数の挙動のような「調べればわかる」ことよりも、調べにくくて根本的なことに焦点を当てたほうが、全体の理解が早いと考えたからです。

「式」とは評価の対象のことで、form とも呼びます。式が評価されることで、処理が行われ、結果が出力されます。 elisp の式の単位は ( ) で括られた範囲となります。

式の評価は2つの大原則に則って行われます。

  • 引数部分が先に評価される
  • 評価は再帰的に行われる

引数部分が先に評価される

リストの先頭がシンボルなら関数セルを呼び出します。リストとは何か、シンボルとは何か、という詳しい説明は資料に譲らせていただきます。 言い換えると「( ) の中の先頭の要素は関数として処理され、引数部分が先に評価される」ということです。

elisp では基本的に、この原則に則って式の評価が行われていきます。

例1: (+ 1 2) を評価する

例1 の式を評価してみましょう。括弧の中を評価すると基本的には前から順に評価されます。この場合ですと

+ → 1 → 2

の順番で評価されていきます。順に見て行きましょう。

1. + を評価する
  • は「与えられた引数を全て加算する」という動きをする関数です。 「引数部分が先に評価される」原則に従って、引数部分が先に評価されます。
2. 1 を評価する

次の引数 1 を評価します。これは式ではありませんが、1 を評価して 1 を返します。 当たり前に思えるかもしれませんが、重要なことです。

3. 2 を評価する

2 を評価します。1 を評価した時と同じです。 2 を返します。

4. 関数を適応

さて、ここまで評価が進み、関数以外の引数が全て評価されました。 その結果引数の値はそれぞれ、「1」と「2」でした。 最後に + の関数が「与えられた引数を全て加算する」というルールに則って処理をし、結果として 3 が返ります。

評価は再帰的に行われる

言い換えると「式の内部に式があると、そこから評価を行う」ことです。 繰り返しになりますが、elisp の式の単位は ( ) で括られた範囲となります。つまり括弧の中に括弧があったら、先にそちらが評価されるということです。

例2: (+ (* 2 3) (/ 8 4)) を評価する

例2 の式を評価してみましょう。先ほどの原則も合わせてみていきます。

1. + を評価する

先ほどと同じです。 + は「与えられた引数を全て加算する」という動きをする関数なので、引数部分が先に評価されます。

2. (* 2 3) を評価する

引数部分にさらに括弧が出現しました。「式の内部に式があると、そこから評価を行う」原則に則って、+ の残りの引数を評価する前にこちらが先に評価されます。 冗長になるので繰り返しませんが、(+ 1 2) と全く同じ形をしているので、同様のプロセスで評価されていき、結果として 6 を返します。 もちろん内部では「1 が評価されて 1 が返る」というプロセスも行われています。

3. (/ 8 4) を評価する
  • の第二引数を評価します。 こちらも先ほどと同様で、括弧がありますので評価し、結果として 2 を返します。
4. 関数を適応する

ここまででようやく + の引数部分が最後まで評価されました。+ の「与えられた引数を全て加算する」が発動し、8 が返ります。

まとめ

elisp を学ぶ理由、式の評価について述べてみました。 特に「式」については極めてシンプルなルールで評価されていきます。これこそが根強い lisp の人気となっているのかもしれません。 記事を読んで少しでも elisp 触ってみよう と考えて頂けたら幸いです。

  • このエントリーをはてなブックマークに追加
エンジニア募集中です!

私たちは新しい仲間を募集しています。