Lisp勉強2

メリークリスマス、皆さん。
今日はリストをちょこっと勉強して、繰り返しをちょこっと勉強します。

(1 2 3 4 ore ore2)
コンな感じで線形のリストを定義できるらしい。これ自体では使えない。

(first (list 1 2 3))
最初の要素を取り出すそう。つまり1と表示される。

(rest (list 1 2 3))
こっちは、rest、つまり残りを出す。つまり最初以外のリストを作って返却する。
結果は、(2 3)

(nth 2 (list 1 11 111 1111))
nth関数は、n個目を吐き出す関数、1つめにn個目、2つ目にlistを与えればよい。
返却は、111ですね。

(quote (a b c))
quote関数はlistを生成する関数ですが、いつものリストと違って中が展開されないそうだ。
つまり、ここでのaとbとcは変数として展開はされずに、a b cといった文字列で返却される。
結果は (A B C)。
大文字、小文字は無視された。

(cons 10 (quote (a b c)))
consは、リストに要素を追加する命令。1つ目の引数に追加する要素を書く、そして、2つめの引数にリスト本体を渡してあげる。
そうすると、(10 a b c)と表示される。先頭(という概念があるのかは知らないが)に追加される。

()
空のリストはNILになる。それだけ。

(length (quote (a b c)))
これを使うと、リストの長さを取得できる。いたって普通な感じだ。

繰り返し:
(dotimes (n 3) (format t "~a" n))
3回繰り返す。012って出る。
dotimesが繰り返し命令だな。変数の宣言っぽく3っていう風にやる。
ふ~ん、一応何となく分かってきた感じだ、

(format t "~a" n)
ここで、表示している。
~aっていうのがprintfの%dみたいなやつらしい。
なるほど

dolistっていうのもあって、こっちはfor-eachを書けるらしい。使い方はほぼ同じだ。
変数で3って入れてたところに、リストを与えればいいらしい。

力尽きたので、今日はこれにて。
いい夜を。
続く。

Lisp勉強1

今まで手続き型言語とか、オブジェクト指向の奴ばっかり扱ってきたので、関数型言語とかよくわからん。
古典的にLispを勉強してみようと思った。
プログラムは日々圧倒的成長が必要なのだ。(しらんけど)

Ubuntuでやってます。
まずは適当にLisp Commonパッケージをインストール
処理系の違いはよく分からん。
sudo apt-get install sbcl

sbclの対話の奴でやってみる。
公式っぽいところのチュートリアルみつつ
(format t "Hello World")
へ~、文字列型扱えるんだ。

続いて、関数を見る。
まずは四則演算
(+ 1 2)
ポーランド記法だ。おそらく(関数名 引数…)って感じだろう。

(+ 1 (* 3 5))
入れ子。いいね。部分的ポーランド記法だな。

なんか虚数も扱えるらしい。数学的だ……
(私は普通に数学苦手です)

(let ((str "Hello, world!")) (string-upcase str))
はい、意味不明です。

調べてみると、
letは局所変数を宣言する関数(マクロ)のようです。
どうやら、C#あたりでいうローカル変数とそのスコープを定義しているみたいです。

let (A) (B)
(A)が変数定義をする引数、(B)がスコープ内部、次の命令的な奴を並べてくそう。
ほほう。

つまり、
str = "Hello, world!"
str.toUpper()

みたいな感じですね。なるほどなるほど。

let*を使うと、前に定義した値を使えるっぽいです(?)変数定義の時に初期値の値の関数が展開されるってことですかね……

(let ((x 2)) (if (= x 2) x (+ x 4)))

if文。なるほどね。boolを返す関数を比較演算っぽく利用するんだ。
というか変数を直で書くと表示されるんだね。ふむ。

次はリストやってます。
メイン処理は基本的にリストをうまく利用して書いていくそうです。なかなか奥深い。
ちょっと楽しくなってきました。
関数型もなかなかいい感じです。