处理带有红色/rebol 字类型的块参数

Processing block parameter with word types in red / rebol

调用时:

f [(h test) (h test2)]

我想得到:

"<p><h1>test</h1><h1>test2</h1></p>"

相反,我得到:

"<h1>test2</h1></p>"

我不明白为什么我的下面的代码不起作用。请注意,我想在下面使用 g 函数,因为我有几个类似 h 的函数,每个函数都会调用 g 来分解它们。所以不要摆脱 g,它是故意的。

html: copy ""
emit: func [code] [repend html code] 

f: func [param [block!]] [
    html: copy ""
    emit: func [code] [repend html code]  
    emit <p>
    foreach p param [
        emit p
    ]
    emit </p>
    return html
]

g: func ['arg [string! word!] /local html] [  
    return h :arg
]

h: func ['arg [string! word!]] [
    either word? arg [
        text: to-string arg
    ][
        text: arg
    ]

    html: copy ""
    emit: func [code] [repend html code]  

    print text
    emit <h1>
    emit text
    emit </h1>
    return html
]

f [(h test) (h test2)]

更新:

现在我收到红色错误: 脚本错误:html 不在指定的上下文中

  f: func[param [block!] /local html][
      html: copy ""
      emit: func [code] [repend html code]  
      emit <p>
      foreach p param [
          emit p
      ]
      emit </p>
      return html
  ]

  g: func['arg [string! word!] /local html][  
    return h :arg
  ]


  h: func['arg [string! word!] /local html][

      either word? arg [text: to-string arg][
        text: arg
      ]


      html: copy ""
      emit: func [code] [repend html code]  

      print text
      emit <h1>
      emit text
      emit </h1>

      return html

  ]

  f [(h test) (h test2)]

你的问题是到处使用全局 html: copy "" 和新初始化已经发出的 html。如果您手动或通过将 func 替换为 funct Rebol2 中的 或 Red 中的 function,它应该可以工作

>>f [ [h test] [h test2]]
test
test2
== "<p><h1>test</h1><h1>test2</h1></p>"
>> 

好的,这里是针对 Red 和 Rebol 的稍微优化的版本,没有 functfunction

emit: func [code html] [repend html code]  

f: func[param [block!] /local html][
    html: copy ""
    emit <p> html
    foreach p param [
        emit p html
    ]
    emit </p> html
    return html
]

g: func['arg [string! word!] l][  
    return h :arg
]


h: func['arg [string! word!] /local html text][
    either word? arg [text: to-string arg][
       text: arg
    ]
    html: copy ""
    print text
    emit <h1> html
    emit text html
    emit </h1> html
    return html
]

>>f [ [h test]   [h test2]]
test
test2
== "<p><h1>test</h1><h1>test2</h1></p>"