我尝试let stringArr = newvec(12);
然后尝试像这样初始化数组中的每个点:let stringArr!i = newvec(5);
但这会返回一个错误,告诉我我不能这样做。这里有没有人可以帮助我学习这种恐龙语言?
2 回答
您稍微延长了我的记忆力(大约三个十年),但我似乎记得它let
仅用于创建新的局部变量(还有函数和可能的其他东西,但这与您的问题并不真正相关)。
因此,该语句let stringArr = newvec(12)
在创建新变量stringArr
或更准确地说是一个 12 单元匿名向量和stringArr
保存该向量地址的变量时是有效的。
但是,无效,因为它let stringArr!i = newvec(5)
实际上不是一个新变量。它只是已经存在的向量中单元格编号的内存内容。stringArr!i
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)
约翰·布特兰