2010-05-05 34 views
0

目前我有这个代码片段:如何绑定到foreach上下文?

Blocks: ["F4369RO771" "282273" "5" "146" "126" "6-Nov-2009" "8-Jan-2010" "7-Jun-2010" "8" 
"M9881KI923" "399727" "2" "359" "443" "5-Aug-2010" "23-Feb-2010" "6-Nov-2009" "4" 
] 

save-blocks: func[file /local f out][ 
    foreach [field1 field2 field3 field4 field5 field6 field7 field8 field9] blocks [ 

out: copy "" 
repeat n 9 [ 
    part: get bind to-word rejoin ["field" n] 'field1 
    out: rejoin [out part ";"] 
] 
     remove back tail out 
     write/lines/append f out 


] 

这不是一般的不够,我想通过这个来代替

block: [field1 field2 field3 field4 field5 field6 field7 field8 field9] 

为参数,写这样的事:

save-blocks: func[block file /local f out][ 
    foreach block blocks [ 

out: copy "" 
repeat n length? block [ 
    part: get bind to-word rejoin ["field" n] 'field1 
    out: rejoin [out part ";"] 
] 
     remove back tail out 
     write/lines/append f out 


] 

但我不知道如何绑定在这种情况下对我来说太难了:(

回答

1

(目前,无视你在这里做什么是一个好主意的问题。 :P)

请记住,当你传递一个block!foreach,它会在循环过程绑定该块里面的话:

>> foreach [foo bar] ["a" "b"] [print foo print bar] 
a 
b 

当您通过任何形式的word!,它将被覆盖完全没有变量将被分配(不管这个词是否被绑定到先前的块!):

>> foobarblock: [foo bar] 

>> foreach foobarblock ["a" "b"] [print foo print bar] 
** Script error: foo has no value 
** Where: foreach 
** Near: foreach foobarblock ["a" "b"] [print foo print bar] 

>> foreach foobarblock ["a" "b"] [print foobarblock] 
a 
b 

要得到的效果,你似乎是希望在这里,你需要这样mething这样的:那么

>> foreach :foobarblock ["a" "b"] [print foo print bar] 
a 
b 

行为将是你所期望的,在本地环境约束的话。

+0

非常感谢你真的IT从一个可怜的大脑试图完成事情完成:)真棒! 如果你不会忽视我想要做什么,它只是与http://stackoverflow.com/有关问题/ 2768563/i-need-to-generate -50-million-rows-csv-file-with-random-data-how-to-optimize -th 我想允许用户为他们指定任意数量的字段规格,以便他们不必每次修改保存功能。 如果有一些更优雅的方式,我当然很高兴地了解它:D – 2010-05-06 20:04:02

+0

在另一个问题中,你问我不清楚你试图做到这一点,通过一个块传递给foreach这种惯用的风格。只需传递一个普通的词 - 它将分配无论多个字段的记录的值...然后有一个内部循环来通过它。 – HostileFork 2010-05-17 07:32:29

+0

看到这个 http://stackoverflow.com/questions/3326484/extending-build-markup-with-repeat-refinement – 2010-07-24 19:14:46