Valence:一种兼具同形异义与结构歧义的人造语言
来源标题:Valence: A language of homonymy and structural ambiguity
Valence 是一种由八个符号构成的语言,同一符号可作单子或二元运算符,产生同形异义与结构歧义。以 𐆉 为例,既可视为接收 𐅻 的单子,也可视为接收 𐅾 与 𐅻 的二元中缀函数,从而改变代码的语法树与命令归属。该语言为每个符号提供完整词库,并用颜色标注其可承担的角色及参数期望类型。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
在第一层解读中,𐆉 是一个 monad,以 𐅻 作为其唯一参数。随后它作为参数被传给 𐅾: 因此 𐆉 是一个表达式,是 𐅾 的参数,而 𐅾 作为最外层的函数,就是命令。 𐅾 𐆉 𐅻 𐆉 解读二:dyad,中缀 [a F b] 在第二种解读中,𐆉 被当作 dyad,以另外两个符号作为它的两个参数: 在这种情况下,𐆉 是树的顶端,因此确实是这一行代码的命令。 𐆉 𐅾 𐅻 词表 以下是该语言的完整词表:八个符号的每一种解读。颜色是角色色块,显示该符号可以充当的角色(在左侧),以及它的参数将以什么角色被理解(在右侧,括号中)。 每个符号至少代表一条命令;参数的数量(在其右侧括号中标明)决定是哪一条。 参数的颜色显示该位置期望什么;该位置的符号将如何被求值(作为 表达式、作为 类型、作为 数字,等等)。 例如,第一个符号 𐅶 可以读作 0o0, 其中 表明它同时充当表达式和八进制数字的角色。同一个符号也可以读作 not [ ]:一个以单个表达式为参数的表达式。 一旦考虑语义,𐅾 𐆉 𐅻 就有四种解读,而非两种。 𐅾[𐆉[𐅻]] 𐅾 goto 𐆉 int() 𐅻 var 𐅻 goto(int(𐅻)) [𐅾]𐆉[𐅻] 𐆉 assign 𐅾 var 𐅾 𐅻 var 𐅻 𐅾 = 𐅻 𐅾[𐆉[𐅻]] 𐅾 goto 𐆉 int() 𐅻 0o5 goto(int(0o5)) [𐅾]𐆉[𐅻] 𐆉 assign 𐅾 var 𐅾 𐅻 0o5 𐅾 = 0o5 这段代码有两条命令:𐆉 作为 dyad(assign),以及 𐅾 作为 monad(goto)。此外,两者对最后一个符号 𐅻 各有两种读法:作为字面值(0o5)或作为变量 𐅻。如果我们想强制只有一种解读,可以写 𐅾[𐅻] 或 𐆇[𐅻] 来构成完整的代码行 [𐅾]𐆉[𐆇[𐅻]],它只有一种解释。 在 Valence 中,有两种拆分程序的策略:符号 vs 整数,或 monad vs dyad,通常也就是 assign vs goto。 要理解 goto(int(𐅻)) 与 goto(int(0o5)) 之间的区别,我们需要看流控制。 Valence 同时支持结构化和非结构化流控制。 while 以 𐅶[x] 开始, 在 处循环。 while 的参数可以是任何能解析为 bool 或 int 的表达式。这个例子会打印 3、2、1。当 𐅶 降到零时,循环结束。 while queue 以 [x]𐆇[y] 开始, 其中 x 是队列,y 是从 x 中出队得到的值。 在 处循环。 队列将数据存储扩展到 Valence 八个变量各自的八个值之外。它可以持有任何类型的值,包括其他队列。 每次迭代都会将 𐆁 队首的元素出队到 𐅶 中。两个变量都不需要前置的 ,因为该命令已指定两个参数都是 var。队列为空时循环终止。 注意 3 被隐式转换为队列。对非队列、非字符串变量运行 APPEND 会将其转换为队列,并以现有值作为第一个元素。 goto [x],跳转到由表达式 x 标识的标签。 要理解 Valence 的 goto,重要的是认识到它只处理标签,而非行号。你永远不需要知道某条语句的行号,通常也无需计算行与行之间的距离。 𐆉 label [ ] 接受一个 var,并将当前行号存入其中,以便之后 goto [那个变量]。标签化是一条预处理指令;可以向前或向后跳转。它会跳到两者中较近的一个,距离相等时向后跳。虽然可以直接操作这个数字,但这并非典型的 Valent 风格。 然而,带标签的行号不能被并入传递给 goto 的表达式,因为 goto [value] 与 goto [variable] 的解释方式不同。所有非 var 表达式都会被转换为整数,并通过变量间接寻址映射到对应的变量。变量间接寻址避免了程序中大量 goto 都跳向前八行代码的情况。 这个例子的开头相同,𐅻 充当标签。当执行到达 goto((𐅻 + 2)) 时,它并不会跳到标签为 𐅻 的那一行再加两行;如果那样,程序将进入无限循环。它也不会跳到 set_label(𐅻) 之后两个位置的符号,即 set_label(𐆁) 处。 相反,表达式 𐅻 + 2 会按数值求值。由于 𐅻 的整数值为 0,结果为 2。该值对应符号 ,其标签指向第 5 行,因此执行在那里继续。程序因此输出 02。 直接赋值是 𐆉 assign [ ]。 此外还有 𐅶 add assign [ ] 和 𐆁 mul assign [ ]。 变量可以用 var 指示符显式命名: 读作 var [ ],也可以表示为任意表达式,由该表达式选出被赋值的变量。 第二种情况可能看起来很奇怪;(6 - 0) = (1 - 7) 该怎么理解( [[𐆇𐆊]𐆇[𐆇𐅶]]𐆉[[𐆇𐆇]𐆇[𐆇𐆁]] )? 赋值的左侧会按与之前相同的模式作为一个解析为变量的表达式求值。(6 - 0) 解析为 6,即变量 𐆊,因此等价于 𐆊 = (1 - 7)。 如果表达式的结果大于 7,它会被取模到 0-7 的范围,以指示字面值对应该数字的变量。非整数值会被转换为 int。 Valence 是用左手打字的。八个符号各有一个按键,位于左手下方的字母区: 编辑器上方的按钮用鼠标或手机也能实现同样操作:每个符号一个按钮,角落显示其按键,然后是 [ 和 ]、↵ 用于换行,← 用于删除光标前的字符(或选中的文本)。每个按钮都在光标处插入。
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。