Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
EN
Uploaded by
stibear (stibear1996)
PDF, PPTX
8,658 views
Lisp講義1
use in the Lisp lesson of NPCA
Read more
31
Save
Share
Embed
Embed presentation
Download
Download as PDF, PPTX
1
/ 101
2
/ 101
3
/ 101
4
/ 101
5
/ 101
6
/ 101
7
/ 101
8
/ 101
9
/ 101
10
/ 101
11
/ 101
12
/ 101
13
/ 101
14
/ 101
15
/ 101
16
/ 101
17
/ 101
18
/ 101
19
/ 101
20
/ 101
21
/ 101
22
/ 101
23
/ 101
24
/ 101
25
/ 101
26
/ 101
27
/ 101
28
/ 101
29
/ 101
30
/ 101
31
/ 101
32
/ 101
33
/ 101
34
/ 101
35
/ 101
36
/ 101
37
/ 101
38
/ 101
39
/ 101
40
/ 101
41
/ 101
42
/ 101
43
/ 101
44
/ 101
45
/ 101
46
/ 101
47
/ 101
48
/ 101
49
/ 101
50
/ 101
51
/ 101
52
/ 101
53
/ 101
54
/ 101
55
/ 101
56
/ 101
57
/ 101
58
/ 101
59
/ 101
60
/ 101
61
/ 101
62
/ 101
63
/ 101
64
/ 101
65
/ 101
66
/ 101
67
/ 101
68
/ 101
69
/ 101
70
/ 101
71
/ 101
72
/ 101
73
/ 101
74
/ 101
75
/ 101
76
/ 101
77
/ 101
78
/ 101
79
/ 101
80
/ 101
81
/ 101
82
/ 101
83
/ 101
84
/ 101
85
/ 101
86
/ 101
87
/ 101
88
/ 101
89
/ 101
90
/ 101
91
/ 101
92
/ 101
93
/ 101
94
/ 101
95
/ 101
96
/ 101
97
/ 101
98
/ 101
99
/ 101
100
/ 101
101
/ 101
More Related Content
PPTX
(Lambdaだけで)純LISPのようなナニかを作る
by
Daichi Teruya
KEY
ラムダ計算入門
by
Eita Sugimoto
PDF
関数プログラミング入門
by
Hideyuki Tanaka
PPTX
純粋関数型アルゴリズム入門
by
Kimikazu Kato
KEY
Algebraic DP: 動的計画法を書きやすく
by
Hiromi Ishii
PDF
たのしい高階関数
by
Shinichi Kozake
KEY
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
by
Hiromi Ishii
ODP
(define)なしで再帰関数を定義する
by
blackenedgold
(Lambdaだけで)純LISPのようなナニかを作る
by
Daichi Teruya
ラムダ計算入門
by
Eita Sugimoto
関数プログラミング入門
by
Hideyuki Tanaka
純粋関数型アルゴリズム入門
by
Kimikazu Kato
Algebraic DP: 動的計画法を書きやすく
by
Hiromi Ishii
たのしい高階関数
by
Shinichi Kozake
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
by
Hiromi Ishii
(define)なしで再帰関数を定義する
by
blackenedgold
What's hot
PDF
Freer Monads, More Extensible Effects
by
Hiromi Ishii
ODP
Real World OCamlを読んでLispと協調してみた
by
blackenedgold
PDF
たのしい関数型
by
Shinichi Kozake
PDF
Scala 初心者が米田の補題を Scala で考えてみた
by
Kazuyuki TAKASE
PDF
あなたのScalaを爆速にする7つの方法(日本語版)
by
x1 ichi
PDF
Thinking in Cats
by
Eugene Yokota
PDF
Scala 初心者が Hom 函手を Scala で考えてみた
by
Kazuyuki TAKASE
PDF
これから Haskell を書くにあたって
by
Tsuyoshi Matsudate
PDF
Material
by
_TUNE_
PDF
Haskell超入門 Part.1
by
Yuichi Watanabe
PDF
Introduction to Categorical Programming
by
Masahiro Sakai
PDF
関数型プログラミング入門 with OCaml
by
Haruka Oikawa
PDF
Introduction to Categorical Programming (Revised)
by
Masahiro Sakai
PDF
Haskell勉強会 in ie
by
maeken2010
PPTX
IdrisでWebアプリを書く
by
Hideyuki Tanaka
PDF
Extensible Eff Applicative
by
Sanshiro Yoshida
PDF
Scalaで型クラス入門
by
Makoto Fukuhara
PDF
はてなブックマーク in Scala
by
Lintaro Ina
PDF
Scala の関数型プログラミングを支える技術
by
Naoki Aoyama
PDF
2011年11月11日
by
nukaemon
Freer Monads, More Extensible Effects
by
Hiromi Ishii
Real World OCamlを読んでLispと協調してみた
by
blackenedgold
たのしい関数型
by
Shinichi Kozake
Scala 初心者が米田の補題を Scala で考えてみた
by
Kazuyuki TAKASE
あなたのScalaを爆速にする7つの方法(日本語版)
by
x1 ichi
Thinking in Cats
by
Eugene Yokota
Scala 初心者が Hom 函手を Scala で考えてみた
by
Kazuyuki TAKASE
これから Haskell を書くにあたって
by
Tsuyoshi Matsudate
Material
by
_TUNE_
Haskell超入門 Part.1
by
Yuichi Watanabe
Introduction to Categorical Programming
by
Masahiro Sakai
関数型プログラミング入門 with OCaml
by
Haruka Oikawa
Introduction to Categorical Programming (Revised)
by
Masahiro Sakai
Haskell勉強会 in ie
by
maeken2010
IdrisでWebアプリを書く
by
Hideyuki Tanaka
Extensible Eff Applicative
by
Sanshiro Yoshida
Scalaで型クラス入門
by
Makoto Fukuhara
はてなブックマーク in Scala
by
Lintaro Ina
Scala の関数型プログラミングを支える技術
by
Naoki Aoyama
2011年11月11日
by
nukaemon
Similar to Lisp講義1
PDF
Lisp tutorial for Pythonista : Day 2
by
Ransui Iso
PPTX
Gaucheでマクロを書こう
by
Hideaki Nagamine
PPT
言語処理系入門4
by
Kenta Hattori
PDF
Tapl 5
by
rf0444
PDF
関数型軽い紹介
by
Daniel Perez
PDF
PythonでLispを実装した (evalつき)
by
t-sin
PDF
Lisp study
by
Taichi Kimura
PPTX
90分 Scheme to C(勝手に抄訳版)
by
ryos36
PDF
Lisperはじめました
by
Nobutada Matsubara
PDF
Proof and Emacs
by
dico_leque
PDF
Lispでやる記号微分
by
Keiichi Watanabe
PPTX
Lisp eval かるた
by
Hiroshi Koide
PDF
Lispとは何なのか - 同図像性がもたらす力とその利用法
by
Naoya Yamashita
PDF
関数型都市忘年会『はじめての函数型プログラミング』
by
Kenta USAMI
PDF
Look at-the-lisper
by
home
PPTX
JOI-summer-seminar
by
chigichan24
PDF
Scheme Interpreter in Ruby
by
Masato HORINOUCHI
PDF
第1回勉強会スライド
by
koturn 0;
PDF
[Basic 12] 関数型言語 / 型理論
by
Yuto Takei
PPT
Pythonintro
by
Mikio Kubo
Lisp tutorial for Pythonista : Day 2
by
Ransui Iso
Gaucheでマクロを書こう
by
Hideaki Nagamine
言語処理系入門4
by
Kenta Hattori
Tapl 5
by
rf0444
関数型軽い紹介
by
Daniel Perez
PythonでLispを実装した (evalつき)
by
t-sin
Lisp study
by
Taichi Kimura
90分 Scheme to C(勝手に抄訳版)
by
ryos36
Lisperはじめました
by
Nobutada Matsubara
Proof and Emacs
by
dico_leque
Lispでやる記号微分
by
Keiichi Watanabe
Lisp eval かるた
by
Hiroshi Koide
Lispとは何なのか - 同図像性がもたらす力とその利用法
by
Naoya Yamashita
関数型都市忘年会『はじめての函数型プログラミング』
by
Kenta USAMI
Look at-the-lisper
by
home
JOI-summer-seminar
by
chigichan24
Scheme Interpreter in Ruby
by
Masato HORINOUCHI
第1回勉強会スライド
by
koturn 0;
[Basic 12] 関数型言語 / 型理論
by
Yuto Takei
Pythonintro
by
Mikio Kubo
More from stibear (stibear1996)
PDF
EROSについて
by
stibear (stibear1996)
PDF
Lisp on Lisp
by
stibear (stibear1996)
PDF
Dogfooding
by
stibear (stibear1996)
PDF
灘校パソコン研究部(NPCA)におけるLispの活用について
by
stibear (stibear1996)
PDF
IMのはなし
by
stibear (stibear1996)
PDF
PXE @第一回成果報告会(2012/12/17)
by
stibear (stibear1996)
ODP
しがないLisperのつまらないLT
by
stibear (stibear1996)
EROSについて
by
stibear (stibear1996)
Lisp on Lisp
by
stibear (stibear1996)
Dogfooding
by
stibear (stibear1996)
灘校パソコン研究部(NPCA)におけるLispの活用について
by
stibear (stibear1996)
IMのはなし
by
stibear (stibear1996)
PXE @第一回成果報告会(2012/12/17)
by
stibear (stibear1996)
しがないLisperのつまらないLT
by
stibear (stibear1996)
Lisp講義1
1.
stibear (@stibear1996) LISP講義 PART Ⅰ
2.
LISPの文法 いきなり…
3.
と,その前に…
4.
Scheme • Lispには,たくさんの方言があります • 今回の講義では,その中でも,Schemeを使います •
理由としては,シンプルで理解しやすいと思われるためです
5.
• 3 • 3 •
6 • 2 • (+ 1 2) • (- 5 2) • (* 2 3) • (/ 8 4) LISPの文法 式(プログラム) 評価結果(実行後)
6.
簡単にはこんな感じ
7.
仕組み • 読み込み(READ) • 評価(EVAL) •
表示(PRINT) • これがループして行われる • REPL(Read-Eval-Print Loop)と呼ばれる
8.
LISPの式 (+ 1 2) 演算子
引数
9.
LISPの式 (+ 1 2) 演算子
引数 ※ 引数は演算子に先行して評価されます
10.
文法に関してはこれだけ
11.
LISPの構文1 さて次は…
12.
• x • y •
30 • ERROR!! • (define x 10) • (define y 20) • (+ x y) • (* x z) define 式(プログラム) 評価結果(実行後)
13.
仕組み • Lispの環境に記憶 • (define
x 10)とすると,xは10と記憶される • 環境に記憶することを束縛という • xは10に束縛される,という
14.
図解 環境 x=10 y=20
… … … (define x 10) x (define y 20) y 束縛 (+ x y) 30 評価 参照
15.
ならば…
16.
(+ x 40)とすると?
17.
図解 (+ x 40)
50 評価 10 40
18.
整数はそのまま整数に評価されます
19.
シンボル • xやyといったものは,シンボルと呼ばれます • シンボルはhoge,stibearなどなんでも良い •
hideo54やsaiko-no-natsuもシンボルとして扱えます
20.
define • よって,defineはシンボルと値を結びつけます • つまり,束縛するということです
21.
アトムとリスト Lispといえば…
22.
リストとアトム • ()で囲われた式をリストといいます • そうでないものをアトムといいます •
(+ 1 2) • (define hoge fuga) • (foo bar baz) • これらはすべてリスト • a • 200 • これらはすべてアトム
23.
LISPの構文2 try to eat...
24.
いきなりですが
25.
40を評価すると40です
26.
では
27.
何を評価すると シンボルxになるでしょう?
28.
答え:quoteを使います
29.
• x • hoge •
saiko-no-natsu • (quote foo) • (quote x) • (quote hoge) • (quote saiko-no-natsu) • (quote (quote foo)) quote 式(プログラム) 評価結果(実行後)
30.
quote • quoteを使うと,評価を1回止めることができます • 便利のため,(quote
何々)と書く代わりに,‘何々と書けます
31.
評価のおさらい 環境 x=10 y=20
… … … (quote x) x x 10 評価 参照 評価
32.
(define husband ‘wife)として
33.
husbandを評価すると?
34.
答え:シンボルwifeが返ります
35.
特殊オペレータ すぺしゃる!
36.
特殊オペレータ • quoteやdefineはすべての引数が必ずしも評価されません • これらが特殊オペレータであるためです •
ほかにも,ifなどが特殊オペレータです • 特殊オペレータが成す式を特殊フォームといいます
37.
関数 • 特殊オペレータに対して,+や-のような, 引数がすべて評価されるような演算子を関数といいます • (関数
引数0 引数1...)のような式を関数呼び出しといいます • 関数呼び出しを評価すると,関数の返り値が得られます
38.
同図像性 ホモイコニシティ
39.
いきなりの難しいセクション!
40.
しかし, これぞLispの神髄であります
41.
同図像性 • 簡単に言うと, • プログラムである式とデータである値が等価だということ
42.
ところで
43.
リスト • 括弧で囲われた式はリスト • コンスによって成ります
44.
コンス • コンスはcar部とcdr部という2つの記憶域を持ちます • コンスは関数consによって作ることができます •
(cons ‘a ‘b)→(a . b) • (a . b)はcar部にシンボルa,cdr部にシンボルbを持ちます
45.
コンス car (cons 'a 'b)
(a . b) cdr a b 評価
46.
コンス • 関数carや関数cdrでそれぞれcar部,cdr部が得られます • (car
(cons ‘a ‘b))→a • (cdr (cons ‘a ‘b))→b • コンスは値へのアドレスを持っているだけ • なのでどんな値も格納できます • コンスのcdr部がコンスなら,ドットは省略されます • (cons 'a (cons 'b 'c))→(a b . c)
47.
コンス car (cons 'a (cons
'b 'c)) (a b . c) cdr a b 評価 c car cdr
48.
コンス • コンスのcdr部が空リスト()だった場合,cdr部の表示は省略 • (cons
‘a (cons ’b ‘())→(a b)
49.
コンス car (cons 'a (cons
'b '())) (a b) cdr a b 評価 car cdr
50.
リスト(再定義) • 空リスト • もしくは,cdr部にリストを格納したコンス
51.
リスト 空リスト 値 値 値
52.
リスト(a b c)を作るには •
(cons ‘a (cons ‘b (cons ‘c ‘()))) • ‘(a b c) • (list ‘a ‘b ‘c)
53.
という訳で
54.
データと式は一緒ですね
55.
ちなみに
56.
リストのcdr • (car ‘(a
b c))→a • (cdr ‘(a b c))→(b c)
57.
リストのcdr car cdr a b
c car cdr car cdr このコンスのcdrを取る
58.
リストのcdr b c car cdr
car cdr
59.
関数 ふぁ,ふぁ,ふぁんくしょんっ
60.
関数を作ってみましょう
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 式(プログラム) 評価結果(実行後)
63.
関数 • 関数も値 • よってdefineを使ってシンボルを束縛できる •
(define plus1 (lambda (n) (+ n 1))) • これでplus1というシンボルを使って関数呼び出しができます • (plus1 29)→30
64.
関数 • (lambda (仮引数...)
式...) • 仮引数は束縛変数とも呼ばれ,その関数内でのみ参照できます • つまり,束縛変数のスコープはその関数内ということです • 対して,どこでも参照できる変数を大域変数といいます • 束縛変数の,大域変数に対応する呼び方として, • 局所変数という呼び方もあります • 関数は,環境を新たに作ることで,束縛変数を実現しています
65.
関数 環境 x=10 y=20
… … … ((lambda (x y) (+ x y)) 2 3) 束縛 新たな環境 x=2 y=3 参照
66.
LISPの構文3 Let It Be
67.
let • 局所変数を定義するために,let特殊オペレータを使います • (let
((a 2) (b 3)) (+ a b))→5 • 簡単ですね • let特殊オペレータは新たに環境を作ります
68.
let 環境 x=10 y=20
… … … (let ((x 2) (y 3)) (+ x y)) 束縛 新たな環境 x=2 y=3 参照
69.
lambdaの時とそっくりですね
70.
let • letはlambdaの構文糖衣として考えることができます • つまり,letはlambdaと等価です •
(let ((a 2) (b 3)) (+ a b)) • ((lambda (a b) (+ a b)) 2 3)
71.
構文糖衣 • syntax-sugerの訳語 • Wikipediaには,次のように書いてあります 糖衣構文(とういこうぶん)は、プログラミング言語において、読み 書きのしやすさのために導入される構文であり、既に定義されている 他の構文の(人間にとってより理解しやすい)書換えとして定義され るもののことである。構文糖(こうぶんとう)あるいは構文糖衣とも いう。
72.
構文糖衣 • quoteの構文糖衣として,「’」があります • また,関数と定義するときの構文糖衣として,次のように書けます •
(define hoge (lambda (foo) (bar baz))) • (define (hoge foo) (bar baz)) • どちらも正しい関数定義です
73.
スコープ ちょっと脱線
74.
スコープ • 関数の説明の時にも出てきました • その変数が見えている(=参照可能な)範囲のことです •
トップレベルでdefineすると,変数のスコープはグローバルに • 関数の仮引数やletで定義された変数のスコープは,ローカルに なります • また,Schemeは,レキシカルスコープと呼ばれる種類のスコープ を持ちます
75.
レキシカルスコープ • 字句的,構文,静的スコープなどともいいます • これによってクロージャ(関数閉包)というものを成します
76.
• x • test •
100 • 100 • (define x 100) • (define (test) x) • (test) • (let ((x 10)) (test)) レキシカルスコープ 式(プログラム) 評価結果(実行後)
77.
クロージャ 骨を折ります
78.
クロージャ • Schemeにおいて,クロージャは無名関数と同義であるといえます [要出典] • カプセル化や遅延評価などのためによく使います
79.
• counter • c1 •
1 • 2 • 3 • (define (counter) (let ((c 0)) (lambda () (set! c (+ c 1)) c))) • (define c1 (counter)) • (c1) • (c1) • (c1) クロージャ 式(プログラム) 評価結果(実行後)
80.
副作用 副作用使用罪だ!!
81.
副作用 • set!は副作用をもたらす特殊オペレータです • その他,displayなども副作用をもたらします •
破壊的代入やI/O制御は副作用を伴います
82.
再帰 私に還りなさい
83.
再帰 • あるものについて記述する際に、記述しているものそれ自身への参 照が、その記述中にあらわれることをいう(Wikipediaより) • 再帰的に関数を呼び出すことを再帰呼び出しといいます •
ある関数のなかでその関数が呼び出されているとき, それは再帰関数であるといえます
84.
• fact • 120 •
(define (fact n) (if (= n 0) 1 (* n (fact (- n 1)))) • (fact 5) 再帰関数 式(プログラム) 評価結果(実行後)
85.
末尾再帰 • 関数の末尾文脈での関数呼び出しは末尾呼び出しと呼ばれます • 再帰的な末尾呼び出しを末尾再帰といいます •
Schemeでは,末尾呼び出しが最適化されます • ループ構造と等価なものに展開され,スタックを消費しないものに なります • 非常に簡単にいうと,無駄が少ないです
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
89.
末尾再帰版fact関数呼び出し (fact 5) (fact-tc 5
1) (fact-tc 4 5) (fact-tc 3 20) (fact-tc 2 60) (fact-tc 1 120) (fact-tc 0 120) 120
90.
LISPの構文4 Let It Be再び
91.
named-let • 名前付きletというもので,ループを上手く書くことができます
92.
named-letを使ったfact関数 • (define (fact
n) (let rec ((a n) (b 1)) (if (= a 0) b (rec (- a 1) (* a b))))) • letrecを使って似たように定義ができます
93.
高階関数 今でもあなただけが 青春の...
94.
高階関数 • 関数を引数として取ったり,返り値として返したりする関数
95.
map関数 • リストの各要素にマッピング • (map
func list0 list1 ... listN)
96.
sort関数 • リストの要素をソート • (sort
lst func)
97.
fold関数 • 畳み込み
98.
演習 このセクションを書こうとした人は途中で寝てしまいました。
99.
適当に演習
100.
参考 • 今回このスライドを作るにあたって, http://lyrical.bugyo.tk/ (魔法言語
リリカル☆Lisp) を参考にしました • 非常に良い教材です
101.
終
Download