开发者

How to dynamically use compose/only?

I tried to generate the actions block dynamically in the code below (from static version here Extending Build-markup with repeat refinement) but It doesn't work why ?

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: {开发者_Python百科<table>
<%build-markup/repeat template2 [a b] [1 2 3 4 5 6]%>
</table>}
build-markup template3

Output error:

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


It looks like a binding problem.

I changed this line:

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

to

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

e holds the error,

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜