3

我尝试let stringArr = newvec(12);然后尝试像这样初始化数组中的每个点:let stringArr!i = newvec(5);但这会返回一个错误,告诉我我不能这样做。这里有没有人可以帮助我学习这种恐龙语言?

4

2 回答 2

3

您稍微延长了我的记忆力(大约三个十年),但我似乎记得它let仅用于创建新的局部变量(还有函数和可能的其他东西,但这与您的问题并不真正相关)。

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

但是,无效,因为它let stringArr!i = newvec(5)实际上不是一个新变量。它只是已经存在的向量中单元格编号的内存内容。stringArr!iistringArr

换句话说,该语句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.
于 2015-08-17T08:41:14.323 回答
0

解决方案是合理的,但是我的两个版本的 BCPL(Martin Richard 和 Robert Nordier 的 obcpl)都抱怨 newvec() 并且在第二行还需要 := 而不是 =。我得到了它的工作:

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

约翰·布特兰

于 2017-01-25T01:34:49.860 回答