2010-05-05 70 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