Kotlin領域特定語言(DSL)

2021-09-20 08:19:58 字數 2786 閱讀 1196

一、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在有些場合下適用,但同樣會帶來一些問題。總的來說,我認為通...