Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ラムダ計算に基づいた純粋関数型言語の実装 ~パーサーコンビネータを使ってみる~ #Te...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Livesense Inc.
PRO
April 23, 2014
Technology
250
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ラムダ計算に基づいた純粋関数型言語の実装 ~パーサーコンビネータを使ってみる~ #TechLunch
2011/05/18(水) @ Livesense TechLunch
発表者:塩足 拓也
Livesense Inc.
PRO
April 23, 2014
More Decks by Livesense Inc.
See All by Livesense Inc.
Rubyはただの⾔語に⾮ず
livesense
PRO
0
500
28新卒_Webエンジニア職採用_会社説明資料
livesense
PRO
0
120
27新卒_総合職採用_会社説明資料
livesense
PRO
0
6.8k
27新卒_Webエンジニア職採用_会社説明資料
livesense
PRO
0
12k
株式会社リブセンス・転職会議 採用候補者様向け資料
livesense
PRO
0
530
株式会社リブセンス 会社説明資料(報道関係者様向け)
livesense
PRO
1
1.8k
データ基盤の負債解消のためのリプレイス
livesense
PRO
0
670
26新卒_総合職採用_会社説明資料
livesense
PRO
0
13k
株式会社リブセンス会社紹介資料 / Invent the next common.
livesense
PRO
2
73k
Other Decks in Technology
See All in Technology
【CEDEC2026】Creative Approaches to Localizing the Dialects and Unique Speech of Umamusume: Pretty Derby Characters in English
cygames
PRO
4
26k
VLMで2.3万枚のPyCon JP写真を検索!
terapyon
1
420
RelayerというPHPのフレームワークを作った
polidog
PRO
0
130
DDDのエッセンスを取り入れたAIでの開発
ak2ie
1
220
会社紹介資料 / Sansan Company Profile
sansan33
PRO
24
430k
tamachi.go 誕生の裏側
rymiyamoto
1
200
LLM Internals: 언어 모델의 계보와 알고리즘 진화 (2023~2026)
inureyes
PRO
1
890
What's new in Go 1.27?
ciarana
0
370
形式手法特論:Hyperproperty とモデル検査 #kernelvm / Kernel VM Study Tokyo 19th
ytaka23
0
730
NANDでも描画したい!
nichica906
3
630
8bit CPU 2026
koba789
7
2.7k
35分でわかるEffective Platform Engineering
nwiizo
5
620
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
How to make the Groovebox
asonas
2
2.3k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
300
Designing Experiences People Love
moore
143
24k
Writing Fast Ruby
sferik
630
63k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
380
Raft: Consensus for Rubyists
vanstee
141
7.6k
Into the Great Unknown - MozCon
thekraken
41
2.7k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Done Done
chrislema
186
16k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Transcript
ラムダ計算に基づいた純粋関数型 言語の実装 2011/05/18 Takuya Shiotari ~パーサーコンビネータを使ってみる~
AGENDA ¢ Abstrac,on ¢ Design policy ¢ Programming
Language & Compiler ¢ Func,onal Language ¢ What’s Lambda calculus? ¢ Parser Combinator ¢ rparsec
ABSTRACTION 動機 目的 ラムダ計算に基づいたプログラミング言語の設計・実装を行う なんか関数型言語って流行っぽい… んで、その関数型言語でパーサーコンビネータってのがおもろいらしい… おっしゃー!やってみるか!! やるんだったら言語作りたいよね でも、あんまり実用的な言語意識しすぎると設計で終わっちゃいそうだなぁ…
じゃ、超シンプルな言語仕様で実装しよう!!!!
DESIGN POLICY ¢ 実装言語はRuby ¢ インタプリタとして実装 ¢ 実装を単純化するためにIO等は実装しない
¢ パフォーマンスは一切考えない ¢ 文法はLisp-‐Like ¢ Scanner/ParserはParser Combinatorで実装する
PROGRAMMING LANGUAGE & COMPILER 別紙
FUNCTIONAL LANGUAGE 純粋関数型言語 ¢ Haskell、Concurrent Clean、Miranda
非純粋関数型言語 ¢ ML、Lisp、Scheme、OCaml、F# ラムダ計算の概念に基づいたプログラミング言語 特徴 第一級関数(First class func,on) 副作用(side effects)なし カリー化(carrying) 遅延評価(lazy evalua,on) 代表的な言語
関数の定義と実行を抽象化した計算モデル WHAT’S LAMBDA CALCULUS? <expr> ::= <iden,fier>
| (“λ” <iden,fier> “.” <expr>) | (<expr> <expr>) 例 f(x) = x + 1 λ.x x+1 変数 ラムダ抽象 関数適用 ラムダ抽象 f(2) (λ.x x+1) 2 関数適用
PARSER COMBINATOR ¢ 最近流行のトップダウン構文解析 ¢ 基本的なアイデアはパーサを結合子で合成して複雑な パーサを生成 ¢
BNFからコードに落とし込むのが簡単 ¢ 実装と文法定義で言語にギャップレス ¢ ScannerとParserでギャップレス
RPARSEC require 'rubygems' require 'rparsec' include RParsec::Parsers
eol = string ?\n quoted_char = not_char(?") | string('""') >> value(?") quoted_cell = char(?") >> quoted_char.many.bind { |s| value(s.join('')) } << char(?") cell = quoted_cell | regexp(/[^,"\n]*/) line = cell.separated(char(?,)) csv_file = (line << eol).many csvパーサ
RPARSEC require 'rubygems' require 'rparsec' include RParsec::Parsers
include RParsec::Functors ops = RParsec::OperatorTable.new do |tbl| tbl.infixl(string(?+) >> Plus, 10) tbl.infixl(string(?-‐) >> Minus, 10) tbl.infixl(string(?*) >> Mul, 20) tbl.infixl(string(?/) >> Div, 20) tbl.prefix(string(?-‐) >> Neg, 50) end expr = nil term = integer.map(&To_i) | string(?() >> lazy { expr } << string(?)) delim = whitespace.many_ expr = delim >> RParsec::Expressions.build(term, ops, delim) calc
次回予告 ¢ ラムダ計算の実装 ¢ ラムダ式を用いて自然数を定義(チャーチ数) 0 := λf x.
x 1 := λf x. f x 2 := λf x. f (f x) 3 := λf x. f (f (f x))