schemeでフィボナッチ

ある日友人と飲んでた際にプログラミング言語を勉強して
使えるようになったのならフィボナッチくらい書けて当たり前
フィボナッチは初歩の初歩の初歩!という事を言われたので
ちょっと心配になりました
なので今まで勉強してきた言語でフィボナッチを書こうと決めました
Haskellは途中だしSICPも1章までしか読んでないしPythonは現在進行中ですが
やると決めたので!!!!
フィボナッチは公式は覚えてたのですがちゃんと内容を覚えていなかったので
ココでもう一度概要を把握

慚化式 (Fn-1)+(Fn-2) ただしF(0)=0 F(1)=1

Fnの1つ前と2つ前の答えを足したものがFnになるのですね
私はこの辺普通に間違った事を言っていましたw
さてこれをschemeで書く訳ですが私はカウンター積などが
ちゃんと使えないのでcondを使いました

(define (fib n) 
  (cond ((= n 0) 0)
    ((= n 1) 1)
    (else (+ (fib (- n 1)) (fib (- n 2))))))

4行目のfibを最初書き忘れてましたがcond~hoge else~と書く
文法のほうではあまり時間がかからずにかけました
(emacsからのコピペミスをしてた分の時間かかったかもorz)
そしてcond文の書き方はあともう1種類cond(fuga1)...(hoge1)
のような書き方があるのでそちらもかけるはずと思って書いていましたが
なかなかかけなくてかなり迷走しました

define (fib n) 
 (cond ((= n 0) 0)
       ((= n 1) 1)
       ((< n 2) (+ (fib (- n 2))(fib(- n 1)))))

最初のほうでこんなコードを書いてて
本当はn≦2を表現したいのに上のコードだと全然だめですよね
n=2の時はどうなってしまうの?みたいな・・・
そこで次に書いたコード

(define (fib n) 
  (cond ((= n 0) 0)
        ((= n 1) 1)
        ((=< n 2)(+ (fib (- n 1)) (fib (- n 2))))))

またこれもerrorなんですけど(=< n 2)がおかしい
そこで今度は=<の符号を別々にして<と>の符号の向きが違ってたので
そこを直したら大丈夫だろうと考えました

(define (fib n) 
  (cond ((= n 0) 0)
        ((= n 1) 1)
        (= (> n 2) (+ (fib (- n 1)) (fib (- n 2))))))

ちゃんと答え返してくる!!
コレで安心して今朝方寝た訳なんですけどこのコードが不可解との
ご指摘があり考えてみました
このコードでちゃんと答えは返して来るんです
私的には(> n 2)であるならば (+ (fib (- n 1)) (fib (- n 2)))と=とみなして
答えを返してくると思ってたのですがこのコードを読み直してみると

        (= (> n 2) (+ (fib (- n 1)) (fib (- n 2)))

括弧の位置がおかしいかも?
私がやりたかったのは(n)の場合は(m)と返すというコードなのだから・・・
なので書き直すなら

        (= (> n 2)) (+ (fib (- n 1)) (fib (- n 2))

となってgoshでは#tが返って来た
これもまた指摘されたように=に対応するモノがないという事と
値がtrueであるならば=を返すって事かな??
この辺考えてるけどやっぱり分かってないと思う
そして以上の事を踏まえてかいたコードがこれ

(define (fib n) 
  (cond ((= n 0) 0)
        ((= n 1) 1)
        ((>= n 2)(+ (fib (- n 1)) (fib (- n 2))))))

>=だと大丈夫だけど=>ならerrorです
この辺は符号の優先順位の問題だと思うのでまぁいいか・・・
一番簡単に書けるはずのschemeのフィボナッチでこんなに躓いてて
HaskellとかPythonで書けるのか心配になって来た・・・orz
体調悪めなのでHaskellの分は明日中に書ければいいって事に決めました!
追記 ◯線形反復プロセス ×カウンター積 分かりにくくてゴメンナサイ