Параметр блока обработки с типами слов красным / 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)]

person user310291    schedule 29.10.2017    source источник


Ответы (2)


Хорошо, вот слегка оптимизированная версия для Red и Rebol без funct или function.

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>"
person sqlab    schedule 30.10.2017

Ваша проблема заключается в использовании глобального html: copy "" везде и новой инициализации уже выпущенного html. Если вы сделаете его локальным с помощью /local html в блоках спецификаций либо вручную, либо заменив func на funct в Rebol2 или function< /strong> в красном, должно работать

>>f [ [h test] [h test2]]
test
test2
== "<p><h1>test</h1><h1>test2</h1></p>"
>> 
person sqlab    schedule 29.10.2017
comment
Я обновил код, чтобы сделать html локальным, см. выше, но красным цветом я получил ошибку сценария: html не находится в указанном контексте. - person user310291; 29.10.2017
comment
Он работает красным цветом, если вы используете функцию. Вы должны определить html, emit и т.д. в том же контексте - person sqlab; 29.10.2017