我试过let stringArr = newvec(12);
,然后尝试像这样初始化数组中的每个位置:let stringArr!i = newvec(5);
但是返回错误告诉我不能这样做。是否有人在场可以帮我解决这个恐龙语言的问题?
我试过let stringArr = newvec(12);
,然后尝试像这样初始化数组中的每个位置:let stringArr!i = newvec(5);
但是返回错误告诉我不能这样做。是否有人在场可以帮我解决这个恐龙语言的问题?
let
仅用于创建新的局部变量(也包括函数和可能的其他内容,但这与你的问题无关)。let stringArr = newvec(12)
在创建新变量stringArr
或更精确地说是一个12个单元的匿名向量以及stringArr
变量保存该向量的地址方面是有效的。let stringArr!i = newvec(5)
是无效的,因为stringArr!i
实际上不是一个新变量。它只是已经存在的stringArr
向量中单元格号码的内存内容。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.
由于第二行不应该定义一个新变量,而是意图仅仅将现有元素中的一个设置为给定值,使用 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.
这个解决方案很好,但是我的两个版本的BCPL(Martin Richard和Robert Nordier的obcpl)都会抱怨newvec(),并且在第二行需要使用:=而不是=。我用以下代码使其正常工作:
let stringArr = getvec(12)
stringArr!i := getvec(12)
约翰·博特兰