化学 突发奇想:CNX Script
@白芥呀~
什么意思喵?ASCII?
我是说很多地方,比如说只有小括号... 很难搞。我补了一些漏洞但是还是不太舒服
食用前须知(有关设定):
众所周知 CNX 可以逆向破解,对就是你想的各种1Shi8下27=上左然后进入an模式然后注入内存编辑器然后编辑内存然后做一大堆奇奇怪怪的事情。要是我们在这个基础上拆机然后加一个存储器和处理器进去然后封起来,然后历经千辛万苦注入一个编译器进去,理论上可以把 CNX 变成支持面向对象语言的可编程计算器,而且正常看不出来,然后我们就可以把它愉快地带进国初考场啦!(划掉)
当然首先作弊有风险,其次可编程在 ChO 中也没什么喵用,再者要经历千辛万苦,所以真正去实现它不是一个好主意。但这是一个很棒的思想实验。在下文中,我们将阐述我们在『所有字符都能用 CNX 的键盘正常输入』的场景下,我设计的编程语言--完全实现高级语言的通用功能。
===--- 正文 ---===
一、文件管理
在我们的设计中,键入一行 °°°[将此中括号替换为文件名]: 可以进入编程模式 (众所周知 : 号是多语句分隔符,在我们的语言中将被当作换行符使用)。任意一个清屏键 (包括 AC, On, Shift+AC 等) 会退出编程模式并以输入的文件名做键名将代码自动保存到存储器中。进入编程模式时,如果输入的键在存储器中有值,键入 : 时将自动加载已有的代码。
比如说,下面的这些都是合法的文件名,CNX 可以输入下面所有的字符。(虽然可能也只有我这么闲的人能熟练地用这些字符凑出任意一句话就是了...)

二、数据类型与输入输出
很显然,英文文本的输入是极其受限的,像上面那些标题,打一个就要好久。那么我们绝对不能使用 "用科学常数字符凑 Print,用 Print 当输出函数" 的方式。

这里有一张新的图。关于输入输出,我们看 Line 1 A=, A: ,其中 A= 赋值语句后面是空的的时候,默认需要用户输入进行赋值,那么希望输入的时候直接 A= 即可。
如果 A 是一个数组,那么需要提前规定数组大小 size,然后读取 size 个数。如果 A 是一个对象,那么需要用 CNXSON (JSON... CNXSON,嗯... 我是乱叫的。因为 CNX 显然无法输入完整的 JSON) 输入。
逗号和冒号都是我们的语句分隔符。可以用逗号和冒号决定是否想在语句结束时换行 (因为 CNX 没有内置换行符...)
那么后面一个语句 A,单独的一个表达式,没有任何操作,我们默认这是要输出的意思。
关于数据类型,我们看后面的 Lines。CNX Script 的变量可以直接赋值和调用,无需提前声明。没有赋值过的变量调用时默认是 Number,值为 0。
我们可以给变量赋值为 Number, Array, 对象和函数。
看 Line 3,A = (1, 2, 3)。为什么是小括号?因为 CNX 没有中括号。
但是这带来了一个问题,比如 (2 + 3) * 4,这玩意的小括号... 它是一个数组,还是单纯改变运算顺序?
我们的解决方案是禁止数组只包含一个元素。只包含一个元素的数组会被强制转化为 Number,比如 (2 + 3) 得到 5,而不是 (5)。
所以 Line 3 输出的 A 的值是 (1, 2, 3),Line 5 输出的 A 的值是 12。
如果您细心可能会发现 Line 4 有个不知何意味的 (1, 2) × 2。这是啥?嗯,实际上这意味着把数组里每一个能 × 2 的元素都 × 2,然后返回结果数组。比如这里的 (1, 2) × 2 = (2, 4)。更极端的情况,((1, 2, 3), 4, %(R(π1*2))) × 2,其中的元素包括:数组 (1, 2, 3),函数 %(R(π1*2))。注意,(1, 2, 3) 尽管是一个元素,但是它作为数组,也可以和 2 相乘!所以返回:((2, 4, 6), 8, %(R(π1*2)))。
