はじめに
 
Lisp経験者は読むだけ無駄です、悪しからず!!
以前からLisp(scheme)を触ってみたかった。
最古のプログラムであり至高、こんな言葉を耳にしたことがあります。
このフレーズだけでも気になっていたので、徐々に学習していこうかと。
ニッチな機械学習とも相性が良いみたいですね、60年も前に開発された言語なのに、恐るべし・・・
そんなわけで超絶初学者向けにはなるかな程度の備忘録です、よし、やってこ!!!
何はともあれHello World
 
とりあえずお決まりのご挨拶を・・・
printが出力する手続き、一つの処理は括弧で括るって感じですかね。
改行、インデントは影響がない様です。
(print "Hello World") ; Hello World
(print
    "Hello World")    ; Hello World
でけたでけた!!!
どの言語も第一歩を踏み出すだけでちょっと嬉しくなりますね。
  
演算してみる
 
簡単な演算を・・・
(print (+ 1 2))        ; 3
(print (+ 1 (* 2 3)))  ; 7
(print (+ 1/2 2/5 2))  ; 29/10
演算記号は基本的に他の言語と相違ないです。
しかし、なぜ演算式が 1 + 2 でなく + 1 2 なのだろう・・・
とも思ったのですが(print "Hello World")と同様に考えると理解できました。
飽くまでもソースは最初に手続き、内容といった規則性みたいですね。
 
上記の例でいうと
 
(print (+ 1 2))  =>  表示しろ、(+ 1 2)を 
(+ 1 2)            =>  足せ、1 と 2 を
といったところでしょうか。
 
 
3項以上、分数を含む場合もシンプルに演算可能です。
※分数でなく実数を扱うことも可能ですが割愛させていただきます。
真偽値
 
しつこい様ですが、同様に手続きを最初に!!
(print (= 1 1))      ; #t
(print (eq? 1 1))    ; #t
(print (= 1(+ 1 1))) ; #f
真偽値を返す手続きの一例は下記となります。
| 手続き | 内容 | 
|---|---|
| boolean? | 真偽値か | 
| string? | 文字列か | 
| number? | 数値か | 
| integer? | 整数か | 
| eq? | 等しいか | 
| = | 等しいか | 
eq?と=ですが下記の様に結果が異なります。
(print (= 1 1.0))    ; #t
(print (eq? 1 1.0))  ; #f
= は数値を、eq?は同一オブジェクトかどうかを比較しています。
また、値が等しいかどうかを調べる手続きの他にeqv? equal?がありますが
ちょっと調べる余裕なかったので今回は割愛します。
変数、条件分岐
 
変数 (define 変数名 式) // 型指定は不要
if関数 (if (条件式) (真の式) (偽の式))
 
こんな感じで定義できます。
; 変数定義
(define a 1)
(define b 2)
; if関数
(if (< a b)
    (print "aはbより小さいよ")
    (print "aはbより大きいよ")) ; aはbより小さいよ
 
; 変数書き換え
(set! a 3)
 
(print (if (< a b) "aはbより小さいよ" "aはbより大きいよ")) ; aはbより大きいよ
; 複文
(if (< a b)
  (begin
    (print "aはbより")
    (print "小さいよ"))
  (begin
    (print "aはbより")
    (print "大きいよ"))) ; aはbより大きいよ
おぉ、elseとか不要でスッキリしてますね、三項演算っぽくも書けるし、少しずつ最も美しい言語という名声を
実感してきた気がします。(気のせいです)
関数
関数の定義は以下です。
(define (関数名 引数)(処理))
; 引数を2倍する関数
(define (hoge x)(* x 2))
; 関数実行
(print(hoge 3)) ; 6
とまあこんな感じで。
あと、Schemeでは変数と関数も同列の扱いらしいです。
例えば関数hogeと同名の変数を定義して実行すると・・・
; hogeを再定義
(define hoge 10)
(print (hoge 10)) ; hogeは変数の為error
(print hoge)      ; 10
関数としてのhogeが変数hogeに上書きされるので注意!!
まとめ
Lisp(List processor)なのに今回はlistを扱ってませんw
ただ既にシンプルで無駄がない振る舞いに徐々に魅力を感じます。
次回はlambdaやらmapやら使ってちょっと関数型っぽい領域に入れたら、と思います、ではまた!!