schemeまとめ(2:関数など) | SU-Ⅲ 電脳紀 Second

SU-Ⅲ 電脳紀 Second

基本的に雑記ですが、情報系の事も書きます。

注意!
メモ的なつもりで書いており、管理者もまだ勉強不足気味です。
誤りがあるかもしれません。
もし間違いがあったら分かりやすく教えていただけると嬉しいです。



関数
関数もdefineを使って定義できます。

……、
という前に
関数はlambdaで作れます
と習い始めたほうが良かったのではなかろうかと授業後思ってます。
もちろんdefineを使って省略する書き方も綺麗なんですが、
lambdaで書いたほうが個人的には何が書いてあるのか分かりやすいというか、
ある関数に関数を引数で与える時にわざわざ外部にdefineで定義してある関数を
引数として与えるようなまどろっこしいことをしなくて済むので。

lambdaを使った関数作成は次のように書けばできます。
(lambda (引数) (関数の本体))

例えばある値を受け取ってそれに5を加算して返す関数は以下のように書ける。
(lambda (x) (+ x 5))

ただこの関数、まだ名無しです。
そこでdefineを使ってこれをadd5と呼称しようとなると次のようになります。
(define add5 (lambda (x) (+ x 5)))

例えば試しに2を関数にあたえて7が返ってくるのを確かめたいってなった場合は
(add5 2)

とすれば7が返ってくる。
前回括弧で囲んだ時、一番左の何かでそれに続く引数を使って計算的なことを書きましたが
一番左の何かが今回は関数なのでこうも書けます。
((lambda (x) (+ x 5)) 2)

add5と呼称せずにダイレクトに使っているパターンです。
まあadd5とは何かって言われると(lambda (x) (+ x 5))となるので。
一発屋で済む関数はむしろこうやってdefineせずに書いたほうがいい感じになる場合もあります。


最初にdefineでやるのは好きじゃない的なことを言ったのは次のような書き方です。
add5の例で、lambdaを利用しない場合は
(define (add5 x) (+ x 5))

とも書けます。
でも個人的には「常にlambda使用縛り」をしておいてlambdaに慣れておいたほうが良いかなぁとか思ったり。
以後更新していくときはlambdaを必ず使って関数書きます。