Soumettre la recherche
Mettre en ligne
式の体を成して無い式を式の体を成すように式と式木で何とかする式
•
0 j'aime
•
9,178 vues
Kouji Matsui
Suivre
NGK2015B - 名古屋合同懇親会2015忘年会
Lire moins
Lire la suite
Logiciels
Signaler
Partager
Signaler
Partager
1 sur 15
Télécharger maintenant
Télécharger pour lire hors ligne
Recommandé
真Intermediate languageのキホン
真Intermediate languageのキホン
Kouji Matsui
Async deepdive before de:code
Async deepdive before de:code
Kouji Matsui
メタプログラミングでExcel仕様書よさらば
メタプログラミングでExcel仕様書よさらば
Kouji Matsui
Nespのコード生成
Nespのコード生成
Kouji Matsui
.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組み
Kouji Matsui
C#でわかる こわくないMonad
C#でわかる こわくないMonad
Kouji Matsui
Hello! intermediate language
Hello! intermediate language
Kouji Matsui
Thread affinity and CPS
Thread affinity and CPS
Kouji Matsui
Recommandé
真Intermediate languageのキホン
真Intermediate languageのキホン
Kouji Matsui
Async deepdive before de:code
Async deepdive before de:code
Kouji Matsui
メタプログラミングでExcel仕様書よさらば
メタプログラミングでExcel仕様書よさらば
Kouji Matsui
Nespのコード生成
Nespのコード生成
Kouji Matsui
.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組み
Kouji Matsui
C#でわかる こわくないMonad
C#でわかる こわくないMonad
Kouji Matsui
Hello! intermediate language
Hello! intermediate language
Kouji Matsui
Thread affinity and CPS
Thread affinity and CPS
Kouji Matsui
Win32 APIをてなずけよう
Win32 APIをてなずけよう
Kouji Matsui
パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理
Kouji Matsui
continuatioN Linking
continuatioN Linking
Kouji Matsui
IDEALIZE YOU
IDEALIZE YOU
佑介 九岡
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
慎一 古賀
WebStormでできること
WebStormでできること
kamiyam .
TypeScript補完計画 for Sublime Text 2
TypeScript補完計画 for Sublime Text 2
kamukiriri
ぼくのNode.jsのだいいっぽ
ぼくのNode.jsのだいいっぽ
拓弥 遠藤
Visual Studioで始めるTypeScript開発入門
Visual Studioで始めるTypeScript開発入門
Narami Kiyokura
Unityで使える C# 6.0~と .NET 4.6
Unityで使える C# 6.0~と .NET 4.6
信之 岩永
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
Yoshitaka Kawashima
TypeScript超入門
TypeScript超入門
Narami Kiyokura
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
Jun-ichi Sakamoto
dotnetconfJP2017_netcore2
dotnetconfJP2017_netcore2
Yusuke Fujiwara
KotlinでWebアプリ開発
KotlinでWebアプリ開発
Ryo Nakagawa
PHPerのための(不遇に負けない)Selenium入門 @ FuelPHP&CodeIgniter ユーザの集い #9
PHPerのための(不遇に負けない)Selenium入門 @ FuelPHP&CodeIgniter ユーザの集い #9
Hiroshi Toda
リーダブルコードワークショップ(パイオニア向け) - 課題の実装の進め方
リーダブルコードワークショップ(パイオニア向け) - 課題の実装の進め方
Kouhei Sutou
Lt 110416
Lt 110416
Tomoyuki Obi
TypeScript による今風の web アプリ開発
TypeScript による今風の web アプリ開発
靖 陣内
リアルビジネスRuby
リアルビジネスRuby
Tomoya Kawanishi
Svelte5でのevent受け渡し in Svelte Japan Offline Meetup #2
Svelte5でのevent受け渡し in Svelte Japan Offline Meetup #2
ttakapi0327
Lt 20130302 1
Lt 20130302 1
Tomoyuki Obi
Contenu connexe
Tendances
Win32 APIをてなずけよう
Win32 APIをてなずけよう
Kouji Matsui
パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理
Kouji Matsui
continuatioN Linking
continuatioN Linking
Kouji Matsui
IDEALIZE YOU
IDEALIZE YOU
佑介 九岡
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
慎一 古賀
WebStormでできること
WebStormでできること
kamiyam .
TypeScript補完計画 for Sublime Text 2
TypeScript補完計画 for Sublime Text 2
kamukiriri
ぼくのNode.jsのだいいっぽ
ぼくのNode.jsのだいいっぽ
拓弥 遠藤
Visual Studioで始めるTypeScript開発入門
Visual Studioで始めるTypeScript開発入門
Narami Kiyokura
Unityで使える C# 6.0~と .NET 4.6
Unityで使える C# 6.0~と .NET 4.6
信之 岩永
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
Yoshitaka Kawashima
TypeScript超入門
TypeScript超入門
Narami Kiyokura
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
Jun-ichi Sakamoto
dotnetconfJP2017_netcore2
dotnetconfJP2017_netcore2
Yusuke Fujiwara
KotlinでWebアプリ開発
KotlinでWebアプリ開発
Ryo Nakagawa
PHPerのための(不遇に負けない)Selenium入門 @ FuelPHP&CodeIgniter ユーザの集い #9
PHPerのための(不遇に負けない)Selenium入門 @ FuelPHP&CodeIgniter ユーザの集い #9
Hiroshi Toda
リーダブルコードワークショップ(パイオニア向け) - 課題の実装の進め方
リーダブルコードワークショップ(パイオニア向け) - 課題の実装の進め方
Kouhei Sutou
Lt 110416
Lt 110416
Tomoyuki Obi
TypeScript による今風の web アプリ開発
TypeScript による今風の web アプリ開発
靖 陣内
リアルビジネスRuby
リアルビジネスRuby
Tomoya Kawanishi
Tendances
(20)
Win32 APIをてなずけよう
Win32 APIをてなずけよう
パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理
continuatioN Linking
continuatioN Linking
IDEALIZE YOU
IDEALIZE YOU
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
WebStormでできること
WebStormでできること
TypeScript補完計画 for Sublime Text 2
TypeScript補完計画 for Sublime Text 2
ぼくのNode.jsのだいいっぽ
ぼくのNode.jsのだいいっぽ
Visual Studioで始めるTypeScript開発入門
Visual Studioで始めるTypeScript開発入門
Unityで使える C# 6.0~と .NET 4.6
Unityで使える C# 6.0~と .NET 4.6
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
TypeScript超入門
TypeScript超入門
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
dotnetconfJP2017_netcore2
dotnetconfJP2017_netcore2
KotlinでWebアプリ開発
KotlinでWebアプリ開発
PHPerのための(不遇に負けない)Selenium入門 @ FuelPHP&CodeIgniter ユーザの集い #9
PHPerのための(不遇に負けない)Selenium入門 @ FuelPHP&CodeIgniter ユーザの集い #9
リーダブルコードワークショップ(パイオニア向け) - 課題の実装の進め方
リーダブルコードワークショップ(パイオニア向け) - 課題の実装の進め方
Lt 110416
Lt 110416
TypeScript による今風の web アプリ開発
TypeScript による今風の web アプリ開発
リアルビジネスRuby
リアルビジネスRuby
Similaire à 式の体を成して無い式を式の体を成すように式と式木で何とかする式
Svelte5でのevent受け渡し in Svelte Japan Offline Meetup #2
Svelte5でのevent受け渡し in Svelte Japan Offline Meetup #2
ttakapi0327
Lt 20130302 1
Lt 20130302 1
Tomoyuki Obi
マイクロサービス開発が捗る Project Tye
マイクロサービス開発が捗る Project Tye
Yuta Matsumura
新しい Visual Studio & .NET と新時代のアーキテクチャ
新しい Visual Studio & .NET と新時代のアーキテクチャ
慎一 古賀
Microsoft Build 2021をさらに楽しむためのおすすめセッション/サンプル コード Powered by Microsoft MVPs
Microsoft Build 2021をさらに楽しむためのおすすめセッション/サンプル コード Powered by Microsoft MVPs
Rie Moriguchi
はじめてのOffice Scripts
はじめてのOffice Scripts
kinuasa
Team Foundation Serivceを使ってみる
Team Foundation Serivceを使ってみる
You&I
Salesforce DUG meetup09 summer15
Salesforce DUG meetup09 summer15
Ikou Sanuki
チーム×ツール Team Foundation Server & Service 共感しActionできる開発基盤 アルティメイタム【デブサミ 2013 ...
チーム×ツール Team Foundation Server & Service 共感しActionできる開発基盤 アルティメイタム【デブサミ 2013 ...
智治 長沢
Net fringejp2016
Net fringejp2016
Yusuke Fujiwara
Apex Test Plusの紹介
Apex Test Plusの紹介
Yuichiro Ebihara
6. Vertex AI Workbench による Notebook 環境.pdf
6. Vertex AI Workbench による Notebook 環境.pdf
幸太朗 岩澤
Swift : クラス継承とプロトコル拡張を比べてみる #yidev
Swift : クラス継承とプロトコル拡張を比べてみる #yidev
Tomohiro Kumagai
.NET Core と .NET Framework (続きは de:code 2016 で!)
.NET Core と .NET Framework (続きは de:code 2016 で!)
Akira Inoue
Planning Effective Test Plan
Planning Effective Test Plan
Kazushi Kamegawa
Lync でできる? 仕事効率化
Lync でできる? 仕事効率化
Manato KAMEYA
EclipseCon Europe 2019 modeling report
EclipseCon Europe 2019 modeling report
Akira Tanaka
開発キックオフ時にマネージャが行うべき11のこと ~Visual Studio Online & TFS 使い始めと HOME 画面の構成
開発キックオフ時にマネージャが行うべき11のこと ~Visual Studio Online & TFS 使い始めと HOME 画面の構成
慎一 古賀
効率10倍UP 秀丸IDE化法
効率10倍UP 秀丸IDE化法
将 高野
WebRTCでリアル店舗を作ってみる
WebRTCでリアル店舗を作ってみる
Junichi Okamura
Similaire à 式の体を成して無い式を式の体を成すように式と式木で何とかする式
(20)
Svelte5でのevent受け渡し in Svelte Japan Offline Meetup #2
Svelte5でのevent受け渡し in Svelte Japan Offline Meetup #2
Lt 20130302 1
Lt 20130302 1
マイクロサービス開発が捗る Project Tye
マイクロサービス開発が捗る Project Tye
新しい Visual Studio & .NET と新時代のアーキテクチャ
新しい Visual Studio & .NET と新時代のアーキテクチャ
Microsoft Build 2021をさらに楽しむためのおすすめセッション/サンプル コード Powered by Microsoft MVPs
Microsoft Build 2021をさらに楽しむためのおすすめセッション/サンプル コード Powered by Microsoft MVPs
はじめてのOffice Scripts
はじめてのOffice Scripts
Team Foundation Serivceを使ってみる
Team Foundation Serivceを使ってみる
Salesforce DUG meetup09 summer15
Salesforce DUG meetup09 summer15
チーム×ツール Team Foundation Server & Service 共感しActionできる開発基盤 アルティメイタム【デブサミ 2013 ...
チーム×ツール Team Foundation Server & Service 共感しActionできる開発基盤 アルティメイタム【デブサミ 2013 ...
Net fringejp2016
Net fringejp2016
Apex Test Plusの紹介
Apex Test Plusの紹介
6. Vertex AI Workbench による Notebook 環境.pdf
6. Vertex AI Workbench による Notebook 環境.pdf
Swift : クラス継承とプロトコル拡張を比べてみる #yidev
Swift : クラス継承とプロトコル拡張を比べてみる #yidev
.NET Core と .NET Framework (続きは de:code 2016 で!)
.NET Core と .NET Framework (続きは de:code 2016 で!)
Planning Effective Test Plan
Planning Effective Test Plan
Lync でできる? 仕事効率化
Lync でできる? 仕事効率化
EclipseCon Europe 2019 modeling report
EclipseCon Europe 2019 modeling report
開発キックオフ時にマネージャが行うべき11のこと ~Visual Studio Online & TFS 使い始めと HOME 画面の構成
開発キックオフ時にマネージャが行うべき11のこと ~Visual Studio Online & TFS 使い始めと HOME 画面の構成
効率10倍UP 秀丸IDE化法
効率10倍UP 秀丸IDE化法
WebRTCでリアル店舗を作ってみる
WebRTCでリアル店舗を作ってみる
Plus de Kouji Matsui
Making archive IL2C #6-55 dotnet600 2018
Making archive IL2C #6-55 dotnet600 2018
Kouji Matsui
Matrix signal controller and BrainPad overview
Matrix signal controller and BrainPad overview
Kouji Matsui
Fun with BrainPad
Fun with BrainPad
Kouji Matsui
What's Functional?
What's Functional?
Kouji Matsui
Pitfall for WioLTE
Pitfall for WioLTE
Kouji Matsui
How to make the calculator
How to make the calculator
Kouji Matsui
Write common, run anywhere
Write common, run anywhere
Kouji Matsui
Locality of Reference
Locality of Reference
Kouji Matsui
You will be assimilated. Resistance is futile.
You will be assimilated. Resistance is futile.
Kouji Matsui
How to meets Async and Task
How to meets Async and Task
Kouji Matsui
Beachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JIT
Kouji Matsui
Async DeepDive basics
Async DeepDive basics
Kouji Matsui
不健康なIt戦士を健康的にするアレの話
不健康なIt戦士を健康的にするアレの話
Kouji Matsui
Final LINQ extensions III
Final LINQ extensions III
Kouji Matsui
SourceTreeで始めよう! Gitへの乗り換え指南
SourceTreeで始めよう! Gitへの乗り換え指南
Kouji Matsui
Final LINQ Extensions II
Final LINQ Extensions II
Kouji Matsui
Final LINQ Extensions
Final LINQ Extensions
Kouji Matsui
ポイントをおさえて移行しよう!Git乗り換え超初級
ポイントをおさえて移行しよう!Git乗り換え超初級
Kouji Matsui
抽象太郎ものがたり そして伝説へ
抽象太郎ものがたり そして伝説へ
Kouji Matsui
プロ生ちゃんをひろっちゃう!
プロ生ちゃんをひろっちゃう!
Kouji Matsui
Plus de Kouji Matsui
(20)
Making archive IL2C #6-55 dotnet600 2018
Making archive IL2C #6-55 dotnet600 2018
Matrix signal controller and BrainPad overview
Matrix signal controller and BrainPad overview
Fun with BrainPad
Fun with BrainPad
What's Functional?
What's Functional?
Pitfall for WioLTE
Pitfall for WioLTE
How to make the calculator
How to make the calculator
Write common, run anywhere
Write common, run anywhere
Locality of Reference
Locality of Reference
You will be assimilated. Resistance is futile.
You will be assimilated. Resistance is futile.
How to meets Async and Task
How to meets Async and Task
Beachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JIT
Async DeepDive basics
Async DeepDive basics
不健康なIt戦士を健康的にするアレの話
不健康なIt戦士を健康的にするアレの話
Final LINQ extensions III
Final LINQ extensions III
SourceTreeで始めよう! Gitへの乗り換え指南
SourceTreeで始めよう! Gitへの乗り換え指南
Final LINQ Extensions II
Final LINQ Extensions II
Final LINQ Extensions
Final LINQ Extensions
ポイントをおさえて移行しよう!Git乗り換え超初級
ポイントをおさえて移行しよう!Git乗り換え超初級
抽象太郎ものがたり そして伝説へ
抽象太郎ものがたり そして伝説へ
プロ生ちゃんをひろっちゃう!
プロ生ちゃんをひろっちゃう!
式の体を成して無い式を式の体を成すように式と式木で何とかする式
1.
式の体を成して無い式を 式の体を成すように 式と式木で何とかする式 NGK2015B – 名古屋合同懇親会2015忘年会
– KOUJI MATSUI
2.
自己紹介 けきょ (@kekyo2) Microsoft MVP
for Visual Studio and Development Technology (2015.4~) 認定スクラムマスター / スクラムプロダクトオーナー Center CLR オーガナイザー ux-spiral corporation
3.
NGKは5分LTと言う事を考えると: この内容は超難易度が高いです(20sec/page)。 後でブログ見てくだしあ。
4.
.NET 3.5式木の超えられない壁 .NET 3.5にて、式木(Expression
Tree)がサポートされた。 ◦ しかし、このバージョンでは、式を実現する演算子が足りないので、表現でき ないコードがある。 .NET 4以降では、色々な式木のFlavorが追加されたので、ほとんど のコードを式木で表現可能になった。 式木を作ってうれしいことは、これを実行時にコンパイル(Compileメ ソッド)して、動的に実行できるようになること。 しかし、.NET 3.5でも同じように式木を扱って、美味しく食べたい。 これをどうやってシミュレートしようかという話。
5.
[例1] Expression.Assignがない 例えば、フィールドやプロパティ(のsetter)への値の設定は、.NET4 以降であれば「Expression.Assign」を使って実現することが出来る。 ◦ こんなコードを:
this._fieldValue = 123; ◦ 式木で書くと: var th = …; var ffieldValue = Expression.Field( Expression.Constant(th), th.GetType().GetField(“_fieldValue”)); var expr = Expression.Assign( ffieldValue, Expression.Constant(123)); 上記コードは.NET 3.5ではコンパイル出来ない。
6.
Assignのシミュレート – フィールド フィールドへの代入は、代入を行うヘルパーメソッドを用意しておい て、それを呼び出すような式木を作る。 ◦
ヘルパーメソッド: public static TValue FieldSetter<TValue>(out TValue field, TValue newValue) { field = newValue; // outなので、対象に代入される return newValue; // ちゃんと値を返すことで、式の体を成す } ◦ こんな感じの式木を作る: var result = FieldSetter<int>(out this._fieldValue, 123);
7.
Assignのシミュレート – フィールド ◦
式木: var th = …; var ffieldValue = Expression.Field( Expression.Constant(th), th.GetType().GetField(“_fieldValue”)); var expr = Expression.Lambda<Func<int>>(Expression.Call( typeof(Helper).GetMethod(“FieldSetter”). MakeGenericMethod(ffieldValue.Type), ffieldValue, // outでもうまいことやってくれる Expression.Constant(123)));
8.
Assignのシミュレート – プロパティ プロパティへの代入は、結局Setterメソッドの呼び出しであるので、 Setterメソッドを呼び出すラムダ式を作り、そのデリゲートを呼び出す ヘルパーメソッドを呼び出す式木を作る。 ◦
ヘルパーメソッド: public static TValue PropertySetter<TValue>( Action<TValue> setter, TValue newValue) { setter(newValue); // デリゲートに設定させる return newValue; // ちゃんと値を返すことで、式の体を成す } ◦ こんな感じの式木を作る: var result = PropertySetter<int>(nv => this.PropValue = nv, 123);
9.
Assignのシミュレート – プロパティ ◦
式木: var pInfo = th.GetType().GetProperty(“PropValue”); var ppropValue = Expression.Property(Expression.Constant(th), pInfo); var pnv = Expression.Parameter(ppropValue.Type, “nv”); var setterAction = Expression.Lambda( // ラムダ式:nv => this.PropValue = nv; typeof(Action<>).MakeGenericType(ppropValue.Type), Expression.Call(Expression.Constant(th), pInfo.GetSetMethod(true), pnv), pnv); // PropertySetter(nv => this.PropValue = nv, 123); var expr = Expression.Lambda<Func<int>>(Expression.Call( typeof(Helper).GetMethod(“PropertySetter”). MakeGenericMethod(ppropValue.Type), setterAction, Expression.Constant(123)));
10.
[例2] Expression.Blockがない .NET 4.0以降は、以下のようなブロックを含む式を 「Expression.Block」を使って組み立てることが出来る。 ◦
Expression<Action<int, int>> expr = (a, b) => { Console.WriteLine(“{0}+{1}”, a, b); Console.WriteLine(“{0}*{1}”, a, b); }; ◦ var expr = Expression.Lambda<Action<int, int>>( Expression.Block( Expression.Call(typeof(Console).GetMethod(“WriteLine”). …), Expression.Call(typeof(Console).GetMethod(“WriteLine”). …))); しかし.NET 3.5ではBlockが無いので出来ない…
11.
Blockのシミュレート Expression.AndAlsoを使うと、boolを返す式を連結できる。各式がすべて 「true」を返せば、これらの式がすべて実行できる。 つまりはこう: var result
= ((true && expr0) && expr1) && expr2; ◦ ヘルパーメソッド: public static bool Truenize<TValue>(bool lhs, TValue rhs) { Debug.Assert(lhs == true); // 左辺は常にtrueのはず return true; // いつもtrue } ◦ こんな感じの式木を作る(ジェネリック引数は省略): var result = Truenize(Truenize(Truenize(true, expr0), expr1), expr2);
12.
Blockのシミュレート 対象の式がvoid(値を返さない)の場合は、PropertySetterのようにラムダ 式の実行後にtrueを返すようなTruenizeを呼び出すようにする。 ◦ ヘルパーメソッド: public static
bool Truenize(bool lhs, Action rhs) { Debug.Assert(lhs == true); // 左辺は常にtrueのはず action(); // デリゲートを実行 return true; // いつもtrue } ◦ こんな感じの式木を作る: var result = Truenize(Truenize(Truenize(true, () => expr0), () => expr1), () => expr2);
13.
Blockのシミュレート 実装は(複雑すぎるので)省略 (;´Д`)
14.
式木を使ってシリアライザを書いています GitHub : CenterCLR.ExaSerializers https://github.com/kekyo/Ce nterCLR.ExaSerializers 今回のネタの元です。 参考にどうぞ
15.
ご清聴ありがとうございました! スライドはブログに上げます。 http://www.kekyo.net/ Center CLRではMS技術を中心とした コミュニティ活動やってます。勉強会 参加よろしく! 直近:12/26開催!! http://centerclr.doorkeeper.jp/
Télécharger maintenant