2010-09-07 4 views
1

Как я могу ссылаться на дату как аргумент в f в цикле foreach, если дата также используется в качестве блока var? Должен ли я переименовать свою дату var?Как я могу ссылаться на переменную в аргументе func, когда она используется в foreach

f: func[data [block!] date [date!]][ 
    foreach [date o h l c v] data [ 

    ] 
] 

ответ

4

A: простой, составьте ваш лучший друг.

f: func[data [block!] date [date!]][ 
    foreach [date str] data compose [ 
     print (date) 
     print date 
    ] 
] 

>> f [2010-09-01 "first of sept" 2010-10-01 "first of october"] now 

7-Sep-2010/21:19:05-4:00 
1-Sep-2010 
7-Sep-2010/21:19:05-4:00 
1-Oct-2010 
+0

очевидно, что все парнеры заменены, поэтому в некоторых ситуациях это либо невозможно, либо громоздко, но в подавляющем большинстве случаев оно работает. – moliad

+0

А, это умный ответ! – HostileFork

2

Необходимо изменить имя параметра с даты или присвоить его локальной переменной.

2

Вы можете получить доступ к дате аргумента внутри цикла Еогеаспа связывания «дата слова из описания функции к аргументу данных:

>> f: func[data [block!] date [date!]][ 
[ foreach [date o h l c v] data [  
[  print last reduce bind find first :f 'date 'data 
[  print date 
[  ] 
[ ] 

>> f [1-1-10 1 2 3 4 5 2-1-10 1 2 3 4 5] 8-9-10 
8-Sep-2010 
1-Jan-2010 
8-Sep-2010 
2-Jan-2010 

Это делает код очень трудно читать, хотя. Я думаю, было бы лучше назначить аргумент даты локальной переменной внутри функции, как предложил Грэм.

>> f: func [data [block!] date [date!] /local the-date ][ 
[ the-date: :date          
[ foreach [date o h l c v] data [      
[  print the-date           
[  print date            
[  ] 
[ ] 
>> f [1-1-10 1 2 3 4 5 2-1-10 1 2 3 4 5] 8-9-10   
8-Sep-2010 
1-Jan-2010 
8-Sep-2010 
2-Jan-2010 
+0

Методика привязки дополнительного аргумента к блоку будет сложнее применять, если цикл foreach повторяется по элементам блока по одному за раз. Вероятно, для даты будет дополнительная итерация. –

 Смежные вопросы

  • Нет связанных вопросов^_^