Lisp実装をすれば関数型プログラミング言語を理解できるかも

関数型プログラミング言語といったらLispでしょうから、Scalaとかを使う前に、雰囲気を知りたい場合は、こちらを先にみたほうがいいかもしれません。Wikipediaに記載されている内容とか参考になります。


「最小のLISP」について調べたところ、「以下の5つの関数と特殊形式、他にシンボルのnilとt、などがあれば最小の機能を持つevalを実装することができることから、この5つの関数を基本関数と呼ぶことがある。」というのを見つけました。

関数
car
cdr
cons
eq
atom
特殊形式
cond
quote
define(label)

Common Lisp 仕様書の Evaluation Model を読んでマインドマップにまとめた – てっく煮ブログ」を見てみたり。Lisp/実装 – assari: によると、こんなのもあるようです。LispでLispを記述できるといったあたりから、プログラミング言語の強力さがわかるのですが、使いこなせるようになるにはセンスが必要だというのが最大の課題です。

; --- A Pure Lisp Interpreter in Lisp --- 
(defun plisp () 
  (defun pl-evalquote (func args env)
    (pl-apply func args nil)) 
  (defun pl-apply (func args env) 
    (cond ((atom func) (cond ((eq func 'car) (car (car args)))
                             ((eq func 'cdr) (cdr (car args)))
                             ((eq func 'cons) (cons (car args) (car (cdr args))))
                             ((eq func 'atom) (atom (car args)))
                             ((eq func 'eq) (eq (car args) (car (cdr args))))
                             ((eq func 'return) (car args))
                             ((eq func 'exit) (bye)) 
                             (t (pl-apply (pl-eval func args) args env))))
          ((eq (car func) 'lambda)
           (pl-eval (car (cdr (cdr func))) (pl-pairlis (car (cdr func)) args env)))
          ((eq (car func) 'label)
           (pl-apply (car (cdr (cdr func))) args (cons (cons (car (cdr func)) (car (cdr (cdr func)))) env)))))
  (defun pl-eval (e env)
    (cond ((atom e) (cond ((eq e nil) nil)
                          ((eq e t) t)
                          (t (cdr (pl-assoc e env)))))
          ((atom (car e)) (cond ((eq (car e) 'quote) (car (cdr e)))
                                ((eq (car e) 'cond) (pl-evcon (cdr e) env))
                                ((eq (car e) nil) (princ "Undefined Func.") (terpri) (bye))
                                (t (pl-apply (car e) (pl-evlis (cdr e) env) env))))
          (t (pl-apply (car e) (pl-evlis (cdr e) env) env))))
  (defun pl-evcon (e env)
    (cond ((pl-eval (car (car e)) env) (pl-eval (car (cdr (car e))) env))
          (t (pl-evcon (cdr e) env))))
  (defun pl-evlis (args env)
    (cond ((eq args nil) nil)
          (t (cons (pl-eval (car args) env) (pl-evlis (cdr args) env)))))
  (defun pl-pairlis (x y env)
    (cond ((eq x nil) env)
          (t (cons (cons (car x) (car y)) (pl-pairlis (cdr x) (cdr y) env)))))
  (defun pl-assoc (x env)
    (cond ((equal env nil) (princ "Undefined Func.") (terpri) (bye))
          ((equal (car (car env)) x) (car env))
          (t (pl-assoc x (cdr env)))))
  
  (princ "--- A Pure Lisp Interpreter in Lisp ---")
  (terpri)
  (prog (env)
    (setq env nil)
    (loop
      (terpri)
      (princ "=>")
      (princ (pl-eval (read) env)))))

世の中、JavaScriptでLisp実装をするとかやっている人もいるようで、面白いですねぇ。

関連リンク:

関連書籍:

同じタグの記事: Lisp
同じカテゴリの記事: General
関連書籍: Lisp