golang代码生成工具提供泛型、自由格式宏、条件编译和HTML模板插件generis的使用
Generis - Golang 代码生成工具
Generis 是一个轻量级的代码预处理器,为 Go 语言添加了以下特性:
- 泛型
- 自由格式宏
- 条件编译
- HTML 模板
- Allman 风格转换
示例代码
以下是一个完整的示例,展示了 Generis 的主要功能:
package main;
// -- IMPORTS
import (
"html"
"io"
"log"
"net/http"
"net/url"
"strconv"
);
// -- DEFINITIONS
#define DebugMode
#as true
// ~~
#define HttpPort
#as 8080
// ~~
#define WriteLine( {{text}} )
#as log.Println( {{text}} )
// ~~
#define local {{variable}} : {{type}};
#as var {{variable}} {{type}};
// ~~
#define DeclareStack( {{type}}, {{name}} )
#as
// -- TYPES
type {{name}}Stack struct
{
ElementArray []{{type}};
}
// -- INQUIRIES
func ( stack * {{name}}Stack ) IsEmpty(
) bool
{
return len( stack.ElementArray ) == 0;
}
// -- OPERATIONS
func ( stack * {{name}}Stack ) Push(
element {{type}}
)
{
stack.ElementArray = append( stack.ElementArray, element );
}
// ~~
func ( stack * {{name}}Stack ) Pop(
) {{type}}
{
local
element : {{type}};
element = stack.ElementArray[ len( stack.ElementArray ) - 1 ];
stack.ElementArray = stack.ElementArray[ : len( stack.ElementArray ) - 1 ];
return element;
}
#end
// ~~
#define DeclareStack( {{type}} )
#as DeclareStack( {{type}}, {{type:PascalCase}} )
// -- TYPES
DeclareStack( string )
DeclareStack( int32 )
// -- FUNCTIONS
func HandleRootPage(
response_writer http.ResponseWriter,
request * http.Request
)
{
local
boolean : bool;
local
natural : uint;
local
integer : int;
local
real : float64;
local
escaped_html_text,
escaped_url_text,
text : string;
local
integer_stack : Int32Stack;
boolean = true;
natural = 10;
integer = 20;
real = 30.0;
text = "text";
escaped_url_text = "&escaped text?";
escaped_html_text = "<escaped text/>";
integer_stack.Push( 10 );
integer_stack.Push( 20 );
integer_stack.Push( 30 );
#write response_writer
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title><%= request.URL.Path %></title>
</head>
<body>
<% if ( boolean ) { %>
<%= "URL : " + request.URL.Path %>
<br/>
<%@ natural %>
<%# integer %>
<%& real %>
<br/>
<%~ text %>
<%^ escaped_url_text %>
<%= escaped_html_text %>
<%= "<%% ignored %%>" %>
<%% ignored %%>
<% } %>
<br/>
Stack :
<br/>
<% for !integer_stack.IsEmpty() { %>
<%# integer_stack.Pop() %>
<% } %>
</body>
</html>
#end
}
// ~~
func main()
{
http.HandleFunc( "/", HandleRootPage );
#if DebugMode
WriteLine( "Listening on http://localhost:HttpPort" );
#end
log.Fatal(
http.ListenAndServe( ":HttpPort", nil )
);
}
语法说明
#define 指令
常量和通用代码可以使用以下语法定义:
#define old code
#as new code
#define old code
#as
new
code
#end
#define
old
code
#as new code
#define
old
code
#as
new
code
#end
#if 指令
条件代码可以使用以下语法定义:
#if boolean expression
#if boolean expression
...
#else
...
#end
#else
#if boolean expression
...
#else
...
#end
#end
#write 指令
模板化的 HTML 代码可以使用以下语法发送到流写入器:
#write writer expression
<% code %>
<%@ natural expression %>
<%# integer expression %>
<%& real expression %>
<%~ text expression %>
<%= escaped text expression %>
<%! removed content %>
<%% ignored tags %%>
#end
安装
- 安装 DMD 2 编译器(在 Windows 上使用 MinGW 设置选项)
- 使用以下命令构建可执行文件:
dmd -m64 generis.d
使用示例
generis --process GS/ GO/
读取 GS/
文件夹中的 Generis 文件并将 Go 文件写入 GO/
文件夹。
generis --process GS/ GO/ --create --watch
读取 GS/
文件夹中的 Generis 文件并将 Go 文件写入 GO/
文件夹,如果需要则创建输出文件夹,并监视 Generis 文件的修改。
版本
2.0
作者
Eric Pelzer (ecstatic.coder@gmail.com)
许可证
本项目根据 GNU 通用公共许可证第 3 版授权。
更多关于golang代码生成工具提供泛型、自由格式宏、条件编译和HTML模板插件generis的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复