SlideShare a Scribd company logo
1 of 24
楽しいプログラミング
~D言語~
Akihiro Shoji a.k.a alphaKAI
福井技術者の集い その5
自己紹介
• 鯖江高校3年生
• D言語と数学が大好き
• 最近はλ計算に強い興味
• 実は 福井技術者の集い の創始者だったり…
さて
• 楽しいプログラミングとは
• 短いコードでかけると楽だし楽しいよね??
• すなわち、ワンライナー!!
• 今回は”普通じゃない”D言語の世界について
• よって、これからの発表は”普通のD言語”の書
き方ではない(所謂 “変態的”な書き方)
ワンライナー #とは
• ここで言うワンライナーはmain関数の中には1文
しか存在せず、main以外の名前を持つ関数をグ
ローバルに定義しないこと と定義する
• ただし、import文や無名再帰のためのZ コンビネ
ータ(後述)を実現するテンプレートは含めない
とりあえず、まずはコー
ド
• こんなもの書きました
• ワンライナーでBase64エンコード!!!
• https://gist.github.com/alphaKAI/78b9c7ad31195a702
dde
• ワンライナーでBrainfuck処理系!!!
• https://gist.github.com/alphaKAI/946a0b3564d48916c
e94
ようこそ
D言語Lispへ
D言語Lispとは
• まず、Lispと書いてあるけどLispとは関係ない
• 単に括弧が多くて一瞬Lispのように見えるという
だけ
• 破壊的代入は悪だ!(あくまでも個人の感覚です)
• 破壊的代入の無い”クリーン”な世界を目指す
• 破壊的代入を行わない => ワンライナーになる
どうやるか
• λ式のネスト
• 無名再帰を導入(これでほぼ全ての事実現可能に)
• 無名再帰の実現はZ Combinatorを用いる
• 戻り値がvoidな関数呼び出しはカンマ演算子を用
いることで対処
λ式のネスト
• D言語ではλ式は以下のSyntax
• (arguments list) => expression;
• つまり、ネストとは例えば
• auto h = (int y) => (z => z * z)(y * 2);
• これは、f(x) = x^2, g(x) = x * 2として
• f(g(x)) = (x * 2)^2となるから
• f(g(x)) ⇔ h(x)
(明示的な)破壊的代入を処す
• たとえば、x = 2; y = x * 2という処理(ここでx == 2, y == 4)
• xに対して2を破壊的な代入をしている(yは形式的に書いているだけ)
• これを隠蔽する方法 -> λ式
• (x => x * 2)(2)とすればいい。
• やったね!!!
• つまり、変数はラムダ式の実引数として渡すことで隠蔽
• 値の授受は実引数として関数の実行結果を仮引数に渡すことで実現
ループを殺せ!!
• 簡単。再帰を用います。
• それも、無名再帰で
• 無名再帰とは
• 不動点コンビネータ(次ページで少し説明)を用
いて識別子に束縛されない関数を再帰するこ
と
不動点コンビネータの定義
• 高階関数gが不動点コンビネータであるとは
• 任意の関数fで p = g(f) としたとき、f(p) = pが成立するこ
と
• つまりは、∀ f, f(g(f)) = g(f) となるということ
• 詳しくは、Wikipediaを… (時間の都合上割愛)
• 有名な不動点コンビネータ(ハスケル・カリーによるもの)
• Y = (λf.(λx. f(x x))(λx. f(x x)))
ここでは、Zコンビネータ
• Zコンビネータは通常のYコンビネータを一部η変
換することで与えられる
• Z=λf. (λx. f(λy. x x y)) (λx. f(λy. x x y))
• これをD言語でそのまま落としこむのは難しい(型
による制約)
• 従ってここでは、テンプレートでの再帰によって
実現する
D言語でZ コンビネータ
• D言語でZ コンビネータを実現するには、型の制
約が厳しい => テンプレートによって実現
• 以下に示すテンプレートで実現
簡単な例
• ZコンビネータをZ(f)とする
• フィボナッチ数列の漸化式を落としこむと
メリット
• 名前空間を汚さない(重要)
• あくまでもラムダ式の一つなので再帰を行いた
い(つまり、ループを行いたい)処理を実現可能
カンマ演算子とは
• 一文の中で複数の式を評価させる夢の演算子
• 例: x = 2として, y = (x *= 2, 5)とすると
• y == 5, x == 4となる
• つまり。戻り値がvoidな関数を呼ぶ場合にこれを用い
ることでワンライナーを保てる
• y = (f(), g(x))とすることでf()が実行でき、yにg(x)を代
入できる(代入はしないので引数として渡す)
とりあえず
• D言語、最強だよね マジで
Dのさらなる楽しみへ
高速化を考える
• Dには任意の関数をメモ化するテンプレートが標準ライブラ
リにある
• std.functional.memoize
• ある関数fをメモ化した関数をgとすると
• alias g = memoize!f; でメモ化できる
• => 明示的な代入をせずにメモ化できる
• 先ほどのフィボナッチ数列の高速化
比較してみる
• (時間があれば)デモ
• (時間がなければ結果だけ)
こうなります…
まとめ
• D言語Lisp, 面白いですよ
• コードがなれないと読み難いし、難しいのでオススメはできませんが
…
• λ計算も楽しそうだよね
• あ、あと
• 以前発表した任意の関数をカリー化するテンプレートを用いること
でさらにD言語Lispが便利になります
• https://github.com/alphaKAI/kdtl/blob/master/source/curry.d
ご清聴ありがとうございました

More Related Content

What's hot

F#の基礎(?)
F#の基礎(?)F#の基礎(?)
F#の基礎(?)bleis tift
 
コンピュテーション式ハンズオン
コンピュテーション式ハンズオンコンピュテーション式ハンズオン
コンピュテーション式ハンズオンssuserb6e6d5
 
金大アルゴリズム勉強会#007資料
金大アルゴリズム勉強会#007資料金大アルゴリズム勉強会#007資料
金大アルゴリズム勉強会#007資料Takumi Murano
 
もがいているエンジニア集まれ~今度こそ英語をモノにしよう~
もがいているエンジニア集まれ~今度こそ英語をモノにしよう~もがいているエンジニア集まれ~今度こそ英語をモノにしよう~
もがいているエンジニア集まれ~今度こそ英語をモノにしよう~Kiyotaka Kunihira
 
Kanrk05 .Netでお仕事しているプログラマがスクリプト言語として使うRuby
Kanrk05 .Netでお仕事しているプログラマがスクリプト言語として使うRubyKanrk05 .Netでお仕事しているプログラマがスクリプト言語として使うRuby
Kanrk05 .Netでお仕事しているプログラマがスクリプト言語として使うRubyShinichi Okada
 
20170114 lod challenge
20170114 lod challenge20170114 lod challenge
20170114 lod challengezuhitoslide
 
Rubyのenum系高階関数を elixirでも使いたい
Rubyのenum系高階関数を elixirでも使いたいRubyのenum系高階関数を elixirでも使いたい
Rubyのenum系高階関数を elixirでも使いたいsotatashiro
 
2019年度チュートリアルBPE
2019年度チュートリアルBPE2019年度チュートリアルBPE
2019年度チュートリアルBPE広樹 本間
 
オブジェクト指向プログラマが今関数型言語を学ばないといけない理由
オブジェクト指向プログラマが今関数型言語を学ばないといけない理由オブジェクト指向プログラマが今関数型言語を学ばないといけない理由
オブジェクト指向プログラマが今関数型言語を学ばないといけない理由Kohei Taniguchi
 
括弧を使わないLispプログラミング
括弧を使わないLispプログラミング括弧を使わないLispプログラミング
括弧を使わないLispプログラミングYuta Mizushima
 
解説?FSharp.Quotations.Compiler
解説?FSharp.Quotations.Compiler解説?FSharp.Quotations.Compiler
解説?FSharp.Quotations.Compilerbleis tift
 
Perlbeginnes 9 lt_ytnobody
Perlbeginnes 9 lt_ytnobodyPerlbeginnes 9 lt_ytnobody
Perlbeginnes 9 lt_ytnobodyazuma satoshi
 
第一回関数型言語勉強会 大阪
第一回関数型言語勉強会 大阪第一回関数型言語勉強会 大阪
第一回関数型言語勉強会 大阪Naoki Kitora
 
Rのコードをキレイに見せたい
Rのコードをキレイに見せたいRのコードをキレイに見せたい
Rのコードをキレイに見せたいmangantempy
 
最近のPHP事情とNagoya.phpへのお誘い #ngk2018b
最近のPHP事情とNagoya.phpへのお誘い #ngk2018b最近のPHP事情とNagoya.phpへのお誘い #ngk2018b
最近のPHP事情とNagoya.phpへのお誘い #ngk2018b77web
 
Phperがgoをさわってみた
PhperがgoをさわってみたPhperがgoをさわってみた
Phperがgoをさわってみたyasuo424
 
札幌F#勉強会とは何だったのか
札幌F#勉強会とは何だったのか札幌F#勉強会とは何だったのか
札幌F#勉強会とは何だったのかKenta USAMI
 

What's hot (20)

F#の基礎(?)
F#の基礎(?)F#の基礎(?)
F#の基礎(?)
 
コンピュテーション式ハンズオン
コンピュテーション式ハンズオンコンピュテーション式ハンズオン
コンピュテーション式ハンズオン
 
Osc2012 hiroshima
Osc2012 hiroshimaOsc2012 hiroshima
Osc2012 hiroshima
 
金大アルゴリズム勉強会#007資料
金大アルゴリズム勉強会#007資料金大アルゴリズム勉強会#007資料
金大アルゴリズム勉強会#007資料
 
もがいているエンジニア集まれ~今度こそ英語をモノにしよう~
もがいているエンジニア集まれ~今度こそ英語をモノにしよう~もがいているエンジニア集まれ~今度こそ英語をモノにしよう~
もがいているエンジニア集まれ~今度こそ英語をモノにしよう~
 
Kanrk05 .Netでお仕事しているプログラマがスクリプト言語として使うRuby
Kanrk05 .Netでお仕事しているプログラマがスクリプト言語として使うRubyKanrk05 .Netでお仕事しているプログラマがスクリプト言語として使うRuby
Kanrk05 .Netでお仕事しているプログラマがスクリプト言語として使うRuby
 
20170114 lod challenge
20170114 lod challenge20170114 lod challenge
20170114 lod challenge
 
Rubyのenum系高階関数を elixirでも使いたい
Rubyのenum系高階関数を elixirでも使いたいRubyのenum系高階関数を elixirでも使いたい
Rubyのenum系高階関数を elixirでも使いたい
 
2019年度チュートリアルBPE
2019年度チュートリアルBPE2019年度チュートリアルBPE
2019年度チュートリアルBPE
 
オブジェクト指向プログラマが今関数型言語を学ばないといけない理由
オブジェクト指向プログラマが今関数型言語を学ばないといけない理由オブジェクト指向プログラマが今関数型言語を学ばないといけない理由
オブジェクト指向プログラマが今関数型言語を学ばないといけない理由
 
括弧を使わないLispプログラミング
括弧を使わないLispプログラミング括弧を使わないLispプログラミング
括弧を使わないLispプログラミング
 
解説?FSharp.Quotations.Compiler
解説?FSharp.Quotations.Compiler解説?FSharp.Quotations.Compiler
解説?FSharp.Quotations.Compiler
 
F# intro
F# introF# intro
F# intro
 
Perlbeginnes 9 lt_ytnobody
Perlbeginnes 9 lt_ytnobodyPerlbeginnes 9 lt_ytnobody
Perlbeginnes 9 lt_ytnobody
 
第一回関数型言語勉強会 大阪
第一回関数型言語勉強会 大阪第一回関数型言語勉強会 大阪
第一回関数型言語勉強会 大阪
 
Rのコードをキレイに見せたい
Rのコードをキレイに見せたいRのコードをキレイに見せたい
Rのコードをキレイに見せたい
 
最近のPHP事情とNagoya.phpへのお誘い #ngk2018b
最近のPHP事情とNagoya.phpへのお誘い #ngk2018b最近のPHP事情とNagoya.phpへのお誘い #ngk2018b
最近のPHP事情とNagoya.phpへのお誘い #ngk2018b
 
Phperがgoをさわってみた
PhperがgoをさわってみたPhperがgoをさわってみた
Phperがgoをさわってみた
 
TalknoteとGolang
TalknoteとGolangTalknoteとGolang
TalknoteとGolang
 
札幌F#勉強会とは何だったのか
札幌F#勉強会とは何だったのか札幌F#勉強会とは何だったのか
札幌F#勉強会とは何だったのか
 

Similar to 楽しいプログラミング

第0回プログラミング講座
第0回プログラミング講座第0回プログラミング講座
第0回プログラミング講座happo31
 
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料Yoshiki Shibukawa
 
クイズ・Python勝ち抜きバトル pycon jp_2017
クイズ・Python勝ち抜きバトル pycon jp_2017クイズ・Python勝ち抜きバトル pycon jp_2017
クイズ・Python勝ち抜きバトル pycon jp_2017Motohiro Ueki
 
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイドYAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイドkeroyonn
 
あと一つプログラミング言語を
覚えたら死ぬ! 脳みそがパンクしそうな
あなたのための
nodeJSことはじめ
あと一つプログラミング言語を
覚えたら死ぬ! 脳みそがパンクしそうな
あなたのための
nodeJSことはじめあと一つプログラミング言語を
覚えたら死ぬ! 脳みそがパンクしそうな
あなたのための
nodeJSことはじめ
あと一つプログラミング言語を
覚えたら死ぬ! 脳みそがパンクしそうな
あなたのための
nodeJSことはじめ文樹 高橋
 
社内勉強会 2014/10/08
社内勉強会 2014/10/08社内勉強会 2014/10/08
社内勉強会 2014/10/08Takaki Yoneyama
 
Oss翻訳プロジェクトに参加してみた
Oss翻訳プロジェクトに参加してみたOss翻訳プロジェクトに参加してみた
Oss翻訳プロジェクトに参加してみたAkira Kaneda
 
OSSで楽に作るGo言語クライアントツール
OSSで楽に作るGo言語クライアントツールOSSで楽に作るGo言語クライアントツール
OSSで楽に作るGo言語クライアントツールTano Makoto
 
What's new in 4.0 of LibreOffice / LibreOffice 4.0の新機能
What's new in 4.0 of LibreOffice / LibreOffice 4.0の新機能What's new in 4.0 of LibreOffice / LibreOffice 4.0の新機能
What's new in 4.0 of LibreOffice / LibreOffice 4.0の新機能Naruhiko Ogasawara
 
PFIセミナー 2013/02/28 「プログラミング言語の今」
PFIセミナー 2013/02/28 「プログラミング言語の今」PFIセミナー 2013/02/28 「プログラミング言語の今」
PFIセミナー 2013/02/28 「プログラミング言語の今」Preferred Networks
 
コードゴルフのススメ(C言語)
コードゴルフのススメ(C言語)コードゴルフのススメ(C言語)
コードゴルフのススメ(C言語)Fumihito Yokoyama
 
コンソールベタ打ち卒業:スクリプトエディタを使おう
コンソールベタ打ち卒業:スクリプトエディタを使おうコンソールベタ打ち卒業:スクリプトエディタを使おう
コンソールベタ打ち卒業:スクリプトエディタを使おうYu Tamura
 
Kyotopm発表資料20130330
Kyotopm発表資料20130330Kyotopm発表資料20130330
Kyotopm発表資料20130330Kiyo Tsunezumi
 
趣味プロダクトで楽しいコードライフワークを送る
趣味プロダクトで楽しいコードライフワークを送る趣味プロダクトで楽しいコードライフワークを送る
趣味プロダクトで楽しいコードライフワークを送るvolpe_hd28v
 
C#言語機能の作り方
C#言語機能の作り方C#言語機能の作り方
C#言語機能の作り方信之 岩永
 
ど素人向け エンジニア勉強会
ど素人向け エンジニア勉強会ど素人向け エンジニア勉強会
ど素人向け エンジニア勉強会YukiIwasaki2764
 
議論を描く技術「ファシリテーショングラフィック」
議論を描く技術「ファシリテーショングラフィック」議論を描く技術「ファシリテーショングラフィック」
議論を描く技術「ファシリテーショングラフィック」nishikawa_makoto7
 

Similar to 楽しいプログラミング (20)

第0回プログラミング講座
第0回プログラミング講座第0回プログラミング講座
第0回プログラミング講座
 
Python勉強会 2015-12-02
Python勉強会 2015-12-02Python勉強会 2015-12-02
Python勉強会 2015-12-02
 
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
 
クイズ・Python勝ち抜きバトル pycon jp_2017
クイズ・Python勝ち抜きバトル pycon jp_2017クイズ・Python勝ち抜きバトル pycon jp_2017
クイズ・Python勝ち抜きバトル pycon jp_2017
 
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイドYAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
 
あと一つプログラミング言語を
覚えたら死ぬ! 脳みそがパンクしそうな
あなたのための
nodeJSことはじめ
あと一つプログラミング言語を
覚えたら死ぬ! 脳みそがパンクしそうな
あなたのための
nodeJSことはじめあと一つプログラミング言語を
覚えたら死ぬ! 脳みそがパンクしそうな
あなたのための
nodeJSことはじめ
あと一つプログラミング言語を
覚えたら死ぬ! 脳みそがパンクしそうな
あなたのための
nodeJSことはじめ
 
社内勉強会 2014/10/08
社内勉強会 2014/10/08社内勉強会 2014/10/08
社内勉強会 2014/10/08
 
Oss翻訳プロジェクトに参加してみた
Oss翻訳プロジェクトに参加してみたOss翻訳プロジェクトに参加してみた
Oss翻訳プロジェクトに参加してみた
 
Cap01
Cap01Cap01
Cap01
 
OSSで楽に作るGo言語クライアントツール
OSSで楽に作るGo言語クライアントツールOSSで楽に作るGo言語クライアントツール
OSSで楽に作るGo言語クライアントツール
 
What's new in 4.0 of LibreOffice / LibreOffice 4.0の新機能
What's new in 4.0 of LibreOffice / LibreOffice 4.0の新機能What's new in 4.0 of LibreOffice / LibreOffice 4.0の新機能
What's new in 4.0 of LibreOffice / LibreOffice 4.0の新機能
 
PFIセミナー 2013/02/28 「プログラミング言語の今」
PFIセミナー 2013/02/28 「プログラミング言語の今」PFIセミナー 2013/02/28 「プログラミング言語の今」
PFIセミナー 2013/02/28 「プログラミング言語の今」
 
コードゴルフのススメ(C言語)
コードゴルフのススメ(C言語)コードゴルフのススメ(C言語)
コードゴルフのススメ(C言語)
 
コンソールベタ打ち卒業:スクリプトエディタを使おう
コンソールベタ打ち卒業:スクリプトエディタを使おうコンソールベタ打ち卒業:スクリプトエディタを使おう
コンソールベタ打ち卒業:スクリプトエディタを使おう
 
Kyotopm発表資料20130330
Kyotopm発表資料20130330Kyotopm発表資料20130330
Kyotopm発表資料20130330
 
趣味プロダクトで楽しいコードライフワークを送る
趣味プロダクトで楽しいコードライフワークを送る趣味プロダクトで楽しいコードライフワークを送る
趣味プロダクトで楽しいコードライフワークを送る
 
C#言語機能の作り方
C#言語機能の作り方C#言語機能の作り方
C#言語機能の作り方
 
ど素人向け エンジニア勉強会
ど素人向け エンジニア勉強会ど素人向け エンジニア勉強会
ど素人向け エンジニア勉強会
 
議論を描く技術「ファシリテーショングラフィック」
議論を描く技術「ファシリテーショングラフィック」議論を描く技術「ファシリテーショングラフィック」
議論を描く技術「ファシリテーショングラフィック」
 
社内勉強会1 go lang
社内勉強会1 go lang 社内勉強会1 go lang
社内勉強会1 go lang
 

楽しいプログラミング