リストを表示するのはこれまでの言語では[]だったが、schemeでは()を用いていく．空白を用いてデータの区分けをする．

iEDのターミナル上の応答型エディタではhistoryや方向キーが対応しないため、少し入力しずらい。

1.リストの先頭に要素を足す >' ( 2 3 ) ( 2 3 ) > >cons 1' ( 2 3 ) >#<procedure:cons> >1 > ( 2 3 ) > > ( cons 1' ( 2 3 )) ( 1 2 3 ) > > ( cons ' + ( cons 1' ( 2 3 ))) ( + 1 2 3 ) > > ( eval ( cons ' - ( cons 1' ( 2 3 )))) -4

2.演算の表記 前置記法で演算を行う．また、データであることを表す時も前置記法としてシングルクオテーションをつける．たとえば > ( + 1 2 3 ) 6 > > ( * 3 ( + 1 2 3 )) 18 > > ( cons ' + ( cons 1' ( 1 2 3 4 ))) ( + 1 1 2 3 4 ) > > ( cons ' + '( cons 1 '( 1 2 3 4 ))) ( + cons 1 '( 1 2 3 4 ))

3.関数指定、ラムダ演算 関数を定義するとき、ラムダ演算というものを実行する． (define 関数名 (lambda (引数 ...) 式)) って言う形をとる．

たとえば、２乗する関数を定義してみる． > ( define pow2 ( lambda ( x ) ( * x x ))) > > ( pow2 3 ) 9 > > (( lambda ( x ) ( * x x )) 3 ) 9

4.条件式 if文 形式は

(if 条件 帰結式 代替式)

で表す．if文は構文(ご指摘を受けまして直しました．)であるため、値を持つ必要がある．つまり帰結式は省略できない． > ( define ! ( lambda ( x )( if ( = ( - x 1 ) 0 ) 1 ( * x ( ! ( - x 1 )))))) > > ( ! 3 ) 6 > > ( ! 4 ) 24 define文で書いたのは



という の階乗の定義そのもの． 構文と手続きの違い…．難しいな．

5.ちょっと高度なcond式 elseが無ぇ．．．と思いましたが、cond条件式というものを使えば出すことができるようです．

(cond (条件1 式1)

(条件2 式2)

…

(else 式n) )

っていう形で書くことができるそうです．たとえば、二つの引数の乗算をの結果が０より大きいか０より小さいか、０なのかを評価する関数を定義してみる． > ( define compare ( lambda ( x y ) ( cond ( ( > ( * x y ) 0 ) '( larger than 0 ) ) ( ( < ( * x y ) 0 ) '( less than 0 ) ) ( ( = ( * x y ) 0 ) '( equal 0 ) ) ))) > > ( compare 3 4 ) ( larger than 0 )

6.演算子の適用 (+ 1 2 3 4)って書くのはめんどい．なんで、(1 2 3 4)に"+"演算子を適用しようってニュアンス．

(apply 関数 リスト)

の形で表しマース．

では、平均値を表示する関数を定義しましょう． > ( define ave ( lambda ( l ) ( / ( apply + l ) ( length l ) ) ) ) > > ( ave '( 1 2 3 4 5 6 7 8 9 10 )) 11/2 ここでの(length l)はlの要素数を表すもの．四則演算のみならず、defineで定義した関数に関しても適用できるのがみそ．

7.写像を表現しましょう applyの進化版っぽくとらえてます．形はapplyのときと同じく

(map 関数 リスト)

使い方もapplyと同じような気がする．すべての要素を負の数にするminus関数を定義、mapで写像として移してやる． > ( define minus ( lambda ( x ) ( if ( > x 0 ) ( * x -1 ) x ) ) ) > > ( map minus '( -1 2 -3 -4 5 6 -7 )) ( -1 -2 -3 -4 -5 -6 -7 ) > > > ( apply minus '( -1 2 -3 -4 5 6 -7 )) procedure minus: expects 1 argument, given 7: -1 2 -3 -4 5 6 -7 >

8.リストの操作についてもうちょっと ここまで出てきたリスト操作として先頭に一つのデータを加えるconsがあった．ここではほかのリスト操作についてやっていく．

・car:リストの先頭のデータを取得

・cdr:リストの２要素目以降からなるリストを取得

・cons:リスト先頭に要素を加える

これが基本的なもの．これらを駆使していくことで、リストを自由自在に、なりたいところ。。。