2014-11-21 62 views
4

#[數據類型]構造的目的構建的一些值:什麼我只是碰到這種語法雷博爾進來雷博爾

>> #[email! "[email protected]"] 
== [email protected] 

這似乎是等同於

>> to email! "[email protected]" 
== [email protected] 

>> #[string! "hello"] 
== "hello" 

雖然這些錯誤了:

>> #[integer! 1] 
** Syntax Error: Invalid construct -- #[ 
** Near: (line 1) #[integer! 1] 
>> #[decimal! 1] 
** Syntax Error: Invalid construct -- #[ 
** Near: (line 1) #[decimal! 1] 
>> #[string! 1] 
== [string! 1] 

我想知道這是爲了什麼?它帶來了什麼好處?

+0

對於那些可能會好奇的人,請參見[#Curecode issue#2188]中的#<...>提案(http://curecode.org/rebol3/ticket.rsp?id=2188) – HostileFork 2014-11-23 03:15:41

回答

4

該句法結構被稱爲"construction syntax"(也參見CureCode issue #1955)。其存在的理由是允許字面形式的價值,否則不能直接表示。

有兩種主要類需要構造語法。

  1. 值(構造語法除外)沒有單獨的詞法形式,但只能通過評估構造。
  2. 具有規則字面形式的值,但只要該值不再可以直接寫入,則特定值爲「特殊」的值。

(1)建築語法直接值表示

一個此類突出的例子是對象! Rebol對象通常使用代碼(如make object! [a: 42])創建。這不是結果對象值的直接字面表示,而是代碼(在DO方言中)創建預期對象值時的代碼。構造語法允許直接表示值:#[object! [a: 42]]

其他典型例子是#[none!]和有點不規則(構造語法明智)#[true]#[false](注意缺少!)。包圍頭腦的差別例如, #[none!]none將導致對Rebol語義的更深入的理解(因此留給讀者作爲練習)。

(2)施工語法爲「逃命」

針對這種情況的典型例子是顛倒的URL,比如你從reverse http://stackoverflow.com獲得的價值。如果結果值將被序列化爲一個普通的URL!,序列化形式將不再是語法有效:

>> /moc.wolfrevokcats//:ptth 
** Script error: // does not allow unset! for its value2 argument 

建設語法提供了一個escape機制來這樣的情況:

>> #[url! "/moc.wolfrevokcats//:ptth"] = reverse http://stackoverflow.com/ 
== true 

這個特殊的例子也指出了一個問題的情況:

>> reverse http://stackoverflow.com/ 
== /moc.wolfrevokcats//:ptth 

可以說,這個輸出(由mold native生成)是錯誤的:顯示的結果不是相關的有效詞彙表示找到價值。

有一些錯誤跟蹤此類問題的特定實例(例如URL爲CureCode issue #2010!)。在表格中尋求更一般的解決方案的一個建議是在MOLD的某種變體中建立往返檢查:只要加載非構造語法MOLD的結果導致與原始值不同的值,則此MOLD變體將回退到序列化到構造語法。