2013-11-23

 そういえばScheme触ったことないなと思い出して先日からScheme演習を追っている。普通にパズル解いてる感覚。lispのコードって自分で書いている最中は読めるけど後になって読み返してみようと試みても挫折しそうになるくらい可読性がよろしくない。読みやすさのインデントを丁寧にすべきなんだろうけど、これは慣れか。でもコードは本当に書きやすい。楽しい。

 

Scheme

<参考資料>

Scheme演習(UT-IS, 2001)(http://www-ui.is.s.u-tokyo.ac.jp/~hara2001/scheme/)

 主にこれを読んだ。

WikiBooks/Scheme(http://ja.wikibooks.org/wiki/Scheme)

 読んでないけれどよくまとまっていそう。

・R5RS日本語訳(http://www.unixuser.org/~euske/doc/r5rs-ja/)

 演習のページと並行して読むと理解が厳密になる。

・R5RS原文(http://www.schemers.org/Documents/Standards/R5RS)

<環境周辺>

・使用したインタプリタ: Petite Chez Scheme (ver 8.4)

・OS: windows7

・インストールしてpathが通ったらcmd,petiteで呼び出し

・終了はctrl+D

・コメントアウトは";"

<文法など>

<define/lambda>

関数適用/手続き呼び出し

>(+ 1 2)

変数と関数の定義

(define <variable> <expression>)

> (define a 1)

(define (<variable> <arguments>) <body>)

bodyは複数式が可能で、最後の式の評価が戻り値になる

bodyではdefineなどの挿入や再帰呼び出しが可能

> (define (f x y) (* (* x x) (* y y)))

この関数定義は正確にはlambda式の省略からなる

lambda式は(lambda (<arguments>) <body>)という関数を作る構文

> (define f (lambda (x y) (* (* x x) (* y y))))

これはそもそも関数定義も(define <variable> <expression>)だということを意味する。

関数の定義においては未定義の変数や関数を記述することができる。それらが使用されるときまでに定義されれば問題ない。

 

<recursive>

再帰呼び出し

>(define (sum n)

    (if (= n 0) 0 (+ n (sum (- n 1)))))

リテラル単体で記述されるとき評価はそれ自身を返す(if文でよく使う気がする)

記述されている表現そのものを返す関数は(quote <parameter>)

 

<call by value>

関数では引数がすべて評価できないと実行が進まない(参考: 演習2-2)

if文では評価が分岐決定後なので以下が可能

> (if #t 1 x) ;xは未定義だが1が返される #tはtrueのリテラル,falseは#f

 

<newton法>

> (define (newton-meth f dx)

  (define (pr-f n)

    (/ (- (f (+ n dx)) (f n)) dx))

  (define (sub-apx f pr-f an)

    (if (> dx (abs (f an)))

        an

        (sub-apx f pr-f (- an (/ (f an) (pr-f an))))))

  (sub-apx f pr-f 1)

)

括弧の数合ってるか不安になって数えなおしている時間が非常にもったい無い。とりあえず演習2まで。

 

では。

広告を非表示にする