LispのREPループとは何なのか

Lispを触り始めると、まずいわゆるREPループと対面することになると思います。

簡単に言うと、Lispのコマンドラインみたいなものです。

で、そのコマンドラインがLisp的にどういう風に実現されているかという観点から命名されたのがREPループです(Read -> Eval -> Print ループ)。

                         Lispユーザー   
    
       Textual Representation   Printed Representation
                |                           ^
                |                           |
    ~~ 端末を使ってすべて文字列でユーザーとやりとりします ~~~
                |                           |
      +---------|---------------------------|--------+
      |         |       Lisp World         |        |
      |         V                           |        |
      |   +----------+  +-------- -+  +-----------+  |
      |   |   read   |  |   eval   |  |   print   |  |
      |   +-----+----+  +-------+--+  +-----------+  |
      |         |         ^     |           ^        |
      |         V         |     |           |        |
      |    Lisp Object----+     +-> Lisp Object      |
      |                                              |
      +----------------------------------------------+
  • read関数が入力としてユーザーが打った文字列(textual representation)を読み、その入力文字列の内容で表現されているLisp Objectを作成して出力する。
  • そのLisp Objectをeval関数が”評価(evaluate)”してその結果のLisp Objectを出力する。
  • そのLisp Objectをprint関数が文字列(printed representation)に変換して出力する。

たとえば、(+ 1 2) とrepループに打ち込んだら、次のような処理の流れになります。

       
           "(+ 1 2)"                       "3"
                |                           ^
      +---------|---------------------------|--------+
      |         |       Lisp World         |        |
      |         V                           |        |
      |   +----------+  +-------- -+  +-----------+  |
      |   |   read   |  |   eval   |  |   print   |  |
      |   +-----+----+  +-------+--+  +-----------+  |
      |         |         ^     |           ^        |
      |         V         |     |           |        |
      |       (+ 1 2) ----+     +-> 3 ------+        |
      |                                              |
      +----------------------------------------------+

また、たとえば単独の数字を入力しても”1″ -> read -> 1 -> eval -> 1 -> print -> “1” のように、数字を評価(evaluate)しても元のLisp Objectとしての数字から変化しません。(eval 1) -> 1。単純で分かりやすいですね。

では、コンピュータ的な各種処理を行わせるにはどうするかというと、それはリストを入力してあげることで実現しています。

(OPERATOR arg1 arg2 ...)

リストを評価(evaluate)するときは、上記のように、第一要素を演算子(オペレーター)として扱い、第二要素以降はその演算子への引数として渡すというルールになっているのです。

つまり、プログラムをリストとして入力することになります。
LISP = LISt Processor という名前の由来です。




「LispのREPループとは何なのか」への2件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です