项目作者: chai2010

项目描述 :
:dog::dog::dog: 狗头语言(gotlang) :dog::dog::dog:
高级语言: Go
项目地址: git://github.com/chai2010/gotlang.git
创建时间: 2019-11-03T20:29:53Z
项目社区:https://github.com/chai2010/gotlang

开源协议:Other

下载



狗头语言(Go Template Language)

狗头语言是“柴树杉(chai2010)”于2019年11月基于Go语言标准库text/template包定制的图灵完备的玩具语言。

安装

  1. $ go get github.com/chai2010/gotlang/got

例子1:输出命令行参数

创建hello.gotmpl程序,输出命令行参数:

  1. {{/* 狗头语 版权 @2019 柴树杉 */}}}
  2. {{template "main" .}}
  3. {{define "main"}}
  4. {{range $i, $v := . }}
  5. {{println $i $v}}
  6. {{end}}
  7. {{end}}

其中”{{}}”中间的是程序的语句,语句支持传统C语言风格的注释。然后通过{{template "main" .}}执行名字为”main”的模板,执行的参数是.表示的当前对象。这里的main模板可以看作是宏或者是函数,template指令会展开对应的宏函数,因此就产生了类似函数调用的效果(不过这个函数没有返回值)。然后通过range指令执行循环,每次循环打印相关信息。

运行脚本:

  1. $ got hello.gotmpl aa bb cc
  2. 0 aa
  3. 1 bb
  4. 2 cc

执行时第一个参数是程序的路径,后面的参数是传递给狗头语脚本的命令行参数,也就是之前提到的.表示的当前对象。然后就可以输出命令行参数了。

例子2:打印斐波那契数列

创建./examples/fib.gotmpl程序,输出斐波那契数列:

  1. {{/* 狗头语 版权 @2019 柴树杉 */}}}
  2. {{template_call "main" .}}
  3. {{define "main"}}
  4. {{range $_, $i := (xrange 10) }}
  5. {{printf "%d: %d\n" $i (template_call "fib" $i)}}
  6. {{end}}
  7. {{end}}}
  8. {{define "fib"}}
  9. {{if (le . 0)}}
  10. {{template_ret 0}}
  11. {{/*return fib(0)*/}}
  12. {{else if (eq . 1)}}
  13. {{template_ret 1}}
  14. {{/*return fib(1)*/}}
  15. {{else}}
  16. {{template_ret (add (template_call "fib" (sub . 1)) (template_call "fib" (sub . 2)))}}
  17. {{/*return fib(n-1) + fib(n-2)*/}}
  18. {{end}}
  19. {{end}}

这个例子更为复杂:其中涉及到了通过递归函数计算斐波那契数列,然后将数列的前10个值打印出来。

运行脚本:

  1. $ got ./examples/fib.gotmpl
  2. 0: 0
  3. 1: 1
  4. 2: 1
  5. 3: 2
  6. 4: 3
  7. 5: 5
  8. 6: 8
  9. 7: 13
  10. 8: 21
  11. 9: 34

语法高亮(VS Code)

安装 gotemplate-syntax 插件,效果如下:

版权

狗头语 版权 @2019 柴树杉。