您稍微延长了我的记忆力(大约三个十年),但我似乎记得 let 仅用于创建 new 局部变量(也包括函数和可能的其他事情,但这与您的问题并不真正相关)。
因此,let stringArr = newvec(12) 语句在创建新变量 stringArr 或更准确地说是一个 12 单元匿名向量和保存该向量的 地址 的变量 stringArr 时是有效的。
但是,let stringArr!i = newvec(5)无效有效,因为stringArr!i 实际上并不是一个新变量。就是已经存在的stringArr向量中单元格号i的内存内容。
换句话说,let stringArr = newvec(12) 语句创建了初始指针单元和第二层指针,它们不会指向任何有用的地方:
+-----------+
| stringArr | ---+
+-----------+ | +-------------+
+--> | stringArr!0 | --> ?
+-------------+
| stringArr!1 | --> ?
+-------------+
: : :
+-------------+
| stringArr!N | --> ?
+-------------+
而且,由于指针已经存在,您不应该使用let 来设置它们。
这与 C 中的相似之处在于您不会编写:
int xyzzy[10]; // Make array of ten elements.
int xyzzy[0] = 42; // Set first element to something.
因为第二行不应该定义一个 new 变量,它的目的只是将 existing 元素之一设置为给定值,完成xyzzy[0] = 42。
因此,正确在 BCPL 中尝试实现的方法是避免在第二类语句中使用 let 关键字:
let stringArr = newvec(12) // Create new vector AND new variable,
// put vector address into cell for
// that variable.
stringArr!i := newvec(5) // Create new vector, put vector
// address into EXISTING cell.