我尝试了
let stringArr = newvec(12);
,然后尝试像这样初始化数组中的每个点:let stringArr!i = newvec(5);
,但这会返回一个错误,告诉我不能这样做。这里有人可以帮助我学习这门恐龙语言吗?
let
关键字仅用于创建new局部变量(也可以是函数,也可能是其他东西,但这与您的问题并不真正相关)。所以,声明:
let stringArr = newvec(12)
在创建新变量时有效
stringArr
,或更准确地说:
stringArr
变量保存该向量的 address。但是:
let stringArr!i = newvec(5)
not 有效,因为
stringArr!i
实际上不是 new 变量。它只是已经存在的 i
向量中单元格号 stringArr
的内存内容。
换句话说,声明:
let stringArr = newvec(12)
创建初始指针单元格和第二层指针,后者还不会指向任何有用的地方:
+-----------+ +-------------+
| stringArr | -> | stringArr!0 | -> ?
+-----------+ +-------------+
| stringArr!1 | -> ?
+-------------+
: : :
+-------------+
| stringArr!N | -> ?
+-------------+
而且,由于那些第二层指针已经存在,你不应该使用
let
来设置它们(a)。实现您想要实现的目标的正确方法是:
let stringArr = newvec(12) // Create new vector AND variable,
// set variable to point at vector.
stringArr!i := newvec(5) // Create new vector, set existing
cell to point at it.
(a) 这与 C 语言类似,你不会写:
int xyzzy[10]; // Make ten-element array.
int xyzzy[0] = 42; // Set first element of array.
在这种情况下,第二行不应定义 new 变量,而其目的只是将 existing 元素之一设置为给定值。它应该是:
int xyzzy[10]; // Make ten-element array.
xyzzy[0] = 42; // Set first element of array.
解决方案是合理的,但我的两个版本的 BCPL(Martin Richard 的和 Robert Nordier 的 obcpl)都抱怨 newvec() 并且在第二行中还需要 := 而不是 = 。我让它工作:
let stringArr = getvec(12)
stringArr!i := getvec(12)
约翰·布特兰