SlideShare ist ein Scribd-Unternehmen logo
1 von 28
Downloaden Sie, um offline zu lesen
Scala DSL

                2010 5       18
                         (    Lab)




2010   5   18
Scala

       •


       •


       •


       •


       • JVM          Java


       • Scalable ≒ DSL


2010   5   18
DSL

       • Domain Specific Language


       •


       •


       •


       • OSMU (One Source Multi Use)




2010   5   18
Scala DSL




2010   5   18
Specs

   object CsvEntityTest extends Specification {                                        • BDD
    val TestReadDir = "/tmp/goldenport.d/read"
    val TestCreateDir = "/tmp/goldenport.d/create/CsvEntity"                             • Behavior Driven
    val readonlyCsvFileName = GoldenportTestUtility.readonlyCsvFileName                    Development
       "CsvEntity    Read" should {
        "CsvEntity DefaultEntitySpace         FileDataSource     open" in {              •
            val space = new DefaultEntitySpace
            space.addEntityClass(new CsvEntityClass())
            val datasource = new FileDataSource(readonlyCsvFileName, space.context)
            val mayCsv: Option[GEntity] = space.reconstitute(datasource)
            mayCsv must beSome[GEntity]
            val csv = mayCsv.get.asInstanceOf[CsvEntity]
            csv.open()
            csv.width must be(3)
            csv.height must be(2)
            csv.get(0, 0) must be_==("A")                                             • Specs
            csv.get(1, 0) must be_==("B")
            csv.get(2, 0) must be_==("C")
            csv.get(0, 1) must be_==("X")
            csv.get(1, 1) must be_==("Y")                                                • Scala
            csv.get(2, 1) must be_==("Z")
            csv.close()
        }


2010    5    18
SimpleModeler

           case class DER                 extends DomainResource {    •                 DSL
               term = "      "
               caption = "         "
               brief = <t></t>
               description = <text></text>
                                                                      • Scala DSL
               id("    Id", DVI           Id())
               attribute("       Name", DVN          Name())
           }                                                                    Google App
           case class DVI                Id extends DomainValueId {       Engine Java
               term = "      Id"
               caption = "         Id"
               brief = <t></t>
               description = <text></text>

               attribute("value", XString)
           }




2010   5       18
SimpleModeler




2010   5   18
g3

                                                           •
           class Join extends G3Application {
            agent('compute) {
              case x: Int => x + 100
                                                           • Scala DSL
            }


               start(List(1, 2, 3, 4, 5)) split() publish("compute") join() aggregate()
           }




2010   5       18
class MyTodo extends Todo {                          • TODO
        name = "         "                                   Scala DSL

           "                            " until 20100505
                                                            • Scala DSL   HTML
           "                            " until 20100606
           "                      " until 20100707

           task("                     ") {
               until = 20100808
               todo("PC                      ")
               "IDE                      " until 20100707
           }
       }




2010   5   18
DSL                 HTML

       <html>
       <head>
        <title>TODO   </title>
       </head>
       <body>

       <ul>
        <li>                           (20100505)</li>
           <li>                        (20100606)</li>
           <li>                  (20100707)</li>
           <li>PC                    (20100808) [        ]</li>
           <li>IDE                    (20100808) [       ]</li>
       </ul>

       </body>
       </html>



2010   5    18
DSL




2010   5   18
class MyTodo extends Todo {
             name = "         "
            }



           abstract class Todo {
             var name: String = _
           }



2010   5   18
class MyTodo extends Todo {
            name = "         "
                                               import scala.collection.mutable.ArrayBuffer
               todo("                     ")
               todo("                     ")   abstract class Todo {
                                                var name: String = _
               todo("                ")         val items = new ArrayBuffer[TodoItem]
           }
                                                   def todo(title: String) {
                                                     val item = new TodoItem(title)
                                                     items += item
                                                   }
                                               }

                                               class TodoItem(val title: String) {
                                               }




2010   5       18
import scala.collection.mutable.ArrayBuffer
  class MyTodo extends Todo {
   name = "         "                                 abstract class Todo {
                                                       var name: String = _
                                                       val items = new ArrayBuffer[TodoItem]
      todo("                      ") until 20100505
                                                          def todo(title: String): TodoItem = {
      todo("                      ") until 20100606         val item = new TodoItem(title)
      todo("                ") until 20100707               items += item
                                                            item
  }                                                       }
                                                      }

                                                      class TodoItem(val title: String) {
                                                       var untilDate: Int = _

                                                          def until(date: Int): TodoItem = {
                                                            untilDate = date
                                                            this
                                                          }
                                                      }




2010    5   18
                         (fluent interface)
import scala.collection.mutable.ArrayBuffer
   class MyTodo extends Todo {
    name = "         "                              abstract class Todo {
                                                     var name: String = _
                                                     val items = new ArrayBuffer[TodoItem]
       "                         " until 20100505
                                                        def todo(title: String): TodoItem = {
       "                         " until 20100606         val item = new TodoItem(title)
                                                          items += item
       "                " until 20100707                  item
                                                        }
   }
                                                      implicit def todoWrapper(title: String): TodoItem =
                                                    todo(title)
                                                    }

                                                    class TodoItem(val title: String) {
                                                     var untilDate: Int = _

                                                        def until(date: Int): TodoItem = {
                                                          untilDate = date
                                                          this
                                                        }
                                                    }



2010       5   18
class MyTodo extends Todo {
        name = "         "

           "                         " until 20100505
           "                         " until 20100606
           "                " until 20100707

           task("               ") {
               todo("PC                  ")
               "IDE                  " until 20100707
           }
       }




2010   5       18
import scala.collection.mutable.ArrayBuffer
                                                                             class TodoItem(var title: String) {
       abstract class Todo {                                                  var untilDate: Int = _
        var name: String = _
        val items = new ArrayBuffer[TodoItem]                                    def until(date: Int): TodoItem = {
        val tasks = new ArrayBuffer[Task]                                          untilDate = date
        private[this] var currentTask: Option[Task] = None                         this
                                                                                 }
           def todo(title: String): TodoItem = {                             }
             val item = new TodoItem(title)
             currentTask match {                                             class Task(var title: String) {
               case Some(tk) => tk.items += item                               val items = new ArrayBuffer[TodoItem]
               case None => items += item                                      var untilDate: Int = _
             }                                                               }
             item
           }

           def task(title: String)(p: => Unit): Task = {
             val tk = new Task(title)
             tasks += tk
             currentTask = Some(tk)
             p
             currentTask = None
             tk
           }

           implicit def todoWrapper(title: String): TodoItem = todo(title)
       }



2010   5     18
           Stack
class MyTodo extends Todo {
            name = "         "

               "                            " until 20100505
               "                            " until 20100606
               "                      " until 20100707

               task("                     ") {
                   until = 20100808
                   todo("PC                      ")
                   "IDE                      " until 20100707
               }
           }




2010   5       18
import scala.collection.mutable.ArrayBuffer
                                                                     def until: Int = {
           abstract class Todo {                                       currentTask.get.untilDate
            var name: String = _                                     }
            val items = new ArrayBuffer[TodoItem]
            val tasks = new ArrayBuffer[Task]                        def until_=(value: Int) {
            private[this] var currentTask: Option[Task] = None         currentTask.get.untilDate = value
                                                                     }
               def todo(title: String): TodoItem = {
                 val item = new TodoItem(title)                      implicit def todoWrapper(title: String): TodoItem = todo(title)
                 currentTask match {                             }
                   case Some(tk) => tk.items += item
                   case None => items += item                    class TodoItem(var title: String) {
                 }                                                var untilDate: Int = _
                 item
               }                                                     def until(date: Int): TodoItem = {
                                                                       untilDate = date
               def task(title: String)(p: => Unit): Task = {           this
                 val tk = new Task(title)                            }
                 tasks += tk                                     }
                 currentTask = Some(tk)
                 p                                               class Task(var title: String) {
                 currentTask = None                                val items = new ArrayBuffer[TodoItem]
                 tk                                                var untilDate: Int = _
               }                                                 }
                 this
               }
           }

2010   5       18
2010   5   18
MakeTodoDsl
       import scala.xml.{XML, Node}
                                                                     private def makeList(todo: Todo): List[Node] = {
       object MakeTodoDsl {                                            (for (item <- todo.items) yield <li>{
        def main(args: Array[String]) {                                   "%s(%s)".format(item.title, item.untilDate)
         val input = args(0)                                           }</li>).toList :::
         val output = args(1)                                          (for (task <- todo.tasks; item <- task.items) yield <li>{
                                                                          "%s(%s) [%s]".format(item.title, task.untilDate, task.title)
            val appClass = Class.forName(input)                        }</li>).toList
            val todo = appClass.newInstance.asInstanceOf[Todo]       }
                                                                 }
         val html = <html>
       <head>
        <title>TODO      </title>
       </head>
       <body>

       <ul>
        { makeList(todo) }
       </ul>

       </body>
       </html>

            XML.save(output, html, "utf-8")
        }


2010    5    18
def main(args: Array[String]) {
             val input = args(0)
             val output = args(1)

                val appClass = Class.forName(input)
                val todo = appClass.newInstance.asInstanceOf[Todo]




2010   5   18
XML
           val html = <html>
           <head>
            <title>TODO      </title>
           </head>
           <body>

           <ul>
            { makeList(todo) }
           </ul>

           </body>
           </html>

                XML.save(output, html, "utf-8")
           }
2010   5   18
private def makeList(todo: Todo): List[Node] = {
          (for (item <- todo.items) yield <li>{
              "%s(%s)".format(item.title, item.untilDate)
          }</li>).toList :::
          (for (task <- todo.tasks; item <- task.items) yield <li>{
              "%s(%s) [%s]".format(item.title, task.untilDate, task.title)}</li>
          ).toList
        }




2010   5   18
DSL                           HTML

       <html>                                            •
       <head>
        <title>TODO   </title>
       </head>
       <body>

       <ul>
        <li>                           (20100505)</li>
           <li>                        (20100606)</li>
           <li>                  (20100707)</li>
           <li>PC                    (20100808) [            ]</li>
           <li>IDE                    (20100808) [           ]</li>
       </ul>

       </body>
       </html>


2010   5   18
•          •


       •          •


           •      • XML


           •      •


       • apply    •       (2.8)


       • update   •         (2.8)



2010   5   18
• DSL              Scala


       • Scala     Java           …


           •


       • Scala DSL


           •


       •         Scala



2010   5   18
End




2010   5   18

Weitere ähnliche Inhalte

Was ist angesagt?

Map Reduce 〜入門編:仕組みの理解とアルゴリズムデザイン〜
Map Reduce 〜入門編:仕組みの理解とアルゴリズムデザイン〜Map Reduce 〜入門編:仕組みの理解とアルゴリズムデザイン〜
Map Reduce 〜入門編:仕組みの理解とアルゴリズムデザイン〜
Takahiro Inoue
 
MySQL負荷分散の方法
MySQL負荷分散の方法MySQL負荷分散の方法
MySQL負荷分散の方法
佐久本正太
 

Was ist angesagt? (20)

Jmespathをもっと広めたい
Jmespathをもっと広めたいJmespathをもっと広めたい
Jmespathをもっと広めたい
 
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
 
Map Reduce 〜入門編:仕組みの理解とアルゴリズムデザイン〜
Map Reduce 〜入門編:仕組みの理解とアルゴリズムデザイン〜Map Reduce 〜入門編:仕組みの理解とアルゴリズムデザイン〜
Map Reduce 〜入門編:仕組みの理解とアルゴリズムデザイン〜
 
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
 
大規模データ活用向けストレージレイヤソフトのこれまでとこれから(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)
大規模データ活用向けストレージレイヤソフトのこれまでとこれから(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)大規模データ活用向けストレージレイヤソフトのこれまでとこれから(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)
大規模データ活用向けストレージレイヤソフトのこれまでとこれから(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)
 
ドメイン駆動設計(DDD)の実践Part2
ドメイン駆動設計(DDD)の実践Part2ドメイン駆動設計(DDD)の実践Part2
ドメイン駆動設計(DDD)の実践Part2
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
 
MySQL負荷分散の方法
MySQL負荷分散の方法MySQL負荷分散の方法
MySQL負荷分散の方法
 
Amazon Redshift パフォーマンスチューニングテクニックと最新アップデート
Amazon Redshift パフォーマンスチューニングテクニックと最新アップデートAmazon Redshift パフォーマンスチューニングテクニックと最新アップデート
Amazon Redshift パフォーマンスチューニングテクニックと最新アップデート
 
Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころPython におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころ
 
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したこと
 
PostgreSQLの関数属性を知ろう
PostgreSQLの関数属性を知ろうPostgreSQLの関数属性を知ろう
PostgreSQLの関数属性を知ろう
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界
 
PostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVSPostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVS
 
pg_bigmを用いた全文検索のしくみ(後編)
pg_bigmを用いた全文検索のしくみ(後編)pg_bigmを用いた全文検索のしくみ(後編)
pg_bigmを用いた全文検索のしくみ(後編)
 
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
 
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけRDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
 
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
 
使ってみませんか?pg_hint_plan
使ってみませんか?pg_hint_plan使ってみませんか?pg_hint_plan
使ってみませんか?pg_hint_plan
 

Ähnlich wie Scala DSLの作り方

Scala in practice
Scala in practiceScala in practice
Scala in practice
patforna
 
Rich Internet Applications con JavaFX e NetBeans
Rich Internet Applications  con JavaFX e NetBeans Rich Internet Applications  con JavaFX e NetBeans
Rich Internet Applications con JavaFX e NetBeans
Fabrizio Giudici
 

Ähnlich wie Scala DSLの作り方 (20)

Kotlin talk
Kotlin talkKotlin talk
Kotlin talk
 
Ikenna Okpala: London Java Community: Wicket and Scala - 27/07/2010.
Ikenna Okpala: London Java Community: Wicket and Scala - 27/07/2010.Ikenna Okpala: London Java Community: Wicket and Scala - 27/07/2010.
Ikenna Okpala: London Java Community: Wicket and Scala - 27/07/2010.
 
Short Lightening Talk
Short Lightening TalkShort Lightening Talk
Short Lightening Talk
 
Starting with Scala : Frontier Developer's Meetup December 2010
Starting with Scala : Frontier Developer's Meetup December 2010Starting with Scala : Frontier Developer's Meetup December 2010
Starting with Scala : Frontier Developer's Meetup December 2010
 
Why Scala is the better Java
Why Scala is the better JavaWhy Scala is the better Java
Why Scala is the better Java
 
mobl
moblmobl
mobl
 
Scala - en bedre og mere effektiv Java?
Scala - en bedre og mere effektiv Java?Scala - en bedre og mere effektiv Java?
Scala - en bedre og mere effektiv Java?
 
Developing a new Epsilon EMC driver
Developing a new Epsilon EMC driverDeveloping a new Epsilon EMC driver
Developing a new Epsilon EMC driver
 
An introduction to scala
An introduction to scalaAn introduction to scala
An introduction to scala
 
NoSQL Endgame Percona Live Online 2020
NoSQL Endgame Percona Live Online 2020NoSQL Endgame Percona Live Online 2020
NoSQL Endgame Percona Live Online 2020
 
Scala @ TechMeetup Edinburgh
Scala @ TechMeetup EdinburghScala @ TechMeetup Edinburgh
Scala @ TechMeetup Edinburgh
 
比XML更好用的Java Annotation
比XML更好用的Java Annotation比XML更好用的Java Annotation
比XML更好用的Java Annotation
 
Object calisthenics
Object calisthenicsObject calisthenics
Object calisthenics
 
Scala in practice
Scala in practiceScala in practice
Scala in practice
 
TDC218SP | Trilha Kotlin - DSLs in a Kotlin Way
TDC218SP | Trilha Kotlin - DSLs in a Kotlin WayTDC218SP | Trilha Kotlin - DSLs in a Kotlin Way
TDC218SP | Trilha Kotlin - DSLs in a Kotlin Way
 
Oop2010 Scala Presentation Stal
Oop2010 Scala Presentation StalOop2010 Scala Presentation Stal
Oop2010 Scala Presentation Stal
 
WebDSL
WebDSLWebDSL
WebDSL
 
Scala - en bedre Java?
Scala - en bedre Java?Scala - en bedre Java?
Scala - en bedre Java?
 
JavaScript - Chapter 12 - Document Object Model
  JavaScript - Chapter 12 - Document Object Model  JavaScript - Chapter 12 - Document Object Model
JavaScript - Chapter 12 - Document Object Model
 
Rich Internet Applications con JavaFX e NetBeans
Rich Internet Applications  con JavaFX e NetBeans Rich Internet Applications  con JavaFX e NetBeans
Rich Internet Applications con JavaFX e NetBeans
 

Mehr von Tomoharu ASAMI

Mehr von Tomoharu ASAMI (20)

アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
 
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
 
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
 
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
 
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
 
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
 
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
 
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
 
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
 
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
 
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
 
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
 
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
 
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
 
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】
 
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
 
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】
 
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】
 
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】
 
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】
 

Kürzlich hochgeladen

CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Kürzlich hochgeladen (20)

From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 

Scala DSLの作り方

  • 1. Scala DSL 2010 5 18 ( Lab) 2010 5 18
  • 2. Scala • • • • • JVM Java • Scalable ≒ DSL 2010 5 18
  • 3. DSL • Domain Specific Language • • • • OSMU (One Source Multi Use) 2010 5 18
  • 5. Specs object CsvEntityTest extends Specification { • BDD val TestReadDir = "/tmp/goldenport.d/read" val TestCreateDir = "/tmp/goldenport.d/create/CsvEntity" • Behavior Driven val readonlyCsvFileName = GoldenportTestUtility.readonlyCsvFileName Development "CsvEntity Read" should { "CsvEntity DefaultEntitySpace FileDataSource open" in { • val space = new DefaultEntitySpace space.addEntityClass(new CsvEntityClass()) val datasource = new FileDataSource(readonlyCsvFileName, space.context) val mayCsv: Option[GEntity] = space.reconstitute(datasource) mayCsv must beSome[GEntity] val csv = mayCsv.get.asInstanceOf[CsvEntity] csv.open() csv.width must be(3) csv.height must be(2) csv.get(0, 0) must be_==("A") • Specs csv.get(1, 0) must be_==("B") csv.get(2, 0) must be_==("C") csv.get(0, 1) must be_==("X") csv.get(1, 1) must be_==("Y") • Scala csv.get(2, 1) must be_==("Z") csv.close() } 2010 5 18
  • 6. SimpleModeler case class DER extends DomainResource { • DSL term = " " caption = " " brief = <t></t> description = <text></text> • Scala DSL id(" Id", DVI Id()) attribute(" Name", DVN Name()) } Google App case class DVI Id extends DomainValueId { Engine Java term = " Id" caption = " Id" brief = <t></t> description = <text></text> attribute("value", XString) } 2010 5 18
  • 8. g3 • class Join extends G3Application { agent('compute) { case x: Int => x + 100 • Scala DSL } start(List(1, 2, 3, 4, 5)) split() publish("compute") join() aggregate() } 2010 5 18
  • 9. class MyTodo extends Todo { • TODO name = " " Scala DSL " " until 20100505 • Scala DSL HTML " " until 20100606 " " until 20100707 task(" ") { until = 20100808 todo("PC ") "IDE " until 20100707 } } 2010 5 18
  • 10. DSL HTML <html> <head> <title>TODO </title> </head> <body> <ul> <li> (20100505)</li> <li> (20100606)</li> <li> (20100707)</li> <li>PC (20100808) [ ]</li> <li>IDE (20100808) [ ]</li> </ul> </body> </html> 2010 5 18
  • 11. DSL 2010 5 18
  • 12. class MyTodo extends Todo { name = " " } abstract class Todo { var name: String = _ } 2010 5 18
  • 13. class MyTodo extends Todo { name = " " import scala.collection.mutable.ArrayBuffer todo(" ") todo(" ") abstract class Todo { var name: String = _ todo(" ") val items = new ArrayBuffer[TodoItem] } def todo(title: String) { val item = new TodoItem(title) items += item } } class TodoItem(val title: String) { } 2010 5 18
  • 14. import scala.collection.mutable.ArrayBuffer class MyTodo extends Todo { name = " " abstract class Todo { var name: String = _ val items = new ArrayBuffer[TodoItem] todo(" ") until 20100505 def todo(title: String): TodoItem = { todo(" ") until 20100606 val item = new TodoItem(title) todo(" ") until 20100707 items += item item } } } class TodoItem(val title: String) { var untilDate: Int = _ def until(date: Int): TodoItem = { untilDate = date this } } 2010 5 18 (fluent interface)
  • 15. import scala.collection.mutable.ArrayBuffer class MyTodo extends Todo { name = " " abstract class Todo { var name: String = _ val items = new ArrayBuffer[TodoItem] " " until 20100505 def todo(title: String): TodoItem = { " " until 20100606 val item = new TodoItem(title) items += item " " until 20100707 item } } implicit def todoWrapper(title: String): TodoItem = todo(title) } class TodoItem(val title: String) { var untilDate: Int = _ def until(date: Int): TodoItem = { untilDate = date this } } 2010 5 18
  • 16. class MyTodo extends Todo { name = " " " " until 20100505 " " until 20100606 " " until 20100707 task(" ") { todo("PC ") "IDE " until 20100707 } } 2010 5 18
  • 17. import scala.collection.mutable.ArrayBuffer class TodoItem(var title: String) { abstract class Todo { var untilDate: Int = _ var name: String = _ val items = new ArrayBuffer[TodoItem] def until(date: Int): TodoItem = { val tasks = new ArrayBuffer[Task] untilDate = date private[this] var currentTask: Option[Task] = None this } def todo(title: String): TodoItem = { } val item = new TodoItem(title) currentTask match { class Task(var title: String) { case Some(tk) => tk.items += item val items = new ArrayBuffer[TodoItem] case None => items += item var untilDate: Int = _ } } item } def task(title: String)(p: => Unit): Task = { val tk = new Task(title) tasks += tk currentTask = Some(tk) p currentTask = None tk } implicit def todoWrapper(title: String): TodoItem = todo(title) } 2010 5 18 Stack
  • 18. class MyTodo extends Todo { name = " " " " until 20100505 " " until 20100606 " " until 20100707 task(" ") { until = 20100808 todo("PC ") "IDE " until 20100707 } } 2010 5 18
  • 19. import scala.collection.mutable.ArrayBuffer def until: Int = { abstract class Todo { currentTask.get.untilDate var name: String = _ } val items = new ArrayBuffer[TodoItem] val tasks = new ArrayBuffer[Task] def until_=(value: Int) { private[this] var currentTask: Option[Task] = None currentTask.get.untilDate = value } def todo(title: String): TodoItem = { val item = new TodoItem(title) implicit def todoWrapper(title: String): TodoItem = todo(title) currentTask match { } case Some(tk) => tk.items += item case None => items += item class TodoItem(var title: String) { } var untilDate: Int = _ item } def until(date: Int): TodoItem = { untilDate = date def task(title: String)(p: => Unit): Task = { this val tk = new Task(title) } tasks += tk } currentTask = Some(tk) p class Task(var title: String) { currentTask = None val items = new ArrayBuffer[TodoItem] tk var untilDate: Int = _ } } this } } 2010 5 18
  • 20. 2010 5 18
  • 21. MakeTodoDsl import scala.xml.{XML, Node} private def makeList(todo: Todo): List[Node] = { object MakeTodoDsl { (for (item <- todo.items) yield <li>{ def main(args: Array[String]) { "%s(%s)".format(item.title, item.untilDate) val input = args(0) }</li>).toList ::: val output = args(1) (for (task <- todo.tasks; item <- task.items) yield <li>{ "%s(%s) [%s]".format(item.title, task.untilDate, task.title) val appClass = Class.forName(input) }</li>).toList val todo = appClass.newInstance.asInstanceOf[Todo] } } val html = <html> <head> <title>TODO </title> </head> <body> <ul> { makeList(todo) } </ul> </body> </html> XML.save(output, html, "utf-8") } 2010 5 18
  • 22. def main(args: Array[String]) { val input = args(0) val output = args(1) val appClass = Class.forName(input) val todo = appClass.newInstance.asInstanceOf[Todo] 2010 5 18
  • 23. XML val html = <html> <head> <title>TODO </title> </head> <body> <ul> { makeList(todo) } </ul> </body> </html> XML.save(output, html, "utf-8") } 2010 5 18
  • 24. private def makeList(todo: Todo): List[Node] = { (for (item <- todo.items) yield <li>{ "%s(%s)".format(item.title, item.untilDate) }</li>).toList ::: (for (task <- todo.tasks; item <- task.items) yield <li>{ "%s(%s) [%s]".format(item.title, task.untilDate, task.title)}</li> ).toList } 2010 5 18
  • 25. DSL HTML <html> • <head> <title>TODO </title> </head> <body> <ul> <li> (20100505)</li> <li> (20100606)</li> <li> (20100707)</li> <li>PC (20100808) [ ]</li> <li>IDE (20100808) [ ]</li> </ul> </body> </html> 2010 5 18
  • 26. • • • • • XML • • • apply • (2.8) • update • (2.8) 2010 5 18
  • 27. • DSL Scala • Scala Java … • • Scala DSL • • Scala 2010 5 18
  • 28. End 2010 5 18