2010-05-05 6 views
0

Actuellement, je cet extrait de code:Comment lier au contexte 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 


] 

Il ne suffit pas générique, je voudrais passer cette place

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

en tant que paramètre et écrire quelque chose comme ceci:

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 


] 

Mais je ne sais pas comment lier dans ce cas trop dur pour moi :(

Répondre

1

(Pour l'instant, ignorer la question de savoir si ce que vous faites ici est une bonne idée. : P)

Rappelez-vous que lorsque vous passez un block! à foreach, il va se lier les mots à l'intérieur de ce bloc pendant la boucle:

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

Lorsque vous passez un word! de toute sorte, il sera écrasé complètement et aucune variable seront assignées (indépendamment du fait que ce mot a été lié précédemment à un bloc!):

>> 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 

pour obtenir l'effet vous semblez désirer ici, vous avez besoin afin ressemblant à:

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

Le comportement serait alors ce que vous attendez, avec les mots liés dans le contexte local.

+0

Un grand merci, vous êtes vraiment Génie d'un cerveau pauvre essayant simplement de faire avancer les choses :) Si vous ne voulez pas ignorer ce que je suis en train de faire, c'est juste lié à http://stackoverflow.com/ questions/2768563/i-besoin-de-générer-50-millions-lignes-csv-fichier-avec-random-data-comment-optimiser-th Je veux permettre aux utilisateurs de spécifier n'importe quel nombre de champs pour leur spécifications afin qu'ils n'aient pas à modifier la fonction de sauvegarde à chaque fois. S'il y a un moyen plus élégant, je serais ravi de l'apprendre bien sûr: D –

+0

Dans l'autre question, vous m'avez demandé de ne pas comprendre la valeur que vous obtenez en faisant passer un bloc à foreach in ce style idiomatique. Il suffit de passer un mot ordinaire - il attribuera la valeur de l'enregistrement avec autant de champs ... alors avoir une boucle interne pour passer par là. – HostileFork

+0

Voir ceci http://stackoverflow.com/questions/3326484/extending-build-markup-with-repeat-refinement –

Questions connexes