Lioness • Cub • SavannaKit
Cub 编程语言
Cub 是一种受 Swift 启发的解释型、动态类型脚本语言。该项目包含一个词法分析器、解析器、编译器和解释器,所有这些都在 Swift 中编写。
Cub 用于 OpenTerm 的脚本功能。OpenTerm 和 在线 都有语言指南。Cub 是从 Lioness(我的第一种编程语言)演变而来的。
标准库(简称:stdlib)包含一些基本实用函数,例如将日期转换为日期格式。
源示例
以下 Cub 代码递归地计算阶乘
func factorial(x) returns {
if x > 1 {
return x * factorial(x - 1)
}
return 1
}
a = factorial(5) // a = 120
以下 Cub 代码使用 do times
循环
a = 1
n = 10
do n times {
a += a
}
// a = 1024
更多示例可以在 这里 找到。
外部函数
Cub 具有一个重要的特性,即为外部函数提供定义功能。这些函数是用本地代码(例如 Swift)实现的,因此允许 Cub 调用本地代码。
外部函数会暂停解释器,执行本地代码,并在本地代码执行完毕后恢复解释器。
以下示例实现了打印函数
let runner = Runner(logDebug: true, logTime: true)
runner.registerExternalFunction(name: "print", argumentNames: ["input"], returns: true) { (arguments, callback) in
for (name, arg) in arguments {
print(arg)
}
callback(nil)
}
外部函数在 Cub 中的调用方式与任何其他全局函数类似,如上例中的打印函数可以按以下方式调用
print("Hello world")
特性
- 简约而富有表现力的语法
- 无类型系统,语言是动态的
- 5个基本运算符:
+
,-
,/
,*
和^
^
表示“乘方”,例如2^10
等于 1024- 所有运算符都有简写,例如
+=
为+
- 数值
- 所有数值都是浮点数
- 布尔值
- 可以通过比较进行评估
- 可以通过字面量定义:
true
或false
- 字符串
- 可以使用 + 运算符连接
- 数组
- 可以包含任何类型,包括其他数组
- 函数
- 支持参数、返回值和递归
- 可以定义在其他函数内
- 结构体
- 可以包含任何类型,包括其他结构体
- 循环
for
while
do-while
重复-while
break
continue
if
/else
/else if
条件语句
运行
由于该项目不依赖于任何依赖项,运行它无需设置。
macOS
打开 Cub.xcworkspace
(建议使用最新非测试版 Xcode),并运行 macOS Example
目标。示例将在 A.cub
中运行代码。输出将被打印到控制台。
安装框架
使用 Swift Package Manager
将依赖项部分添加到 Package.swift
文件中
.Package(url: "https://github.com/louisdh/cub.git",
majorVersion: 1, minor: 0)
使用 CocoaPods
将以下行添加到您的 Podfile
pod 'Cub', '~> 1.0'
使用 Carthage
将以下行添加到您的 Cartfile
github "louisdh/cub" ~> 1.0
运行 carthage update
以构建框架,并将构建的 Cub.framework
拖放到您的 Xcode 项目中。
路线图
- 结构体
- 完成建议(给定一个不完整的源字符串和插入点)
- 解释器中的断点支持
- Stdlib 文档
- 编译器警告
- 编译器优化
- 更快的 Lexer(无需正则表达式)
- 支持标识符名称中的表情符号
-
guard
语句 - 大量更多的单元测试
- Linux 支持
Xcode 文件模板
Cub 源文件可以轻松地使用 Xcode 创建,有关说明见 XcodeTemplate.md。
架构
有关项目架构的详细说明可以在此处找到。这里。
许可协议
本项目适用于 MIT 许可协议。有关更多信息,请参阅 LICENSE 文件。