2010-07-26 3 views
0

Я попытался сгенерировать блок действий динамически в коде ниже (от статической версии здесь Extending Build-markup with repeat refinement), но это не работает почему?Как динамически использовать compose/only?

build-markup: func [ 
    {Return markup text replacing <%tags%> with their evaluated results.} 
    content [string! file! url!] 
    /repeat block-fields block-values 
    /quiet "Do not show errors in the output." 
    /local out eval value 
][ 

    out: make string! 126 

    either not repeat [ 
     content: either string? content [copy content] [read content] 

     eval: func [val /local tmp] [ 
      either error? set/any 'tmp try [do val] [ 
       if not quiet [ 
        tmp: disarm :tmp 
        append out reform ["***ERROR" tmp/id "in:" val] 
       ] 
      ] [ 
       if not unset? get/any 'tmp [append out :tmp] 
      ] 
     ] 
     parse/all content [ 
      any [ 
       end break 
       | "<%" [copy value to "%>" 2 skip | copy value to end] (eval value) 
       | copy value [to "<%" | to end] (append out value) 
      ] 
     ] 
    ][   

     actions: copy [] 

     n: length? block-fields 
     repeat i n [ 
      append actions compose/only [ 
      set in system/words (to-lit-word pick (block-fields) (i)) get pick (block-fields) (i) 
      ] 
     ] 
     append actions compose/only [ 
      append out build-markup content 
     ] 
     foreach :block-fields block-values actions   
    ] 
    out 
] 

template1: { <td><%a%></td><td><%b%></td> 
} 
template2: { <tr> 
<%build-markup/repeat template1 [a b] [1 2 3 4]%> 
    </tr> 
} 
template3: {<table> 
<%build-markup/repeat template2 [a b] [1 2 3 4 5 6]%> 
</table>} 
build-markup template3 

Ошибка Выход:

>> build-markup template3 
== {<table> 
***ERROR no-value in: build-markup/repeat template2 [a b] [1 2 3 4 5 6] 
</table>} 
>> 

ответ

1

Похоже, связывающей проблемы.

Я изменил эту строку:

either error? set/any 'tmp try [do val] [ 

к

either error? set/any 'tmp e: try [do val] [ 

е содержит ошибку,

>> e 
** Script Error: i has no value 
** Where: build-markup 
** Near: i n [ 
+0

О мой, если это связывание я потерял :) Теперь то, что я должен делать ? –

+0

Не знаю, извините, у меня не так много времени. Но просто понял, что у вас есть/повторить уточнение, и вы также используете функцию повтора. Это может привести к возникновению проблемы. – endo64

+0

Вы правы :) Кстати, я действительно думаю, что уточнение синтаксиса плохое: уточнение должно быть каким-то образом напечатано. –

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