我尝试了let stringArr = newvec(12);,然后尝试以这样的方式初始化数组中的每个点:let stringArr!i = newvec(5);,但是返回一个错误,告诉我不能这样做。这里有谁能帮我学恐龙的语言吗?
发布于 2015-08-17 08:41:14
您将我的记忆扩展了一些(大约30年),但我似乎还记得,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.发布于 2017-01-25 01:34:49
解决方案是合理的,但我的两个版本的BCPL (Martin‘s和Robert的obcpl)都抱怨newvec(),并且要求:=而不是第二行中的=。我让它和:
let stringArr = getvec(12)
stringArr!i := getvec(12)约翰·布特兰
https://stackoverflow.com/questions/29480073
复制相似问题