今日覚えた事

今日取り組んだSchemeのメモです。

関数型言語のど素人です・・・
なにか間違って解釈しているところを発見したら指摘してもらえると嬉しいです。

コメント

3種類ある。

  • 行コメント
  • ブロックコメント
  • S式コメント

行コメントは、「;」
ブロックコメントは「#|〜〜|#」で挟む
S式コメントは#;の後ろのS式をひとつ読み捨て。

ブロックコメントとS式コメントはScheme共通ライブラリ(SRFI)で定義されているらしい。
S式コメントは便利で実用的なコメント方法があるんだなぁとすごく感心しました。
Lispの習慣としてセミコロンの数でインデントや用途の使い分けをするとのこと。

NERD_commenter.vimでは行コメントに対応していました。

用法
  • 1個
    • 1行でコメントとソースの説明を書く場合。(変数の説明など)
  • 2個
    • コードのインデントに揃えて書き、手続きに関する説明を書く
  • 3個
  • 4個
    • あまりつかわれない

予約語

予約語は存在しない。
再定義可能だけど、むやみやたらにdefineとかを再定義すると大変になる。
そのぶんユーザーの自由度は高いらしいのですが・・・

この仕様もSchemeはやろうと思えば何でもできるという所以なのかなぁ??

モジュール

ライブラリはモジュールという単位で使える。

ライブラリを使うにはuseで使える。
これも、もちろんS式で

;;リストのライブラリ
(use srfi-1)

ふむふむ。
読み込んだライブラリの使い方はまだですね。

リスト

リストは括弧で囲む。括弧で囲ったものがS式じゃなかったけ?
うーん。今は深く考えず進もう。*1

;;リストの表現
(1 2 3)       ;数値のリスト
((1 2) (3 4)) ;数値のリストのリスト

手続きもデータもS式表現なので、使い分けれるようになっていると。

;;データと手続きの表現
(1 2 3)  ;1.リスト表現
'(1 2 3) ;2.数値のリストデータ表現

[1.]をevalで評価するとエラーになった。
手続きではないというのが理由らしい。

これが、

(+ 1 2 3)

というリストだったら、「+」という手続きの引数として[1 2 3]を引き渡すとなり、式を評価できるみたい。
評価するには、手続きとする必要があると。*2

リストを結合するにはappendという手続きがあるようです。

(append '(1 2 3) '(4 5 6))

あと、ネストしているリストを表現(リテラル表記)するには、大外にシングルクォートを表記すれば内包しているリストもデータとして扱われるらしい。
この辺、結構重要だと思いました。

'((1 2 3) (4 5 6))   ;内包しているリストもリストデータ
'('(1 2 3) '(4 5 6)) ;内包しているリストはリストデータではない

使用方法としてはこんな感じで良いのかなぁ。

(append '(1 2 3) '(4 5 6))                  ;リストを連結する
(append '((1 2 3) (4 5 6)) '((7 8) (9 10))) ;ネストしたリストを連結
'(((1 2 3) (4 5 6)) ((7 8) (9 10)))         ;連結されていないネストしたリスト

括弧が多い!!

vimで=を使って、自動インデントしただけなのですが、
複数行に分けたインデントってこんな感じで良いのでしょうか・・・

(append '((1 2 3) (4 5 6))
		'((7 8) (9 10))
		)

今日は、これでおしまい。


収穫:リストの基礎
副産物:Lispの括弧の多さを思い知りました。

*1:後で調べる

*2:データもevalできるのでデータ表現にするとエラーにはならない。