CNplus 自己是个小语言,但它站在 Python 这个巨人的肩膀上。用「导入」,几十万个 Python 库都能为你所用——读写文件、上网、算数学、画图……
| 命令 | 后端 | 特点 |
|---|---|---|
cnp 运行 x.cnp |
树遍历 | 直接解释执行,启动快,报错精准 |
cnp 运行 --python x.cnp |
Python 转译 | 先翻成 Python 再跑,能借用 pip 生态 |
cnp 编译 x.cnp |
Python 转译 | 生成独立的 .py,拷到别处也能跑 |
树遍历和 Python 转译共同支持的语言能力,会用黄金语料和针对性测试持续对拍;同一段确定性的程序应得到相同输出。测试总数随版本变化,以首页记录的当前完整测试结果为准。
导入 "math" 作为 数学
打印(文本(数学.sqrt(16))) # 4.0
打印(文本(数学.pi)) # 3.141592653589793
三行读懂:
导入 后面跟库名,写在引号里(库名是英文,因为那是 Python 的库)作为 数学 给它起个中文名,之后就用这个名字. 访问库里的东西:数学.sqrt不起别名也行,默认用库名本身:
导入 "random"
打印(文本(random.randint(1, 6))) # 掷骰子
导入的 Python 函数保留 Python 常见的传法:可以先写位置参数,再写 名字 = 值,也可以全部按名字传。这是它和 CNplus 自定义函数不同的地方。
导入 "json" 作为 JSON
设 数据 = {"你好": 1}
打印(JSON.dumps(数据, ensure_ascii = 假))
# {"你好": 1}
这里 数据 按位置传,ensure_ascii = 假 按名字传,让中文保持原样。顺序只能是“位置在前、名字在后”;写了关键字参数以后,不能再补位置参数。CNplus 自定义函数、方法和初始化不能这样混写,见函数入门。
导入 "pathlib" 作为 路径库
设 文件 = 路径库.Path("/tmp/我的笔记.txt")
文件.write_text("你好,文件!", "utf-8")
设 内容 = 文件.read_text("utf-8")
打印(内容)
⚠️ 借用库可用树遍历(
cnp 运行)或转译后端(cnp 运行 --python/cnp 编译)。只有 JS 后端不支持导入(运行时报 CN0303)。
cnp 编译 我的程序.cnp
# 生成 我的程序.py,可在装有 Python 3.11 或更高版本的电脑上运行
python3 我的程序.py
生成的 .py 不依赖 CNplus,因为所需的 CNplus 运行逻辑已经写进文件;如果源码导入了第三方 Python 库,目标电脑仍要安装对应的库。
库抛出的错误会被标成 CN9001,并告诉你这是库的错,不是 CNplus 的错:
错误[CN9001]: 调用 Python 库时出错:ValueError: math domain error
--> 我的程序.cnp:3:1
| 设 x = 数学.sqrt(-1)
= 也就是说: 这个错误来自你导入的 Python 库,不是 CNplus 本身
= 这样改: 检查传给库的参数类型和数量,或参考该库的文档
注意它准确指向出错的那一行(第 3 行),不是导入那一行。
导入:编译成 JS 后运行会报 CN0303(中文提示说清)。要用库就留在树遍历(cnp 运行)或 Python 后端(--python / 编译)。全部运行方式见运行程序的几种方式。学过 Python 的人,看这里。这一章本身就是「用 Python 的库」,所以对照很直接。
把这一章串成一个完整程序(CNplus):
导入 "math" 作为 数学
打印(数学.sqrt(16))
同一个程序,用 Python 写:
import math # 导入 "math" 作为 数学
print(math.sqrt(16)) # 数学.sqrt(16)
| CNplus | Python |
|---|---|
导入 "math" 作为 数学 |
import math(或 import math as 数学) |
数学.sqrt(16) |
math.sqrt(16) |
转译执行 --python |
本来就是 Python |
cnp 编译 |
生成的 .py 就是 Python 源码 |
本质:CNplus 的 Python 转译后端就是把 .cnp 翻译成 Python 再跑,所以 导入 直接落到了 Python 的 import 上。cnp 编译 生成的不依赖 CNplus 的 .py,你甚至能直接读它,看 CNplus 是怎么翻译你的代码的。
新建 /tmp/导入数学.cnp:
导入 "math" 作为 数学
打印(数学.sqrt(49))
依次运行:
cnp 运行 /tmp/导入数学.cnp
cnp 运行 --python /tmp/导入数学.cnp
cnp 运行 --js /tmp/导入数学.cnp
7.0;第三条会报 CN0303。这个任务不是让你修 JS,而是亲手确认“树遍历和 Python 支持导入,JS 不支持”的边界。下一课:看懂错误