2010-07-31 71 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