2015-04-06 58 views
3

我試過let stringArr = newvec(12);,然後嘗試初始化數組中的每個點,如下所示:let stringArr!i = newvec(5);但是,返回一個錯誤,告訴我我不能這樣做。有沒有人可以幫助我用這種恐龍語言?如何初始化BCPL中的數組數組?

+1

哇,哪裏是BCPL仍在使用? – Barmar

+0

@Barmar Twitter。開個玩笑,一個特定的大學課程。 – countofmontecristo

+0

我在BCPL參考手冊中的任何地方都看不到'!'字符http://cm.bell-labs.com/cm/cs/who/dmr/bcpl.pdf – Barmar

回答

2

你伸展我的記憶一點(約三十年的程度),但我似乎記得,let只用於創建局部變量(也函數和其他可能的事情,但是這不是真的與你的問題相關)。

所以聲明:

let stringArr = newvec(12) 

是創造有效的新的變量stringArr,或者更確切地說,一個12芯匿名載體和stringArr變量保存的是矢量的地址

但是:

let stringArr!i = newvec(5) 

有效的,因爲stringArr!i實際上並不在其本身的新變量。它只是在已存在的stringArr向量中的單元號i的存儲內容。

換句話說,該語句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. 
0

該解決方案是合理的,但我的兩個BCPL(馬丁·理查德和Robert Nordier獨立的obcpl)版本的抱怨newvec(並且還需要:=而不是=在第二行。我得到了它的工作:

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

約翰Boutland

+0

感謝您的編輯,wogsland。我不知道(但仍然不知道)如何獲得這種格式的代碼。約翰 –