跳轉到內容

Rebol 程式設計/mold

來自華夏公益教科書,開放的書籍,為一個開放的世界
MOLD value /only /all /flat 

將值轉換為可讀的 Rebol 字串。

MOLD 是一個原生值。

將值轉換為什麼?

[編輯 | 編輯原始碼]

文字“將值轉換為可讀的 Rebol 字串。”是函式的幫助字串。當 Rebol 是語言時,“可讀的 Rebol”是什麼意思?這並不難解決,可讀的 Rebol 意味著“可被 Rebol 直譯器讀取”。為了進一步解釋,這意味著字串應該被識別為有效的 Load 方言,即在被 LOAD 函式處理時被接受為有效。

“舊”語法

[編輯 | 編輯原始碼]

最初,Rebol 語法無法直接描述某些值。例如,

make object! [field: 1]

是一個 Rebol 表示式,可以載入併產生

load "make object! [field: 1]" ; == [make object! [field: 1]]

,它是一個包含三個值的塊:兩個字和一個(子)塊。當由 DO 函式評估時,表示式產生一個物件。評估基於 Do 方言的語義屬性,評估 MAKE 函式(Rebol 中最常用的建構函式之一),為它提供兩個引數:要構造的值的型別(本例中為 OBJECT!)和規範塊。

根據我們解釋它的方式,上面的原始碼可以描述某些塊(當解釋為 Load 方言時),也可以描述一個物件(當解釋為 Do 方言時)。有人可能會認為,這種歧義很容易透過始終使用 Do 方言來解釋原始碼來解決,但是,只有稍微更復雜的例子會再次咬我們

string1: mold [make object! [field: 1]] ; == "[make object! [field: 1]]"
string2: mold reduce [make object! [field: 1]] ; == "[make object! [^/        field: 1^/    ]]"

上面的 STRING1 是對包含三個值的塊進行模塑的結果,而 STRING2 是對包含一個元素的塊進行模塑的結果:一個物件。無論 STRING1 或 STRING2 是僅由 LOAD 解釋還是由 DO 評估,結果始終是一個包含三個元素的塊:兩個字和一個子塊,即沒有一種方法產生一個包含物件的塊。

“新”語法

[編輯 | 編輯原始碼]

為了克服用 Rebol 語法描述物件的困難,引入了一種新的語法結構。它看起來像這樣

#[object! [field: 1]]

正如人們很容易發現的那樣,它以“語法方式”描述了物件,即 LOAD 函式在處理它時產生一個物件

type? load "#[object! [field: 1]]" ; == object!

“新”語法用法和名稱

[編輯 | 編輯原始碼]

在引入新語法後,MOLD 函式的行為沒有改變(為了保持向後相容性,我想),而新語法僅在 MOLD/ALL 帶來優勢時使用,即在上面這樣的情況下。

一些使用者建議將“序列化語法”名稱用於“新”語法型別。不幸的是,“序列化語法”的概念(借用西布里勳爵的話,我愛英國幽默!)只是“語法”概念的“冗餘和累贅”的等價物(“語法”和“系列”實際上是相同的概念,一個來自希臘語,另一個來自拉丁語,就像“冗餘”和“累贅”這兩個詞一樣)。因此,將它們組合在一起並認為它具有某種特殊意義的做法是相當不合適的。

幸運的是,當觀察 make object! [field: 1]#[object! [field: 1]] 之間的相似之處時,我們可以得出結論,後者只是描述了前者中存在的建構函式引數列表。唯一缺少的部分是建構函式。這就是為什麼術語“建構函式”也不合適。Hostile Fork 注意到這種相似性,將“新”語法稱為“構造語法”,這看起來很合適,而且它可以用作一個詞“構造”,或者作為縮寫形式的兩個詞“構造規範”或“構造格式”等等。

  • value -- 要模塑的值(型別:任何型別)
  • /only -- 對於塊值,僅給出內容,沒有外部 [ ]。
  • /all -- 以序列化格式模塑
  • /flat -- 不縮排

原始碼

[編輯 | 編輯原始碼]
mold: native[
    "Converts a value to a REBOL-readable string." 
    value "The value to mold" 
    /only {For a block value, give only contents, no outer [ ].} 
    /all "Mold in serialized format" 
    /flat "No indentation"
]
華夏公益教科書