走向更强的 Literal 的时代

发布时间 2023-08-28 13:57:21作者: Inshua

正如 声明式编程的没落 - Inshua - 博客园 分析,声明式编程由于不符合软件工程需要,实际上正在淘汰,但与此同时,它的特征被过程式编程吸收为了Literal,中文翻译字面量。

什么是 Literal,在 JS 里有

  • 数字 123,123.123, 0x123, 0b0101 在 Java 里可以有 0b0101_0101 的变化
  • 字符串 "abdd" "a'b'cd" , 多行文本 """abcd""", 以及模板字符串 abcd{1+2}
    • C# 里有 @"C:\Temp"
    • python 里则有 f"abcd{1}", r"C:\Temp"
  • 数组 [1,2,3]
  • 动态对象
  • 布尔值 true, false 及空值 null 等

react 的 JSX 也可以视为一种字面量,实际上各种js都试图引入一些特殊的字面量,例如 rhino 里就曾经把 XML 引入作为字面量。

即使C语言也有一些字面量,但是大部分语言里字面量都不被认真对待,许多语言里声明变量和初始化是两步操作,见惯了Java里繁琐的 HashMap 初始化的朋友对此应该不陌生。

我们看到字面量在不停的前进,JSX 和模板字符串表现出一个趋势,代表了字面量的发展方向,那就是混合即兴代码。和古老的年代不同,数据结构逐渐稳定下来,需要用到字面量的要素越来越清晰,无非就是字符串、对象、数组、键值对以及Tag。就结构来说即线性结构和树状结构。

d2js 给出了一种更高级的字符串字面量的形态

sql{.
selec  t name, age from person where true
  code{.
    if(cond){
      sql{. and cond .}
    }
  .}
.}

这种形态可以完全混合代码,与模板字符串相比,它进退的空间更大。如果将 sql 视为字符串————事实上 sql 确实是一个字符串变量————这里传递出一个更高级的观念:通过宿主语言可以控制字符串创建过程

谁也不应该轻视这种思维,我们可以做一些扩展,譬如在数组字面量引入宿主语言控制:

var arr = [0, {for(i in 1..100) .push(i)}, 101, 102]
var arr = [0, {for(i in 1..100) if(i %2) .push(i)}, 101, 102]

又如在对象字面量引入宿主语言控制

var obj = {
  "name" if(lang=="en") else "姓名" : "John",
  if(lang=="zh"){
     "属相": "猴"
  }
}

又如树形结构引入宿主语言

var html = Form {
    if(!validate()){
        Label[class="illegal-input"]{
            "输入不合法"
        }
    }
    Input,
    Submit
}

字面量提供了即兴编写结构的可能,让开发者的思路不至于因编程语言设计局限而不停切换,不但能提升开发效率的,也可以大幅提升程序可读性。

从语言特点来说,它以过程式为宗,以声明式语言为用,是编程语言未来发展的必然趋势。