Emacs再入門13日目。
Emacsの再入門中なのですが、脱線してLispの覚え直しをします。
以前Lispを学習しようとして、Scheme系、Common Lisp系、どちらを入門しようか迷ったことがありました。両方少しずつ触った結果、どうしてもCommon Lisp系が受け付けなかったので、Scheme系のLispの記憶だけがうっすら残ってる状態です。学び始めはこだわりを持ってはいたものの、結局どちらも物にできなかったので、くだらないこだわりでした。何かを学習しようとするとき、意味のない理屈を積み上げて、学習スピードを落とすことは勿体ないと思います。学べないって人はこういうタイプも多いのでしょうないのでしょうか。スキルのない人間に限って、論理武装していて技能が伴わないので、話してるときはノリノリなのだけど、手を動かすとすごく遅い、ってよく感じます。なので最近、寡黙な人ほど熟練者に見えます。
さて、Emacs Lispは、一番使われているLispなので、使いこなせたら、そりゃもう楽しいことこの上ないってことになると思います。
では、一から。
LispはList Processorが名前の由来というぐらいで、全部リストでプログラミングします。リストは、()で囲んで、スペースで区切って表現します。
足し算のプログラミングなら、+記号と、数値を並べれば完成です。
(+ 10 20)
では、行末でC-j (Ctrl + j)実行、
(+ 10 20) 30
答えが次の行にプリントされました。
複雑な計算も、リストを組み合わせることでできます。
(+ (* 2 3) (/ 10 5))
C-j (Ctrl + j)実行。
(+ (* 2 3) (/ 10 5)) 8
リストなので、計算する数値は、2値だけでなく、たくさん並べることができます。
(+ 1 2 3 4 5)
C-j (Ctrl + j)実行。
(+ 1 2 3 4 5) 15
最大値を求める関数。
(max 10 50 30 20 40)
C-j (Ctrl + j)実行。
(max 10 50 30 20 40) 50
最少値を求める関数。
(min 10 50 30 20 -10)
C-j (Ctrl + j)実行。
(min 10 50 30 20 -10) -10
リストの先頭には、必ず式を置きます。
なので、このような値だけのリストでは、何もできません。
(10 20 30)
C-j (Ctrl + j)実行。
(10 20 30)
じゃあ、ただのリストを表現したい場合はどうするか。
式にlistと書きます。
(list 10 20 30)
C-j (Ctrl + j)実行。
(list 10 20 30) (10 20 30)
今度は評価されたので、結果が表示されましたね。
プリントする関数で先ほどの結果を再度確認してみます。
(princ (list 10 20 30))
C-j (Ctrl + j)実行。
(princ (list 10 20 30)) (10 20 30)(10 20 30)
評価の結果が表示されたのと、princの結果が表示されたので、(10 20 30)が2回表示されました。
次は、リストとリストの足し算、できるでしょうか。
(+ (list 10 20 30) (list 40 50 60))
C-j (Ctrl + j)実行。
(+ (list 10 20 30) (list 40 50 60))
評価結果が表示されませんでした。
princを使って結果表示するとどうでしょうか。
(princ (+ (list 10 20 30) (list 40 50 60))
C-j (Ctrl + j)実行。
(princ (+ (list 10 20 30) (list 40 50 60))
やはり何も表示されませんでした。
+ができることは、
(+ 10 20 30 40)であって、
(+ (list 10 20 30 40))ではないからです。
リストを処理する関数は別にあります。appendを使ってみます。
(append (list 10 20 30) (list 40 50 60))
C-j (Ctrl + j)実行。
(append (list 10 20 30) (list 40 50 60)) (10 20 30 40 50 60)
今度は評価されました。二つのリストが連結されて表示されました。
ところでリストを作るときに、(list ~)と書くのが、面倒。そして多用すると見づらくなる気がします。なので、クォートを使って書き方を変えることができます。
これです。
'(10 20)
C-j (Ctrl + j)実行。
'(10 20) (10 20)
書き方を変えた二つのリストを、先ほどのappendを使って結合してみます。
(append '(10 20 30) '(40 50 60))
C-j (Ctrl + j)実行。
(append '(10 20 30) '(40 50 60)) (10 20 30 40 50 60)
OKですね。
コメント