Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
楽しいプログラミング
~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
• ワンライナーでBrain...
ようこそ
D言語Lispへ
D言語Lispとは
• まず、Lispと書いてあるけどLispとは関係ない
• 単に括弧が多くて一瞬Lispのように見えるという
だけ
• 破壊的代入は悪だ!(あくまでも個人の感覚です)
• 破壊的代入の無い”クリーン”な世界を目指す
• 破壊...
どうやるか
• λ式のネスト
• 無名再帰を導入(これでほぼ全ての事実現可能に)
• 無名再帰の実現はZ Combinatorを用いる
• 戻り値がvoidな関数呼び出しはカンマ演算子を用
いることで対処
λ式のネスト
• D言語ではλ式は以下のSyntax
• (arguments list) => expression;
• つまり、ネストとは例えば
• auto h = (int y) => (z => z * z)(y * 2);
• こ...
(明示的な)破壊的代入を処す
• たとえば、x = 2; y = x * 2という処理(ここでx == 2, y == 4)
• xに対して2を破壊的な代入をしている(yは形式的に書いているだけ)
• これを隠蔽する方法 -> λ式
• (x ...
ループを殺せ!!
• 簡単。再帰を用います。
• それも、無名再帰で
• 無名再帰とは
• 不動点コンビネータ(次ページで少し説明)を用
いて識別子に束縛されない関数を再帰するこ
と
不動点コンビネータの定義
• 高階関数gが不動点コンビネータであるとは
• 任意の関数fで p = g(f) としたとき、f(p) = pが成立するこ
と
• つまりは、∀ f, f(g(f)) = g(f) となるということ
• 詳しくは、W...
ここでは、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な関数を呼ぶ場合にこれを用い
ることでワン...
とりあえず
• D言語、最強だよね マジで
Dのさらなる楽しみへ
高速化を考える
• Dには任意の関数をメモ化するテンプレートが標準ライブラ
リにある
• std.functional.memoize
• ある関数fをメモ化した関数をgとすると
• alias g = memoize!f; でメモ化できる
•...
比較してみる
• (時間があれば)デモ
• (時間がなければ結果だけ)
こうなります…
まとめ
• D言語Lisp, 面白いですよ
• コードがなれないと読み難いし、難しいのでオススメはできませんが
…
• λ計算も楽しそうだよね
• あ、あと
• 以前発表した任意の関数をカリー化するテンプレートを用いること
でさらにD言語Lis...
ご清聴ありがとうございました
Upcoming SlideShare
Loading in …5
×

楽しいプログラミング

660 views

Published on

福井技術者の集い その5 発表資料

Published in: Engineering
  • Be the first to comment

楽しいプログラミング

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

×