該句法結構被稱爲"construction syntax"(也參見CureCode issue #1955)。其存在的理由是允許字面形式的價值,否則不能直接表示。
有兩種主要類需要構造語法。
- 值(構造語法除外)沒有單獨的詞法形式,但只能通過評估構造。
- 具有規則字面形式的值,但只要該值不再可以直接寫入,則特定值爲「特殊」的值。
(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變體將回退到序列化到構造語法。
對於那些可能會好奇的人,請參見[#Curecode issue#2188]中的#<...>提案(http://curecode.org/rebol3/ticket.rsp?id=2188) – HostileFork 2014-11-23 03:15:41