2010-06-18 18 views
1

當我啓動了一個R3阿爾法99屆,並進入這個作爲第一個命令,我得到一個錯誤:爲什麼我不能像EMAIL那樣綁定東西!在口譯員啓動的全球背景下?

>> is-email-addr: get bind to-word "email?" bind? 'system 
** Script error: email? is not in the specified context 
** Where: bind 
** Near: bind to-word "email?" bind? 'system 

但是,如果我退出,重啓,而是執行一個測試,以證明email?原始生活在像system對象全球範圍內,測試本身讓我的別名工作:

>> equal? bind? 'system bind? 'email? 
== true 

>> is-email-addr: get bind to-word "email?" bind? 'system 
>> is-email-addr [email protected] 
== true 

這是怎麼回事,在這裏?

回答

5

綁定不會將詞語添加到上下文中,除非您告訴它 - 您必須使用bind/new

>> get bind/new to-word "email?" bind? 'system 

但是您的問題顯示了一些關於R3綁定模型的誤解。 R3中沒有單個全局上下文,不像R2。在您的示例中,字'system被綁定到任務本地共享腳本上下文,也就是用戶上下文。在用戶上下文中獲取正確的單詞值通常意味着將它們從系統上下文或導入的已加載模塊中導入,這個過程稱爲實習這個詞。

做你顯然想在這裏做,這將是最適合你使用intern,像這樣:

>> get first intern to-block "email?" 

to-block被使用,因爲intern一般用來對整個代碼塊進行操作。我將在下一個版本中修復它,以便它可以直接處理單詞;那麼你將能夠做到這一點:

>> get intern to-word "email?" 

我希望這可以幫助。

爲什麼你不直接使用這個詞?以後使用字符串並轉換爲單詞有很多開銷,這通常是不必要的。

+0

在一個新鮮的解釋,*獲得綁定/新詞「的電子郵件?」綁定? '系統*也不起作用。事實上,運行該命令會導致您的實習例子隨後失敗。但是,如果解釋器在綁定後重新啓動,那麼INTERN示例就像LOAD一樣工作。 Whyzzat? – HostileFork 2010-06-22 06:38:16

+0

正如AltME所提到的,不直接使用單詞的原因是試圖編寫一個簡單的重映射器,它需要*「em」*和*'email!*並且縮寫爲* em * *作爲* email的別名*和* em!*用於* email!*。這需要利用單詞之間的字符串關係。 – HostileFork 2010-06-22 06:40:18

+0

「Whyzzat?」因爲當你運行這個命令時,你添加了單詞'email?到用戶上下文,沒有給它賦值,也不要從系統或導出上下文遷移值。以後運行INTERN(LOAD調用INTERN)時,它會在用戶上下文中看到現有單詞,並且不會覆蓋它,因爲它是用戶單詞。默認情況下,用戶上下文不會填充系統內容和導出上下文 - 它會根據需要填充。如果你想要系統值,從一開始就使用INTERN真的會更好。 – BrianH 2010-06-23 19:53:41

1

如果你真的堅持使用「電子郵件?」字符串,而不是'電子郵件?一句話,然後你從中獲得一個詞,而沒有觀測到任何strangenesses將使用LOAD功能如下最簡單的方法:

is-email-addr: get bind load "email?" bind? 'system 
相關問題