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.
Upcoming SlideShare
山椒の味は大人の味
Next
Download to read offline and view in fullscreen.

0

Share

Nespのコード生成

Download to read offline

A Lisp-like lightweight functional language on .NET.
This slide contains how to generate expressions from Nesp parser.

ML勉強会 #2 https://ml-lang.connpass.com/event/58151/
https://github.com/kekyo/Nesp

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all
  • Be the first to like this

Nespのコード生成

  1. 1. NESP の コード生成 2017.7.22 ML STUDY #2 KOUJI MATSUI (@KEKYO2)
  2. 2. Kouji Matsui - kekyo • NAGOYA city, AICHI pref., JP • Twitter – @kekyo2 / Facebook • ux-spiral corporation • Microsoft Most Valuable Professional VS and DevTech 2015- • Certified Scrum master / Scrum product owner • Center CLR organizer. • .NET/C#/F#/IL/metaprogramming or like… • Bike rider
  3. 3. Agenda 事の始まり Nesp リテラルコード生成 プロパティ参照 関数実行 オーバーロード解決 型の整合と推論 まとめ
  4. 4. MLとは •Meta-Languageの略です。 •今日の発表がMLに相当するのかわかりません。 •REPLあります。
  5. 5. 事の始まり 技術者は一回ぐらい処理系を書かないと 社会から抹殺される
  6. 6. 事の始まり 実用なshellが欲しい ◦ C# Interactiveの何か違う感 ◦ Power shellの何か違う感 ◦ F# Interactiveのshellとしての微妙感 ◦ BashをWindowsで使うことの微妙感 ◦ シンプルでshellっぽく使える構文 ◦ .NETと連携出来るかどうか ANTLRに慣れるために何か作る ◦ ANTLRのASTをExpressionに適用するとコード生成出来そう
  7. 7. Nesp - .NET Lisp-like lightweight language https://github.com/kekyo/Nesp
  8. 8. リテラルコード生成
  9. 9. リテラルコード生成
  10. 10. リテラルコード生成
  11. 11. リテラルコード生成 DateTime.Nowはプロパティなので、Expression.Constant()を使う とその時点で評価されてしまう。 DateTime.Nowプロパティを参照するExpressionが必要。 Expression生成時に評価結果を Constantとして保持
  12. 12. プロパティ参照 static DateTime.Now { }
  13. 13. プロパティ参照 プロパティ参照とは、 要するに関数実行
  14. 14. 関数実行 static Guid.NewGuid() { } 引数なし
  15. 15. 関数実行 static int.Parse(string) { } 引数群
  16. 16. オーバーロード解決
  17. 17. オーバーロード解決 候補計算 全ての”Format”
  18. 18. オーバーロード解決 DefaultBinderがいい感じにオーバーロードを選択する。 但し(C#の)可変引数を持つメソッドを選択してくれない。 ◦ String.Formatの場合、Object[]型でしかマッチしない。本当はもっと柔軟に書けるは ず…
  19. 19. 型の整合と推論 Expression of type 'System.Int32' cannot be used for parameter of type 'System.Object' of method 'System.String Format(System.String, System.Object)' Int32 vs Object
  20. 20. 型の整合と推論 upcast (box) Target type Int32
  21. 21. 型の整合と推論 value : object
  22. 22. 型の整合と推論 選択関数
  23. 23. 型の整合と推論 型注釈出来たとして: let formatFunc (value : object) (string.Format “ABC{0}DEF” value)
  24. 24. 型の整合と推論 型注釈出来たとして: let parseInt (str : object) (int.Parse str) ジェネリック引数を導入したとして: let parseInt (str : ‘T) (int.Parse str) // でも’Tはstringで確定的 わたしたちが欲しかったもの: let parseInt (str : string) (int.Parse str)
  25. 25. 型の整合と推論 引数の型 例 内側で必要とされる型が特定される Nesp: let intParse (str) (int.Parse str) C#: Func<string, int> intParse = str => int.Parse(str) オーバーロードが無ければ、strの型が自動的に導かれる 内側で必要とされる型がジェネリック Nesp: let return (value) (value) C#: Func<T, T> return = value => value 内側の式から型を特定できない、または導いた型がジェネ リック引数 オーバーロードのために特定が難しい Nesp: let format (value) (string.Format “{0}” value) C#: Func<?, string> format = value => string.Format(“{0}”, value) string.Format(string, object)にマッチするのか? string.Format(string, params object[])にマッチするのか?
  26. 26. 型の整合と推論 型推論難しい… ◦ ParameterExpression がないと、bodyで引数を参照できないので、body評 価の前に生成する必要がある。 ◦ しかしParameterExpression生成には、具象型が必要。 → Expressionに頼らず、生成をdelay出来る独自のノード型が必要 か?
  27. 27. まとめ Nespに必要なトピック: ◦ 型推論 ◦ ジェネリック引数対応 ◦ オーバーロード選択 ◦ let の完成 ◦ 関数部分適用 ◦ REPLっぽいなにか
  28. 28. Thanks join! The implementations --> GitHub: Nesp ◦ https://github.com/kekyo/Nesp/ My blog ◦ http://www.kekyo.net/

A Lisp-like lightweight functional language on .NET. This slide contains how to generate expressions from Nesp parser. ML勉強会 #2 https://ml-lang.connpass.com/event/58151/ https://github.com/kekyo/Nesp

Views

Total views

2,587

On Slideshare

0

From embeds

0

Number of embeds

2,019

Actions

Downloads

8

Shares

0

Comments

0

Likes

0

×