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
Livesense Inc.
April 23, 2014
Technology
0
230
ラムダ計算に基づいた純粋関数型言語の実装 ~パーサーコンビネータを使ってみる~ #TechLunch
2011/05/18(水) @ Livesense TechLunch
発表者:塩足 拓也
Livesense Inc.
April 23, 2014
Tweet
Share
More Decks by Livesense Inc.
See All by Livesense Inc.
27新卒_総合職採用_会社説明資料
livesense
0
3.5k
27新卒_Webエンジニア職採用_会社説明資料
livesense
0
7.7k
株式会社リブセンス・転職会議 採用候補者様向け資料
livesense
0
270
株式会社リブセンス 会社説明資料(報道関係者様向け)
livesense
1
1.7k
データ基盤の負債解消のためのリプレイス
livesense
0
570
26新卒_総合職採用_会社説明資料
livesense
0
13k
株式会社リブセンス会社紹介資料 / Invent the next common.
livesense
2
57k
26新卒_Webエンジニア職採用_会社説明資料
livesense
1
13k
中途セールス職_会社説明資料
livesense
0
300
Other Decks in Technology
See All in Technology
Phase06_ClaudeCode実践
overflowinc
0
2k
Bill One 開発エンジニア 紹介資料
sansan33
PRO
5
18k
A4)シラバスを超えて語る、テストマネジメント
moritamasami
0
130
やさしいとこから始めるGitHubリポジトリのセキュリティ
tsubakimoto_s
0
560
夢の無限スパゲッティ製造機 #phperkaigi
o0h
PRO
0
360
From Senior to Staff : To infinity and beyond !
kuahyeow
0
110
GitHub Copilot CLI で Azure Portal to Bicep
tsubakimoto_s
0
190
君はジョシュアツリーを知っているか?名前をつけて事象を正しく認識しよう / Do you know Joshua Tree?
ykanoh
4
130
非同期・イベント駆動処理の分散トレーシングの繋げ方
ichikawaken
1
100
MCPで決済に楽にする
mu7889yoon
0
110
AIエージェント勉強会第3回 エージェンティックAIの時代がやってきた
ymiya55
0
120
Phase12_総括_自走化
overflowinc
0
1.5k
Featured
See All Featured
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
130
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
64
54k
Imperfection Machines: The Place of Print at Facebook
scottboms
269
14k
How to make the Groovebox
asonas
2
2k
Designing for humans not robots
tammielis
254
26k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
410
New Earth Scene 8
popppiees
1
1.8k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
390
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
650
A Modern Web Designer's Workflow
chriscoyier
698
190k
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))