More Related Content More from stibear (stibear1996)
More from stibear (stibear1996) (7) Lisp講義15. • 3
• 3
• 6
• 2
• (+ 1 2)
• (- 5 2)
• (* 2 3)
• (/ 8 4)
LISPの文法
式(プログラム) 評価結果(実行後)
12. • x
• y
• 30
• ERROR!!
• (define x 10)
• (define y 20)
• (+ x y)
• (* x z)
define
式(プログラム) 評価結果(実行後)
14. 図解
環境 x=10 y=20 … … …
(define x 10) x
(define y 20) y
束縛
(+ x y) 30
評価
参照
29. • x
• hoge
• saiko-no-natsu
• (quote foo)
• (quote x)
• (quote hoge)
• (quote saiko-no-natsu)
• (quote (quote foo))
quote
式(プログラム) 評価結果(実行後)
61. 関数
• 特殊オペレータlambdaを使って作ります
• (lambda (n) (+ n 1))
• 上は引数を1つとって,それに1を足したものを返す関数です
• 上の式で,nは仮引数で…とかいう話はCとかと一緒なので省略
• 呼び出す時は,リストの最初に置いて,その後に引数を続けます
• (+ 10 20)→30
• 同様に
• ((lambda (n) (+ n 1)) 10)→11
62. • #<procedure>
• 11
• 21
• (lambda (n) (+ n 1))
• ((lambda (n) (+ n 1)) 10)
• ((lambda (n) (+ n 1)) 20)
lambda
式(プログラム) 評価結果(実行後)
64. 関数
• (lambda (仮引数...) 式...)
• 仮引数は束縛変数とも呼ばれ,その関数内でのみ参照できます
• つまり,束縛変数のスコープはその関数内ということです
• 対して,どこでも参照できる変数を大域変数といいます
• 束縛変数の,大域変数に対応する呼び方として,
• 局所変数という呼び方もあります
• 関数は,環境を新たに作ることで,束縛変数を実現しています
76. • x
• test
• 100
• 100
• (define x 100)
• (define (test) x)
• (test)
• (let ((x 10)) (test))
レキシカルスコープ
式(プログラム) 評価結果(実行後)
79. • counter
• c1
• 1
• 2
• 3
• (define (counter)
(let ((c 0))
(lambda ()
(set! c (+ c 1))
c)))
• (define c1 (counter))
• (c1)
• (c1)
• (c1)
クロージャ
式(プログラム) 評価結果(実行後)
84. • fact
• 120
• (define (fact n)
(if (= n 0) 1
(* n (fact (- n 1))))
• (fact 5)
再帰関数
式(プログラム) 評価結果(実行後)
86. • (define (fact n)
(fact-tc n 1))
• (define (fact-tc n m)
(if (= n 0) m
(fact-tc (- n 1)
(* n m))))
• (define (fact n)
(if (= n 0) 1
(* n (fact (- n 1))))
末尾再帰
非末尾再帰版fact 末尾再帰版fact
87. 非末尾再帰版fact関数呼び出し
(fact 5)
(* 5 (fact 4))
(* 5 (* 4 (fact 3)))
(* 5 (* 4 (* 3 (fact 2))))
(* 5 (* 4 (* 3 (* 2 (fact 1)))))
(* 5 (* 4 (* 3 (* 2 (* 1 (fact 0))))))
(* 5 (* 4 (* 3 (* 2 (* 1 1)))))
88. 非末尾再帰版fact関数呼び出し
(* 5 (* 4 (* 3 (* 2 (* 1 1)))))
(* 5 (* 4 (* 3 (* 2 1))))
(* 5 (* 4 (* 3 2)))
(* 5 (* 4 6))
(* 5 24)
120