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

Arrays 如何在BCPL中初始化数组数组?,arrays,initialization,bcpl,Arrays,Initialization,Bcpl,我尝试了让stringArr=newvec(12)

我尝试了
让stringArr=newvec(12)let stringArr!i=newvec(5)但这会返回一个错误,告诉我我不能这样做。这里有人能帮我学这种恐龙语言吗

你把我的记忆扩展了一点(大约三十年),但我似乎记得
let
只用于创建新的局部变量(也包括函数和其他东西,但这与你的问题并不相关)

因此,语句
let stringArr=newvec(12)
在创建新变量
stringArr
或更准确地说,一个12单元匿名向量和保存该向量地址的
stringArr
变量时有效

然而,
让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.
由于第二行不应该定义新变量,因此它的目的只是将现有元素中的一个设置为给定值,使用
xyzy[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.

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

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

约翰·布特兰(John Boutland)

哇,BCPL还在哪里使用?@Barmar推特。只是开玩笑,一门特定的大学课程。我看不到
字符在BCPL参考手册的任何地方啊,它看起来像是在1979年版本的BCPL中,而不是1967年版本。感谢您的编辑,wogsland。我不知道(现在仍然不知道)如何获得这种格式的代码。JohnJohn,我想你可能已经在3.5年内找到了答案:-)但是,为了以防万一,你必须确保代码前有一个空行,并且每行代码都以四个空格开头。可以标记文本块,然后使用CTRL-K对其进行代码缩进。另外,还有一个三回溯法,但我从来没有使用过,所以不能建议。