Shota Oikawa

この記事は1年以上前に書かれたもので、内容が古い可能性がありますのでご注意ください。

近年の人工知能ブームに伴い、古き良き Common Lisp が再び注目されています。私も Common Lisp を通して、この人工知能ブームに乗り、最終的にはシンギュラリティを….

ということで、Common Lisp の勉強を進めていくために O’REILLY 発行の Land of Lisp という素晴らしい本を購入しました！

こちらの本は、Lisp のインタプリンタを用いてコードを逐次実行し、挙動を見ながら学んでいくスタイルで書かれています。そのため、より深く理解して学習を進められます。

私は、Lisp の処理系として CLISP を使用しています。最近は slime を用いて Emacs 上で快適な Lisp 生活を送っています。

Common Lisp とは

しばしば Common Lisp は関数型言語だと思われがちですが、実はマルチパラダイム言語でもあるのです。

そんな素敵な Common Lisp の特徴は、とにかく括弧が多いということです。Common Lisp について調べるとそれはすぐに分かると思います。

そもそも、Common Lisp は lambda コマンドのために産まれたらしいので、今回は Common Lisp における lambda に焦点を当てていきたいと思います。

Common Lisp の lambda

lambda は無名関数で、これを Common Lisp のコードに埋め込むとコードの量が減ったり、見やすくなったりします。

(lambda (n) (+ n n))

これで受け取った引数を２倍にした値が評価されます。

では次に、与えられたリストを２倍にしたリストを評価するコードを lambda を使わない場合と、使った場合を書いていきます。ご参考にしていただけると幸いです。

まず、list 変数に リスト(1 3 4 6)を与えます

(defparameter list '(1 3 4 6))

・lambda を使わない場合

(defun double-list (list)

(when list

(cons (* 2 (car list)) (double-list (cdr list)))))

・lambda を使う場合

(mapcar (lambda (x)

(* x 2))

list)

するとどちらも評価されたリスト (2 6 8 12) が得られます

ここで出てきた mapcar は高階関数です。高階関数は関数を引数にすることができます。そのため、上記のようにコードの量を減らすことができます。

これからさらに勉強を進め、Land of Lisp の住人になります。

参考文献

https://www.oreilly.co.jp/books/9784873115870/ : Land of Lisp