一、dsl的概念
只在特定領域內使用的語言
例如:
—html、gradle、sql等等
特點:
計算機程式語言
具有語言的表達能力
有限的表達能力
關注某個特定的領域
二、下面用dsl來寫乙個例子吧
需要下面五個類:
三、建立乙個node節點的介面
package cn.kotliner.kotlin
/** *@author:wangdong
*@description:1.node節點的介面
*/inte***ce node
四、寫乙個通用的tag類,實現這個介面
package cn.kotliner.kotlin
/** *@author:wangdong
*@description:2.通用的tag類
*//***
* 實現了node介面
* tag類需要open,以便其他類繼承
*/open class tag(val name: string): node
//定義乙個string加法的拓展
operator fun string.unaryplus()
//定義乙個新增運算子
operator fun plus(node: node)
//定義乙個string的擴充套件方法,引數是tag.()
operator fun string.invoke(block: tag.() -> unit)
//例如
// override fun render(): string
}stringbuilder
}.let
.tostring()}}
五、寫乙個主函式
package cn.kotliner.kotlin
/** * @author:wangdong
* @description:3.寫乙個主函式
*/fun main(args: array) .render().let(::println)*/
//此時**可以改一下了
html
body
}"div"{}
}.render().let(::println)
}
六、寫乙個nodes,用來寫各種方法
package cn.kotliner.kotlin
/** *@author:wangdong
*@description:4.定乙個nodes
*/fun html(block: tag.() -> unit): tag
/** * head的拓展方法
* 要是tag的擴充套件方法
* 不需要返回值
*/fun tag.head(block: head.() -> unit)
/** * body的拓展方法
*/fun tag.body(block: body.() -> unit)
/** * 定義乙個節點
* 引數content
* 返回值:node
*/class stringnode(val content: string):node
/**定義頭*/
class head: tag("head")
/**定義體*/
class body: tag("body")
七、定義乙個mapdelegate用來set或者get值
package cn.kotliner.kotlin
import kotlin.properties.readwriteproperty
import kotlin.reflect.kproperty
/** *@author:wangdong
*@description:5.定義乙個mapdelegate
*//**
* map是可讀寫的
* 實現乙個介面
*/class mapdelegate(val map: mutablemap):readwriteproperty
/*** sets the value of the property for the given object.
*@param thisref the object for which the value is requested.
*@param property the metadata for the property.
*@param value the value to set.
* 設定值
*/override fun setvalue(thisref: any, property: kproperty, value: string)
}
八、執行一下主方法
得到的輸出結果:
id="htmlid" >
id="headid" >
head>
id="bodyid"
class="bodyclass" >
href="" >kotlin中文部落格a>
body>
html>
好啦,結束啦! Kotlin領域特定語言(DSL)
一 dsl的概念 只在特定領域內使用的語言 例如 html gradle sql等等 特點 計算機程式語言 具有語言的表達能力 有限的表達能力 關注某個特定的領域 二 下面用dsl來寫乙個例子吧 需要下面五個類 三 建立乙個node節點的介面 package cn.kotliner.kotlin a...
DSL 領域特定語言 迷思
所謂領域專用語言 domain specific language dsl 其基本思想是 求專不求全 不像通用目的語言那樣目標範圍涵蓋一切軟體問題,而是專門針對某一特定問題的計算機語言。dsl之於程式設計師正如伽南地之於以色列人,是最初也是最終的夢想。幾乎自計算機發明伊始,人們就開始談論dsl使用d...
《領域特定語言》一2 3DSL的問題
前面已經討論了何時該採用dsl,接下來就該談論什麼時候不該採用dsl,或者至少是使用dsl應注意的問題。從根本上說,不使用dsl的唯一原因就是,在你的場景下,使用dsl得不到任何好處,或者,至少是dsl的好處不足以抵消構建它的成本。雖然dsl在有些場合下適用,但同樣會帶來一些問題。總的來說,我認為通...