玄语言是一个基于Python实现的中文编程语言,旨在降低中文使用者的编程学习门槛,同时保留现代编程语言的强大功能和灵活性。
玄语言是一个使用中文关键字和函数名的编程语言,它基于Python的语法结构,但使用中文关键字和标识符,使中文使用者能够更直观地理解和编写代码。玄语言支持现代编程范式,包括面向对象编程、函数式编程和异步编程等。
- 中文关键字和函数名:使用中文作为语言的关键字和内置函数名,降低中文使用者的学习门槛
- 兼容Python语法:基于Python的语法结构,保留了Python的强大功能和灵活性
- 支持现代编程范式:支持面向对象编程、函数式编程、异步编程等现代编程范式
- 丰富的内置功能:提供丰富的内置函数和标准库,涵盖常见的编程需求
- 完善的错误处理:提供详细的错误信息和异常处理机制
- Python 3.6 或更高版本
- 支持 Windows、macOS 和 Linux 系统
- 克隆项目仓库:
git clone https://github.com/Metastem/xuan.git cd xuan- 安装依赖:
pip install -r requirements.txt- 安装玄语言:
pip install -e .pip install xuan安装完成后,可以通过以下命令验证安装是否成功:
xuan --version玄语言的语法基于Python,但使用中文关键字和标识符。以下是玄语言的主要语法特性:
变量名 = 值 例如:
年龄 = 25 姓名 = "张三" # 这是单行注释 """ 这是多行注释 可以跨越多行 """ 玄语言支持以下基本数据类型:
- 整数:如
1,100,-10 - 浮点数:如
3.14,-0.01 - 字符串:如
"你好",'世界' - 布尔值:
真和假 - 空值:
空
- 列表:如
[1, 2, 3] - 字典:如
{"姓名": "张三", "年龄": 25} - 集合:如
{1, 2, 3} - 元组:如
(1, 2, 3)
如果 条件: # 代码块 否则如果 条件: # 代码块 否则: # 代码块 例如:
如果 年龄 >= 18: 输出("成年人") 否则: 输出("未成年人") 对于 变量 在 可迭代对象: # 代码块 例如:
对于 i 在 范围(1, 5): 输出(i) 当 条件: # 代码块 例如:
i = 0 当 i < 5: 输出(i) i += 1 - 跳过:跳过当前循环迭代
- 终止:终止整个循环
- 返回:从函数返回值
定义 函数名(参数1, 参数2, ...): # 函数体 返回 结果 例如:
定义 计算平方(数字): 返回 数字 * 数字 定义 问候(姓名="世界"): 返回 "你好," + 姓名 定义 求和(*数字): 总和 = 0 对于 数 在 数字: 总和 += 数 返回 总和 定义 创建用户(**属性): 用户 = {} 对于 键, 值 在 属性.项目(): 用户[键] = 值 返回 用户 类 类名: 定义 初始化(自身, 参数1, 参数2, ...): 自身.属性1 = 参数1 自身.属性2 = 参数2 定义 方法名(自身, 参数1, 参数2, ...): # 方法体 返回 结果 例如:
类 人: 定义 初始化(自身, 姓名, 年龄): 自身.姓名 = 姓名 自身.年龄 = 年龄 定义 介绍(自身): 返回 f"我叫{自身.姓名},今年{自身.年龄}岁。" 类 子类(父类): 定义 初始化(自身, 参数1, 参数2, ...): 父类.初始化(自身, 参数1, ...) 自身.属性 = 值 例如:
类 学生(人): 定义 初始化(自身, 姓名, 年龄, 学号): 人.初始化(自身, 姓名, 年龄) 自身.学号 = 学号 定义 介绍(自身): 返回 f"我叫{自身.姓名},今年{自身.年龄}岁,学号是{自身.学号}。" 尝试: # 可能引发异常的代码 捕获 异常类型 作为 异常变量: # 处理异常的代码 最后: # 无论是否发生异常都会执行的代码 例如:
尝试: 数字 = 整数(输入("请输入一个数字:")) 结果 = 10 / 数字 输出(f"10 除以 {数字} 等于 {结果}") 捕获 值错误: 输出("输入的不是有效的数字!") 捕获 零除错误: 输出("不能除以零!") 最后: 输出("计算结束。") 导入 模块名 从 模块名 导入 函数名1, 函数名2, ... 从 模块名 导入 * 例如:
导入 数学 从 随机 导入 随机数, 随机整数 使用 打开文件("文件名", "模式") 作为 文件: 内容 = 文件.读取() # 处理文件内容 例如:
尝试: 使用 打开文件("data.txt", "r") 作为 文件: 内容 = 文件.读取() 输出(内容) 捕获 文件未找到错误: 输出("文件不存在!") [表达式 对于 变量 在 可迭代对象 如果 条件] 例如:
平方列表 = [x * x 对于 x 在 范围(1, 6)] # [1, 4, 9, 16, 25] 偶数平方 = [x * x 对于 x 在 范围(1, 11) 如果 x % 2 == 0] # [4, 16, 36, 64, 100] {键表达式: 值表达式 对于 变量 在 可迭代对象 如果 条件} 例如:
平方字典 = {x: x * x 对于 x 在 范围(1, 6)} # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25} 定义 生成器函数(): 对于 i 在 范围(10): 产出 i 例如:
定义 斐波那契(n): a, b = 0, 1 对于 _ 在 范围(n): 产出 a a, b = b, a + b 定义 装饰器(函数): 定义 包装(*参数, **关键字参数): # 前置处理 结果 = 函数(*参数, **关键字参数) # 后置处理 返回 结果 返回 包装 @装饰器 定义 被装饰函数(): # 函数体 例如:
定义 计时器(函数): 定义 包装(*参数, **关键字参数): 开始时间 = 当前时间() 结果 = 函数(*参数, **关键字参数) 结束时间 = 当前时间() 输出(f"函数 {函数.__名称__} 执行时间: {结束时间 - 开始时间} 秒") 返回 结果 返回 包装 @计时器 定义 耗时函数(): 睡眠(1) 返回 "完成" 异步 定义 异步函数(): # 异步操作 等待 异步操作() 返回 结果 例如:
异步 定义 获取数据(url): 等待 睡眠(1) # 模拟网络请求 返回 f"来自 {url} 的数据" 异步 定义 主函数(): 结果 = 等待 获取数据("https://example.com") 输出(结果) 玄语言提供了丰富的内置函数,这些函数使用中文命名,便于中文使用者理解和使用。以下是主要的内置函数分类:
- 输出(值):打印值到标准输出
- 输入(提示=None):从标准输入读取一行
- 打印(值):与输出相同,打印值到标准输出
- 整数(值):将值转换为整数
- 浮点数(值):将值转换为浮点数
- 字符串(值):将值转换为字符串
- 布尔(值):将值转换为布尔值
- 列表(值):将值转换为列表
- 字典(值):将值转换为字典
- 集合(值):将值转换为集合
- 元组(值):将值转换为元组
- 绝对值(数字):返回数字的绝对值
- 最大值(*值):返回最大值
- 最小值(*值):返回最小值
- 总和(可迭代对象):返回可迭代对象中所有元素的和
- 幂(底数, 指数):返回底数的指数次方
- 四舍五入(数字, 小数位=0):对数字进行四舍五入
- 向上取整(数字):返回大于或等于数字的最小整数
- 向下取整(数字):返回小于或等于数字的最大整数
- 平方根(数字):返回数字的平方根
- 对数(数字, 底数=10):返回以指定底数的对数
- 正弦(角度):返回角度的正弦值(角度以弧度为单位)
- 余弦(角度):返回角度的余弦值(角度以弧度为单位)
- 正切(角度):返回角度的正切值(角度以弧度为单位)
- 阶乘(数字):返回数字的阶乘
- 随机数():返回0到1之间的随机浮点数
- 随机整数(最小值, 最大值):返回指定范围内的随机整数
- 随机选择(序列):从序列中随机选择一个元素
- 随机打乱(序列):随机打乱序列中的元素
- 随机样本(序列, 数量):从序列中随机选择指定数量的元素
- 范围(开始, 结束=None, 步长=1):创建一个数字序列
- 长度(序列):返回序列的长度
- 排序(序列, 反向=False):对序列进行排序
- 反转(序列):反转序列中的元素顺序
- 枚举(序列):返回序列中的索引和值对
- 过滤(函数, 序列):使用函数过滤序列中的元素
- 映射(函数, 序列):对序列中的每个元素应用函数
- 压缩(*序列):将多个序列打包成元组对的列表
- 链接(*序列):将多个序列连接成一个序列
- 分割(字符串, 分隔符=None):将字符串按分隔符分割
- 连接(序列, 分隔符=""):使用分隔符将序列中的字符串连接
- 替换(字符串, 旧值, 新值, 次数=-1):替换字符串中的子串
- 去除空白(字符串):去除字符串两端的空白字符
- 左对齐(字符串, 宽度):左对齐字符串
- 右对齐(字符串, 宽度):右对齐字符串
- 居中对齐(字符串, 宽度):居中对齐字符串
- 是数字(字符串):检查字符串是否只包含数字
- 是字母(字符串):检查字符串是否只包含字母
- 是字母数字(字符串):检查字符串是否只包含字母和数字
- 大写(字符串):将字符串转换为大写
- 小写(字符串):将字符串转换为小写
- 首字母大写(字符串):将字符串的首字母转换为大写
- 打开文件(文件名, 模式="r"):打开文件并返回文件对象
- 读取文件(文件名):读取整个文件内容
- 写入文件(文件名, 内容):将内容写入文件
- 追加文件(文件名, 内容):将内容追加到文件末尾
- 文件存在(路径):检查文件是否存在
- 删除文件(路径):删除指定文件
- 创建目录(路径):创建目录
- 删除目录(路径):删除目录
- 列出目录(路径):列出目录中的文件和子目录
- 当前时间():返回当前时间戳
- 睡眠(秒数):暂停执行指定的秒数
- 系统命令(命令):执行系统命令
- 环境变量(名称):获取环境变量的值
- 设置环境变量(名称, 值):设置环境变量的值
- 退出(状态码=0):退出程序
- 获取平台():获取当前操作系统平台
- 获取Python版本():获取Python解释器版本
# hello_world.xuan 输出("你好,世界!")# fibonacci.xuan 定义 斐波那契(n): 如果 n <= 0: 返回 [] 否则如果 n == 1: 返回 [0] 否则如果 n == 2: 返回 [0, 1] 结果 = [0, 1] 对于 i 在 范围(2, n): 结果.添加(结果[i-1] + 结果[i-2]) 返回 结果 # 生成前10个斐波那契数 数列 = 斐波那契(10) 输出(f"斐波那契数列: {数列}")# todo_manager.xuan 类 待办事项: 定义 初始化(自身): 自身.任务列表 = [] 定义 添加任务(自身, 任务): 自身.任务列表.添加({"任务": 任务, "完成": 假}) 输出(f"已添加任务:{任务}") 定义 完成任务(自身, 索引): 如果 0 <= 索引 < 长度(自身.任务列表): 自身.任务列表[索引]["完成"] = 真 输出(f"已完成任务:{自身.任务列表[索引]['任务']}") 否则: 输出("无效的任务索引!") 定义 显示任务(自身): 如果 长度(自身.任务列表) == 0: 输出("没有待办任务。") 返回 输出("\n待办事项列表:") 对于 i, 任务 在 枚举(自身.任务列表): 状态 = "✓" 如果 任务["完成"] 否则 " " 输出(f"{i+1}. [{状态}] {任务['任务']}") # 使用示例 管理器 = 待办事项() 管理器.添加任务("学习玄语言") 管理器.添加任务("完成项目文档") 管理器.添加任务("准备演示") 管理器.显示任务() 管理器.完成任务(0) 管理器.显示任务()xuan/ ├── xuan/ # 核心源代码 │ ├── __init__.py # 包初始化文件 │ ├── lexer.py # 词法分析器 │ ├── parser.py # 语法分析器 │ ├── ast.py # 抽象语法树 │ ├── interpreter.py # 解释器 │ ├── builtins.py # 内置函数 │ ├── exceptions.py # 异常定义 │ └── cli.py # 命令行接口 ├── requirements.txt # 依赖要求 ├── README.md # 项目说明 └── LICENSE # 许可证 - lexer.py: 词法分析器,将源代码转换为标记流
- parser.py: 语法分析器,将标记流转换为抽象语法树
- ast.py: 定义抽象语法树的节点类型
- interpreter.py: 解释器,执行抽象语法树
- builtins.py: 实现内置函数和类型
- exceptions.py: 定义自定义异常类型
- cli.py: 实现命令行接口
- 克隆仓库并安装依赖:
git clone https://github.com/Metastem/xuan.git cd xuan pip install -r requirements.txt pip install -e .- 运行测试:
python -m pytest tests/- Fork 项目仓库
- 创建功能分支
- 提交更改
- 推送到分支
- 创建 Pull Request
- 遵循 PEP 8 编码规范
- 使用有意义的变量名和函数名
- 添加适当的注释和文档字符串
- 确保所有测试通过
<类型>: <描述> [可选的正文] [可选的脚注] 类型可以是:
- feat: 新功能
- fix: 错误修复
- docs: 文档更改
- style: 代码风格更改
- refactor: 代码重构
- test: 测试相关
- chore: 构建过程或辅助工具的变动
- 初始版本发布
- 实现基本语言特性
- 添加内置函数库
- 提供示例程序
- 添加更多内置函数
- 优化解释器性能
- 添加更多语言特性
- 改进错误处理和调试功能
- 开发IDE插件
- 完善文档和教程
