Расширение Build-разметки с повторным уточнением - PullRequest
0 голосов
/ 24 июля 2010

Я попытался добавить повторное уточнение в функцию разметки сборки, используя предыдущий ответ: Как связать с контекстом foreach?

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

  either not repeat [
      content: either string? content [copy content] [read content] 
      out: make string! 126 
      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)
          ]
      ]
    ][        
        probe :block-fields
        foreach :block-fields block-values [
          print get pick :block-fields 1
          print get pick :block-fields 2
        ]
    ] 
    out
]

c: [a b]
template: "<%a%> <%b%>"
build-markup/repeat template :c [1 2 3 4]

Вывод не то, что я хочу:1006 *

>> c: [a b]
== [a b]
>> template: "<%a%> <%b%>"
== "<%a%> <%b%>"
>> build-markup/repeat template :c [1 2 3 4]
[a b]
1
1 a b
1
1 a b

тогда как я ожидал

1
2
3
4

Так как мне исправить?

Ответы [ 2 ]

1 голос
/ 25 июля 2010

Для:

words: [num]
vals: [1 2 3]

Когда вы используете foreach :words, вы создаете новый контекст, к которому будет привязан повторяющийся блок.Содержимое word! в :words фактически не связано с этим новым контекстом.Значения, которые вы получаете, предполагают, что 'a глобально установлено на 1, а 'b установлено на [a b].Чтобы проиллюстрировать:

>> num: 9                 
== 9
>> words: [num]           
== [num]
>> foreach :words vals [
[    probe get 'num         
[    probe get first :words 
[    ]                      
1
9
2
9
3
9
== 9

Чтобы обойти это, попробуйте представить, что для каждой итерации цикла выполняемый блок 'bind привязан к контексту цикла.Вы можете выгрузить привязку следующим образом:

foreach :words vals probe compose/only [
    probe get first (words)
]

(зонд оставлен для иллюстративных целей)

0 голосов
/ 25 июля 2010

, кажется, работает:

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: compose/only [
            set in system/words (to-lit-word pick (block-fields) 1) get pick (block-fields) 1
            set in system/words (to-lit-word pick (block-fields) 2) get pick (block-fields) 2
            probe get in system/words (to-lit-word pick (block-fields) 1)
            probe get in system/words (to-lit-word pick (block-fields) 2)
            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

выход:

== {<table>
  <tr>
    <td>1</td><td>2</td>
    <td>3</td><td>4</td>

  </tr>
  <tr>
    <td>1</td><td>2</td>
    <td>3</td><td>4</...
>

>

...