如何在 BCPL 中初始化数组数组?

How do I initialize an array of arrays in BCPL?

我尝试了 let stringArr = newvec(12); 然后尝试初始化数组中的每个点:let stringArr!i = newvec(5); 但是 returns 一个错误告诉我我不能这样做。这里有人可以帮助我学习这种恐龙语言吗?

你有点牵强了我的记忆(大约三十年的程度),但我似乎记得 let 仅用于创建 new local变量(还有函数和其他可能的东西,但这与你的问题并不相关)。

因此语句 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 第二个 class 关键字陈述:

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.

解决方案很合理,但我的两个 BCPL 版本(Martin Richard 和 Robert Nordier 的 obcpl)都抱怨 newvec() 并且在第二行中还需要 := 而不是 =。我得到它的工作:

let stringArr = getvec(12)
stringArr!i := getvec(12)

约翰·布特兰