# lark **Repository Path**: vteipjuq/lark ## Basic Information - **Project Name**: lark - **Description**: lark(百灵鸟)一种脚本编程语言,用go开发 - **Primary Language**: Go - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-11-23 - **Last Updated**: 2025-10-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # lark #### 介绍 lark(百灵鸟)一种脚本编程语言,用go开发 Mulan(花木兰) Corgi(柯基) ~~~ lark/ ├── main.go # 主入口 ├── repl/ # REPL核心 │ ├── repl.go # REPL循环实现 │ ├── history.go # 历史记录管理 ├── lexer/ # 词法分析 │ ├── lexer.go # 词法分析器 │ ├── tokens.go # Token定义 ├── parser/ # 语法分析 │ ├── parser.go # 解析器 │ ├── ast.go # AST节点定义 ├── eval/ # 解释执行 │ ├── eval.go # 解释器 │ ├── env.go # 环境变量 └── builtins/ # 内置函数 └── builtins.go lark/ ├── main.go # 主入口 ├── ast/ # AST节点定义 │ ├── ast.go # 基础接口和节点 │ ├── expressions.go # 表达式节点 │ └── statements.go # 语句节点 ├── evaluator/ # 解释执行和类型检查 │ ├── evaluator.go # 主求值逻辑 │ ├── typechecker.go # 类型检查 │ └── builtins.go # 内置函数 ├── lexer/ # 词法分析 │ └── lexer.go ├── lib/ # 标准库和模块加载 │ ├── module.go # 模块系统 │ └── stdlib.go # 标准库函数 ├── object/ # 运行时对象系统 │ ├── object.go # 对象接口和基础类型 │ ├── types.go # 类型系统 │ └── environment.go # 作用域环境 ├── parser/ # 语法分析 │ └── parser.go └── repl/ # 交互式环境 └── repl.go ~~~ /script-lang /ast # AST节点定义 /eval # 解释器 /lexer # 词法分析 /object # 运行时对象 /parser # 语法分析 /repl # 交互式环境 /token # token定义 main.go # 入口文件 ##### 编译为exe文件:go build ~~~ go build -o my_program.exe main.go ~~~ ##### 查看版本号 ~~~ go version ~~~ vscode中无法安装插件The "go-outline" command is not available. Run "go install -v github.com/ramya-rao-a/go-outline@latest" to install. #开启代理设置 go env -w GO111MODULE=on #设置代理源 go env -w GOPROXY=https://goproxy.cn,direct Go语言中没有内置的配置文件解析库,但你可以使用第三方库如github.com/spf13/viper来读取和解析配置文件 go get github.com/spf13/viper ##### 清理缓存 ~~~ go clean -modcache go clean -cache ~~~ Toml [database] user = "root" password = "secret" host = "localhost" [server] port = 8080 viper.SetConfigName("config") // 配置文件名称(不包含扩展名) viper.SetConfigType("toml") // 配置文件扩展名 viper.AddConfigPath(".") // 查找配置文件的路径 if err := viper.ReadInConfig(); err != nil { log.Fatalf("Error reading config file, %s", err) } ##### 读取配置 ~~~ fmt.Println("Database User:", viper.Get("database.user")) fmt.Println("Database Password:", viper.Get("database.password")) fmt.Println("Server Port:", viper.Get("server.port")) ~~~ 指针: //初始化变量 let five = 5; let ten = 10; //函数 let add = fn(x, y) { x + y; }; let result = add(five, ten); !-/*5; 5 < 10 > 5; if (5 < 10) { return true; } else { return false; } 10 == 10; 10 != 9; ##### sublime text 配置开发环境 ~~~ { "cmd": ["D:/project/go/src/lark/lark.exe","-u","$file"], "file_regex":"^[ ]*File \"(...*?)\", line ([0-9]*)", "selector":"source.lark", "env": {"PYTHONIOENCODING": "utf8"} } { "cmd": ["python", "-u", "$file", "$args"], "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)", "selector": "source.python", "shell": true, "env": {"PYTHONIOENCODING": "utf-8"} } { "cmd": ["python", "-u", "${file_name}"], "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)", "working_dir": "${file_path}", "selector": "source.python", "env": {"PYTHONIOENCODING": "utf-8"}, "variants": [ { "name": "Python (cmd)", "shell_cmd": "start cmd /c \"python -u \"${file_name}\" & pause\"" } ] } { "cmd": ["C:/Users/vteip/AppData/Local/Programs/Python/Python310/python.exe","-u","$file"], "file_regex":"^[ ]*File \"(...*?)\", line ([0-9]*)", "selector":"source.python", "env": {"PYTHONIOENCODING": "utf8"} } { "shell_cmd": "lark -u \"$file\"", "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)", "selector": "source.lark", "env": {"PYTHONIOENCODING": "utf-8"}, "working_dir": "${file_path}", "variants": [ { "name": "Run in External Terminal", "shell_cmd": "start cmd /c \"lark -u \"$file\" & pause\"" } ] } ~~~ lark -v 查看版本 ##### go 生成Windows PE文件头 ~~~ 如果你在寻找与 golang.org/x/sys/windows/pe 功能相似的库,以下是一些可能的选择: github.com/go-delve/delve/pkg/proc/win:这是 Delve 调试器的一部分,用于处理 Windows PE 文件。Delve 是一个流行的 Go 语言调试器,该库提供了对 PE 文件的分析和操作功能。 github.com/go-interpreter/runtime:这个库提供了与 PE 文件相关的功能,主要用于 Go 运行时的底层实现。它可以解析和操作 PE 文件,包括加载和链接等操作。 github.com/jaegertracing/jaeger/pkg/osutil:Jaeger 是分布式追踪系统,这个库提供了一些与操作系统交互的功能,包括对 PE 文件的解析。 github.com/matthewhartstonge/pefile:这是一个用 Python 编写的库,可以解析 Windows PE 文件。虽然它是 Python 库,但如果你熟悉 Python 和 PE 文件格式,它可能是一个有用的参考工具。 ~~~ ##### 在命令行输出好看的表格 ~~~ go get github.com/liushuochen/gotable ~~~ ##### go 打印变量的结构 ~~~ fmt.Printf("%v\n", left) // 基本格式 fmt.Printf("%+v\n", left) // 显示结构体字段名 fmt.Printf("%#v\n", left) // Go语法表示 ~~~ mysql go get -u github.com/go-sql-driver/mysql ├── io/ # 输入输出基础 ├── fs/ # 文件系统 ├── net/ # 网络 ├── json/ # JSON处理 ├── http/ # HTTP客户端/服务器 ├── crypto/ # 加密 ├── time/ # 时间处理 ├── fmt/ # 格式化 └── errors/ # 错误处理 ##### Sublime Text设置文件类型 ~~~ 修改用户设置文件(Preferences.sublime-settings): "extensions_map": { "*.la": "source.la" } ~~~ ##### VSCode设置文件类型 ~~~ 修改用户设置(settings.json): "files.associations": { "*.conf": "ini", "*.log": "log" } ~~~ 获取变量类型 getType() 获取变量长度(字符串,数组) len() 字符串截取 substr() 字符替换 字符转数组 日期时间 datetime() 日期 时间 时间戳 数组 array() 添加(头部添加,尾部添加) 删除 数组转字符 http请求 http() 文件/io mysql sys系统函数 打印输出(变量,数组)print() 变量类型转换 int(),float(),string(),bool() empty 检查一个变量是否为空 随机数 base64 let num1=5.5; print("num1:",num1) 分支110 异常错误抛出代码: 10000 未定义变量 20000 未知运算符 20001 不支持索引运算符 30000 未定义的函数 40000 不可用作哈希密钥 //获取变量类型 fmt.Printf("%T", latestCtimes) 命名空间管理机制 对于 import 的处理: 检查导入路径是否存在:可以检查导入路径是否对应于文件系统中的有效文件或模块存储位置。 检查循环导入:确保不会出现循环依赖,这可能需要维护一个导入图并进行图遍历检查。 检查命名冲突:确保导入的模块中的标识符不会与当前模块中的标识符冲突,这可能需要一个命名空间管理机制。 需求: 加入执行window系统命令的函数 ok go 一个文件合并到exe文件中(源码嵌入下可执行文件中) 动态代码生成与热更新 利用 Go 的text/template或go/ast包,让脚本支持 “动态生成代码并即时执行”。比如: go-script // 动态生成一个函数并调用 code = "func multiply(a, b) { a * b }" load(code) // 加载代码 print(multiply(3, 4)) // 输出 12 三、数据处理与分析 脚本语言在数据处理领域能大幅提高效率,尤其适合快速验证想法: 数据清洗与转换 比如处理 CSV、JSON 等格式的数据。例如: go-script // 从CSV提取年龄大于30的用户 data = csv.read("users.csv") filtered = data.filter(row => row.age > 30) json.write(filtered, "adults.json") 优势:比 Python 更轻量,无需安装额外依赖,适合在资源受限的环境运行。 简单统计与可视化 结合 Go 的绘图库(如go-echarts),快速生成数据图表: go-script // 分析销售数据并生成柱状图 sales = json.read("sales.json") chart = new BarChart("月度销售") for month in sales.months { chart.add(month.name, month.amount) } chart.save("sales.html") 优势:直接生成交互式 HTML 图表,无需依赖 Jupyter Notebook 等环境。 利用 Go 的 “静态编译” 特性,让用户可以把脚本直接打包成单个可执行文件(类似 Python 的pyinstaller,但更轻量)。比如: bash mylang build script.mylang ##### 版本更新说明: ~~~ 0.0.4 1.打包时可以命名为exe文件 0.0.5 新功能: 1.加入多个源码文件合并成一个*.lac文件 2.添加内置函数 setStartupOptions设置文件开机启动,cancelStartupOptions取消文件开机启动 3.添加内置函数 openExeFile打开可执行文件,command执行window命令 4.优化多文件合并一个文件 修复: 1.input()函数支持输入 2.修复打包exe文件后,无法运行的问题 3.修复变量不用let定义时不报错 0.0.6 1.加入自定义函数复制文字到剪切板 2.优化date()函数 3.优化print()函数 4.优化request()函数 5.加入函数声明提升 0.1.0 ~~~