2010-07-31 111 views
0

在此代碼段,fields-types到底由to-camel-case功能改性,相對於作爲一個局部變量來父功能被傳遞:爲什麼局部變量變量不受尊重?

fields-types: ["First Name" "string" "Last Name" "string" "Age" "int"] 

to-camel-case: function [name] [ 
    name/1: lowercase name/1 
    replace/all name space "" 
] 

fill-template-body: func [ 
    field-labels-types [block!] /local vars fields-names-types 
] [ 
    vars: [member-name member-type] 
    field-names-types: copy [] 
    foreach [field-label field-type] field-labels-types [ 
     append field-names-types to-camel-case field-label 
     append field-names-types field-type 
    ] 
] 

fill-template-body fields-types 

執行給出:

>> fill-template-body fields-types 
== ["firstName" "string" "lastName" "string" "age" "int"] 
>> fields-types 
== ["firstName" "string" "lastName" "string" "age" "int"] 
>> 

儘管我會希望該字段類型保持不變:

fields-types: ["First Name" "string" "Last Name" "string" "Age" "int"] 

當然,我可以嘗試通過修改to-camel-case使用名稱的副本,但這不是我認爲我應該做的事情。

有沒有像Scala中的varval關鍵字?

回答

1

變量在REBOL中是一個醜陋的詞,一切 - 甚至詞 - 都是價值。這不是一些語義新聞,它有助於理解REBOL流動的方式。

我認爲值被包含在內存中的一個巨型數組中,其中REBOL(語言)使用單詞及其上下文來引用值並與其交互。大多數REBOL功能操作,而無需複製這些值:

head lowercase next uppercase str: "abcd" 
remove back tail str 

這是REBOL的最有效的功能之一 - 你不需要副本中介的過程,需要這樣很浪費。想想那個數組越來越多,每次你使用replaceuppercaseto-camel-case的值都是重複的。 - 整個過程可以修改,而不是重複的前提下,建立確實是一個上下文可以,而不必返回一個值,內置:

remove-spaces: use [space mark][ 
    space: charset " ^-" 
    [any [mark: space (remove mark) | skip]] 
] 

parse/all str: "Should Be No Spaces" remove-spaces 

然後訣竅變成知道從哪裏抄的價值觀,我認爲恰好與REBOL的簡潔表達式的禮物相交:

parse/all link: copy title: "An Article on REBOL" remove-spaces 
print ["(" link ")" title] 

to-camel-case copy field-label 

當然,修改也有其侷限性。有時候它是從零開始建造的清潔的建築

+0

感謝會重讀了好幾遍。仍然有一種機制將是有用的給予選擇,可能類似val關鍵字http://reboltutorial.com/blog/scala-val-keyword/?將不得不考慮它。 – 2010-07-31 20:16:05

+0

在我看來,你想「保護值,不發一言這不會發生REBOL(?): FOO:條:‘foobar的’ 保護」富 大寫欄 探頭富 保護一個字只會阻止您將其分配給其他值。除非您使用副本,否則值本身仍然可以通過其他參考進行操作。 條:複製FOO:「foobar的」 保護「富 大寫欄 探頭富 – rgchris 2010-07-31 20:33:06

+0

廢話,換行不保留意見... – rgchris 2010-07-31 20:33:23

1

您的駱駝大小寫函數以原始值運行,因此如果您想保留原始值,則需要將其複製並返回更改後的值。由於你的函數作用於模板,它需要複製模板嗎?

所以,這樣的事情應該工作:

fill-template-body: func[ labels [block!] /local field-labels-types vars fields-names-types][ 
    field-labels-types: copy labels 
.. 
+0

是的,這就是我所做的,但我只是說,應該有一個自動機制,如在斯卡拉val關鍵字可能是爲了不必每次都考慮它。 – 2010-08-01 18:54:01