Скажем, я хочу сгенерировать этот вывод:
public String toString() {
return this.getFirstName() + "," + this.getLastName() + "," + this.getAge();
}
из шаблона ниже и настраиваемой рекурсивной функции разметки сборки:
template-toString: {this.get<%property%>() <%either not context.build-markup/EOB [{+ "," +}][""]%> }
build-markup/vars template-toString [property] ["FirstName" "LastName" "Age"]
Моя проблема состоит в том, чтобы избежать объединения последнего элемента с {+ "," +}
Моя идея состояла в том, чтобы использовать разметку context.build со свойством EOB (End Of Block), которому будет присвоено значение true при обработке последнего элемента. Тогда я мог бы использовать в шаблоне-toString выше либо не context.build-markup / EOB [{+ "," +}] [""], чтобы объединить или нет с {+ "," +}:
context.build-markup: context [
EOB: false
set 'build-markup func [
{Return markup text replacing <%tags%> with their evaluated results.}
content [string! file! url!]
/vars block-fields block-values
/quiet "Do not show errors in the output."
/local out eval value n max i
][
out: make string! 126
either not vars [
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)
]
]
][
n: length? block-fields
self/EOB: false
actions: copy []
repeat i n [
append actions compose/only [
;set in self 'EOB (i = n)
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
if any [(back tail out) = "^/" (back tail out) = " " (back tail out) = "," (back tail out) = ";" (back tail out) = "/" (back tail out) = "\"] [
remove back tail out
]
]
out
]
]
Но моя попытка не удалась (так я прокомментировал; установил self 'EOB (i = n), потому что он не работает). Как исправить код, чтобы получить то, что я хочу?