開発
Land of Lisp から始める Lisper 生活
Shota Oikawa
近年の人工知能ブームに伴い、古き良き 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))
これで受け取った引数を2倍にした値が評価されます。
では次に、与えられたリストを2倍にしたリストを評価するコードを 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