Skip to content

Metastem/Xuan

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

44 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🎭

玄语言是一个基于Python实现的中文编程语言,旨在降低中文使用者的编程学习门槛,同时保留现代编程语言的强大功能和灵活性。

目录

项目简介

玄语言是一个使用中文关键字和函数名的编程语言,它基于Python的语法结构,但使用中文关键字和标识符,使中文使用者能够更直观地理解和编写代码。玄语言支持现代编程范式,包括面向对象编程、函数式编程和异步编程等。

主要特点

  • 中文关键字和函数名:使用中文作为语言的关键字和内置函数名,降低中文使用者的学习门槛
  • 兼容Python语法:基于Python的语法结构,保留了Python的强大功能和灵活性
  • 支持现代编程范式:支持面向对象编程、函数式编程、异步编程等现代编程范式
  • 丰富的内置功能:提供丰富的内置函数和标准库,涵盖常见的编程需求
  • 完善的错误处理:提供详细的错误信息和异常处理机制

安装方法

系统要求

  • Python 3.6 或更高版本
  • 支持 Windows、macOS 和 Linux 系统

从源代码安装

  1. 克隆项目仓库:
git clone https://github.com/Metastem/xuan.git
cd xuan
  1. 安装依赖:
pip install -r requirements.txt
  1. 安装玄语言:
pip install -e .

使用 pip 安装

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

# 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: 实现命令行接口

开发者指南

环境设置

  1. 克隆仓库并安装依赖:
git clone https://github.com/Metastem/xuan.git
cd xuan
pip install -r requirements.txt
pip install -e .
  1. 运行测试:
python -m pytest tests/

代码贡献指南

  1. Fork 项目仓库
  2. 创建功能分支
  3. 提交更改
  4. 推送到分支
  5. 创建 Pull Request

代码风格

  • 遵循 PEP 8 编码规范
  • 使用有意义的变量名和函数名
  • 添加适当的注释和文档字符串
  • 确保所有测试通过

提交消息规范

<类型>: <描述>

[可选的正文]

[可选的脚注]

类型可以是:

  • feat: 新功能
  • fix: 错误修复
  • docs: 文档更改
  • style: 代码风格更改
  • refactor: 代码重构
  • test: 测试相关
  • chore: 构建过程或辅助工具的变动

更新日志

v0.1.0 (2025-6-16)

  • 初始版本发布
  • 实现基本语言特性
  • 添加内置函数库
  • 提供示例程序

未来计划

  • 添加更多内置函数
  • 优化解释器性能
  • 添加更多语言特性
  • 改进错误处理和调试功能
  • 开发IDE插件
  • 完善文档和教程