<< 「バースデイ」読了 | top | 「エス」読了 >>

スポンサーサイト

一定期間更新がないため広告を表示しています

スポンサードリンク | - | | - | - |

SICPメモ(8) 問題2.4

一章後半で待望のλが出てきたわけだが、よくわからんので軽く読んでスルーしていた。
少しずつλが増えてきてよくわからなくなってきたのでちょっとλで遊んでみることにした。

Schemeでいうlambdaって何かというと無名の関数を定義するものらしい。
実はこれまでdefineで関数を定義してきたのは暗にlambdaを呼んでいたらしい。

(define (f x) (* x x))

(define f (lambda (x) (* x x)))
の省略形らしい。無名関数にdifineで名前をつけているわけだ。
次のようにして値を得ることができる。

((lambda (x) (* x x)) 2)
4

2章前半で戸惑ったのは次のような感じの記述。
(define (f x)
  (lambda (m) (m x x))
  )

((f 3) *)
9

ん?関数fの引数はxだけなのにlambdaは引数にmっていう謎の変数がある!
これはどうやら
(f x)が(lambda (m) (m x x))に置き換えられるっぽい。たぶん。
なので
(f 3)は(lambda (m) (m 3 3))に置き換えられて、*を代入すれば3*3が得られるということかな。
ややこしい。
使っているうちに慣れるんだろうけど。
毎日少しでもコードを書かないと忘れてしまいそう。

とにかく、これがわかれば問題2.4が解ける。cons、carと同じ動作をする関数を定義していて、cdrも同じように定義しろという問題。問題自体は簡単だが、動作がややこしい。
(define (mycons x y)
  (lambda (m) (m x y))
  )

(define (mycar z)
  (z (lambda (p q) p))
  )

(define (mycdr z)
  (z (lambda (p q) q))
  )

(mycdr (mycons 2 3))
3

(mycons 2 3)は(lambda (m) (m 2 3))に置き換えられる。
(mycdr (mycons 2 3))は((mycons 2 3) (lambda (p q) q))に置き換えられ、これは((lambda (m) (m 2 3)) (lambda (p q) q))となる。mに(lambda (p q) q)を代入するわけだ。
するとp=2、q=3が代入され、qが取り出される。うーん、ややこしい。
ジャジャガッチ | LISP | 21:03 | comments(0) | trackbacks(0) |

スポンサーサイト

スポンサードリンク | - | 21:03 | - | - |
Comment









Trackback
URL:

07
--
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
--
>>
<<
--
PR
RECOMMEND
RECENT COMMENT
MOBILE
qrcode
OTHERS
Since 2013/09/17
LATEST ENTRY
CATEGORY
ARCHIVE
LINKS
PROFILE
SEARCH