too many C levels (limit is 200) in function

Iniciado por rafael, Janeiro 21, 2018, 08:39:26 AM

tópico anterior - próximo tópico

rafael

Recentemente tive essa surpresa aqui:

too many C levels (limit is 200) in function

Olha eu pesquisei no lua o mesmo erro mas não achei a solução

isso aconteceu em um laço "para i,v em pares()" onde concatenava "i" mais de 200 vezes


adalberto

Poderia dar mais detalhe do seu código? Geralmente esse erro acontece com chamada recursiva de função.

rafael

vou postar o trecho em que acontece o erro:

Neste trecho em cada rodada "i" é concatenado menos de 200 vezes,
mas se eu aumentar uma função do javascript ou colocar v concatenado junto com i
então vai ultrapassar os 200 limit, então o erro acontece.



para i,v em pares(TabelaBoleto) inicio


imprima([[




<div class="col s12 m3" >
  <div class="card gradient-shadow ]]..CorDoCartao..[[ border-radius-3" style=" overflow: visible;">
<a id="AncoraNotaDoBoleto]]..i..[["><i class="material-icons tooltipped white-text" data-tooltip="Notas" >speaker_notes ]]..QuantNotas..[[</i></a>
<i class="material-icons tooltipped white-text" data-tooltip="Impresso" >print <small class="notification-badge flat" >]]..v.Impresso..[[</small></i>
<div class="card-content center " style=" overflow: visible;">

                          <img src="fotos/boleto.png" class="width-40 border-round z-depth-5">
  <h6 class="white-text truncate lighten-4 tooltipped" data-tooltip="]]..v.Comentario..[[">]]..v.Comentario..[[</h6>
  <h5 class="white-text truncate lighten-4 " >R$]]..Reais(v.Valor)..[[</h5>
  <p class="white-text lighten-4">Vencimento: ]]..Data(v.DataDeVencimento)..[[</p>


  <a class='dropdown-button btn' href='#' data-activates='Opções]]..i..[['>Opções</a>

  <ul id='Opções]]..i..[[' class='dropdown-content'>
    <li><a href="#ModalReceberBoleto]]..i..[[" class="modal-trigger">Receber</a></li>
    <li><a href="#ModalAlterarBoleto]]..i..[[" class="modal-trigger">Alterar</a></li>

<form id="FormularioImprimirBoleto]]..i..[[" action="imprimirboleto.prisma" method="get" target="_blank" >
<input type="hidden" name="IdDoBoleto" value="]]..v.Id..[[">
</form>
    <li><a id="BotãoImprimirBoleto]]..i..[[">Imprimir</a></li>



    <li><a href="#ModalApagarBoleto]]..i..[[" class="modal-trigger">Apagar</a></li>
  </ul>

</div>
  </div>
</div>

                <div id="ModalApagarBoleto]]..i..[[" class="modal">
<div class="modal-content ">
<h6 class="title center ">Confirma apagar boleto ]]..v.Id..[[ no valor de R$]]..Reais(v.Valor)..[[?</h6>
<h6 class="title center red-text ">Cuidado, se o cliente estiver com o boleto ainda poderá pagar!</h6>
<form id="FormularioApagarBoleto]]..i..[[" action="#">
                     
<div class="row">

<div class="input-field col s12">

<input id="MotivoApagar]]..i..[[" name="Motivo" type="text" >
<label for="MotivoApagar]]..i..[[">Especifique o motivo</label>


</div>

<div class="input-field col s12">
<i class="material-icons prefix">vpn_key</i>
<input id="SenhaApagarBoleto]]..i..[[" name="Senha" type="password">
<label for="SenhaApagarBoleto]]..i..[[">Digite sua senha</label>
<input type="hidden" name="Boleto" value="]]..v.Id..[[">
<input type="hidden" name="Acao" value="Apagar">
<input type="hidden" name="Login" value="]]..v.Usuario..[[">

</div>
</div>


<div class="row">
<div class="input-field col s12">
<button id="BotãoApagarBoleto]]..i..[[" class="btn waves-effect waves-light right red" type="submit" >
<i class="material-icons right">clear</i>
Confirmo
</button>
</div>
</div>
                     
</form>
</div>
                </div>
                <div id="ModalAlterarBoleto]]..i..[[" class="modal">
<div class="modal-content ">
<h6 class="title center ">Ao alterar o boleto, envie o arquivo de remessa ao banco um dia antes de entregar o boleto ao cliente, caso contrário o cliente não conseguirá pagar.</h6>
<form id="FormularioAlterarBoleto]]..i..[[" action="#">
                     
<div class="row">

<div class="input-field col s6 ">
<input type="text" name="ValorDoDesconto" id="ValorDoDescontoAlterado]]..i..[[" value="]]..v.ValorDoDesconto..[[">
<label for="ValorDoDescontoAlterado]]..i..[[">Desconto até o vencimento</label>
</div>

<div class="input-field col s6 ">
<input type="text" name="ValorAlterado" id="ValorAlterado]]..i..[[" value="]]..v.Valor..[[">
<label for="ValorAlterado]]..i..[[">Valor </label>
</div>

<div class="input-field col s6 ">
<input type="text" class="datepicker" name="Vencimento" id="VencimentoAlterado]]..i..[[" value="]]..Data(v.DataDeVencimento)..[[">
<label for="VencimentoAlterado]]..i..[[">Vencimento </label>
</div>

<div class="input-field col s6 ">
<input type="text" name="Motivo" id="MotivoAlterado]]..i..[[" required>
<label for="MotivoAlterado]]..i..[[">Especifique o motivo </label>
</div>

<div class="input-field col s6">
<i class="material-icons prefix">vpn_key</i>
<input id="SenhaAlterarBoleto]]..i..[[" name="Senha" type="password" >
<label for="SenhaAlterarBoleto]]..i..[[">Digite sua senha</label>
<input type="hidden" name="Boleto" value="]]..v.Id..[[">
<input type="hidden" name="Acao" value="Alterar">
<input type="hidden" name="Login" value="]]..v.Usuario..[[">

</div>
</div>


<div class="row">
<div class="input-field col s12">
<button id="BotãoAlterarBoleto]]..i..[[" class="btn waves-effect waves-light right amber black-text" type="submit" >

Confirmo
</button>
</div>
</div>
                     
</form>
</div>
                </div>


                <div id="ModalReceberBoleto]]..i..[[" class="modal">
<div class="modal-content ">
<h6 class="title center ">Receber boleto ]]..v.Id..[[ de ]]..v.Nome..[[</h6>

<ul class="collection">
  <li class="collection-item ">Nosso número: <a class="right">]]..v.NossoNumero..[[</a></li>




</ul>

<form id="FormularioReceberBoleto]]..i..[[" action="#">
                     
<div class="row">
<div class="input-field col s6 ">

<input type="text" name="Acrescimo" id="Acrescimo]]..i..[[" value="]]..v.ValorDaMulta..[[">

<label for="Acrescimo]]..i..[[">Multa e mora</label>
</div>
<div class="input-field col s6 ">

<input type="text" name="ValorDoDesconto" id="ValorDoDesconto]]..i..[[" value="]]..v.ValorDoDesconto..[[">

<label for="ValorDoDesconto]]..i..[[">Desconto</label>
</div>




<div class="input-field col s6 " id="ContenedorFormaDePagamento]]..i..[[">

<select name="FormaDePagamento" id="FormaDePagamento]]..i..[[">
<option id="AdicionarFormaDePagamento]]..i..[[" value="Incluir" >Incluir outra forma </option>
]]..FormaDePagamento()..[[

</select>
<label for="FormaDePagamento]]..i..[[">Forma de pagamento</label>
</div>

<div class="input-field col s6 ">

<input id="ValorPago]]..i..[[" name="ValorPago" type="text" value="]]..v.Valor..[[">
<label for="ValorPago]]..i..[[">Valor pago</label>
<input type="hidden"  id="ValorOriginal]]..i..[[" value="]]..v.Valor..[[">
<input type="hidden"  id="ValorDaMora]]..i..[[" value="]]..v.ValorDaMora..[[">
<input type="hidden"  id="ValorDaMulta]]..i..[[" value="]]..v.ValorDaMulta..[[">

<input type="hidden"  id="ValorTotal]]..i..[[" value="]]..v.Valor..[[">
<input type="hidden" name="Boleto" value="]]..v.Id..[[">
<input type="hidden" name="Acao" value="Receber">
    <input type="hidden" name="Login" value="]]..v.Usuario..[[">

</div>

  <div class="switch col s12 m6 l6">
<p class="right">
Perdoar multa e mora
<label>
  <input type="checkbox"  name="Perdoar" id="Perdoar]]..i..[[" value="sim">
  <span class="lever"></span>
</label>
</p>
  </div>

  <div class="switch col s12 m6 l6">
<p>
<label>
  <input type="checkbox"  name="IncluirNaProxima" id="IncluirNaProxima]]..i..[[" value="sim" >
  <span class="lever"></span>
</label> Incluir na próxima mensalidade
</p>
  </div> 

<div class="input-field col s12 m6 l6 ">

<input type="text" class="datepicker" name="DataDePagamento" id="DataDePagamento]]..i..[[" value="]]..DataDeHoje..[[">

<label for="DataDePagamento]]..i..[[">Data de pagamento</label>
</div>

<div class="input-field col s12 m6 l6">
<i class="material-icons prefix">vpn_key</i>
<input id="Senha]]..i..[[" name="Senha" type="password">
<label for="Senha]]..i..[[">Digite sua senha</label>
</div>

</div>


<div class="row">
<div class="input-field col s12">
<button id="BotãoReceberBoleto]]..i..[[" class="btn waves-effect waves-light right " type="submit" >
<i class="material-icons right">keyboard_arrow_down</i>
Receber
</button>
</div>
</div>
                     
</form>
</div>
                </div>

]])

tabela.insira(TabelaJavaScript,[[

$('#AncoraNotaDoBoleto]]..i..[[').click(function(e){
e.preventDefault();
e.stopPropagation();
$('#ModalVazio').modal('open');

$.ajax({
   url:'consultarnota.prisma?Tipo=Boleto&Login=]]..v.Usuario..[[&Passe=]]..CodigoResumido('md5','tit',v.Id)..[[',
   type:'GET',
   success: function(result){

$('#ConteúdoDoModalVazio').html(result);

   },
   error: function(result){

$('#ConteúdoDoModalVazio').text('Erro no servidor');

   }
});

});


$('#FormaDePagamento]]..i..[[').change(function(){
   if ($(this).val() == 'Incluir'){
       $('#ContenedorFormaDePagamento]]..i..[[').replaceWith('<div class="input-field col s6 "><input type="text" name="FormaDePagamento" id="FormaDePagamento]]..i..[["> <label for="FormaDePagamento]]..i..[[">Forma de pagamento</label></div>');
       Materialize.updateTextFields();
       $('select').material_select();
       $('#FormaDePagamento]]..i..[[').focus();
   }
});


$("#Acrescimo]]..i..[[").keyup(function(){
    $('#ValorPago]]..i..[[').val(
    parseFloat(
    parseFloat( ValorOriginal]]..i..[[.value  )
      + parseFloat( $("#Acrescimo]]..i..[[").val().replace(',','.').replace('R$','')  )
      - parseFloat( $("#ValorDoDesconto]]..i..[[").val().replace(',','.').replace('R$','')  )
      ).toFixed(2)
      );
         Materialize.updateTextFields();
         $("#ValorPago]]..i..[[").trigger('mask.maskMoney');

});
$("#ValorDoDesconto]]..i..[[").keyup(function(){
    $('#ValorPago]]..i..[[').val(
    parseFloat(
    parseFloat( ValorOriginal]]..i..[[.value  )
      + parseFloat( $("#Acrescimo]]..i..[[").val().replace(',','.').replace('R$','')  )
      - parseFloat( $("#ValorDoDesconto]]..i..[[").val().replace(',','.').replace('R$','')  )
      ).toFixed(2)
      );
         Materialize.updateTextFields();
         $("#ValorPago]]..i..[[").trigger('mask.maskMoney');
});



function CalculaValor]]..i..[[() {
var Acrescimo]]..i..[[ = $("#Acrescimo]]..i..[[").val().replace(',','.').replace('R$','');
var Desconto]]..i..[[ = $("#ValorDoDesconto]]..i..[[").val().replace(',','.').replace('R$','');
var ValorTotal]]..i..[[ = ( ]]..v.Valor..[[ + parseFloat(Acrescimo]]..i..[[.value) - parseFloat(Desconto]]..i..[[.value) ) ;
$("#ValorPago]]..i..[[").val(   parseFloat(ValorTotal]]..i..[[).toFixed(2) );
}

$(document).ready(function(){

$('select').material_select();

    $("#ValorPago]]..i..[[").maskMoney({precision:2, showSymbol:true, symbol:"R$", decimal:",", thousands:".", allowZero: true, affixesStay: true, prefix:'R$ ', removeMaskOnSubmit: true});
    $("#ValorDoDesconto]]..i..[[").maskMoney({showSymbol:true, symbol:"R$", decimal:",", thousands:".", allowZero: true, affixesStay: true, prefix:'R$ ', removeMaskOnSubmit: true});
    $("#Acrescimo]]..i..[[").maskMoney({ showSymbol:true, symbol:"R$", decimal:",", thousands:".", allowZero: true, affixesStay: true, prefix:'R$ ', removeMaskOnSubmit: true});

    $("#ValorDoDescontoAlterado]]..i..[[").maskMoney({showSymbol:true, symbol:"R$", decimal:",", thousands:".", allowZero: true, affixesStay: true, prefix:'R$ ', removeMaskOnSubmit: true});
    $("#ValorAlterado]]..i..[[").maskMoney({showSymbol:true, symbol:"R$", decimal:",", thousands:".", allowZero: true, affixesStay: true, prefix:'R$ ', removeMaskOnSubmit: true});

   
    var Condicao = ']]..v.Condicao..[[';
    if ( Condicao == 'vencido') {
    $('#ValorPago]]..i..[[').val(
    parseFloat(
    parseFloat( ]]..v.Valor..[[  )
      + parseFloat( $("#Acrescimo]]..i..[[").val().replace(',','.').replace('R$','')  )
      - parseFloat( $("#ValorDoDesconto]]..i..[[").val().replace(',','.').replace('R$','')  )
      ).toFixed(2)
      );
         Materialize.updateTextFields();
    };   
$("#Acrescimo]]..i..[[").trigger('mask.maskMoney');
$("#ValorDoDesconto]]..i..[[").trigger('mask.maskMoney');
$("#ValorPago]]..i..[[").trigger('mask.maskMoney');
$("#ValorDoDescontoAlterado]]..i..[[").trigger('mask.maskMoney');
$("#ValorAlterado]]..i..[[").trigger('mask.maskMoney');
    Materialize.updateTextFields();
});


$('#Perdoar]]..i..[[').change( function() {

if (this.checked) {
        $('#ValorPago]]..i..[[').val(  parseFloat(
        ]]..v.Valor..[[
        - parseFloat( $("#ValorDoDesconto]]..i..[[").val().replace(',','.').replace('R$','') )
        ).toFixed(2)
          );
Materialize.updateTextFields();
$("#ValorPago]]..i..[[").trigger('mask.maskMoney');
    } if (!this.checked)  {
    $('#ValorPago]]..i..[[').val(
    parseFloat(
    parseFloat( ]]..v.Valor..[[  )
      + parseFloat( $("#Acrescimo]]..i..[[").val().replace(',','.').replace('R$','')  )
      - parseFloat( $("#ValorDoDesconto]]..i..[[").val().replace(',','.').replace('R$','')  )
      ).toFixed(2)
      );
         Materialize.updateTextFields();
         $("#ValorPago]]..i..[[").trigger('mask.maskMoney');
    }
});


$('#BotãoImprimirBoleto]]..i..[[').click( function(e) {
e.preventDefault();
$('#FormularioImprimirBoleto]]..i..[[').submit();
});


$('#FormularioApagarBoleto]]..i..[[').submit( function(e) {
e.preventDefault();


$('#BotãoApagarBoleto]]..i..[[').text("Apagando...");

    setTimeout(function() {
$.ajax({
   url:'alterarboleto.prisma',
   data: $("#FormularioApagarBoleto]]..i..[[").serialize(),
   type:'GET',
   success: function(dados){

result=dados;
               
if( result.SUCESSO ){
$('#BotãoApagarBoleto]]..i..[[').text("APAGADO");
$('#BotãoApagarBoleto]]..i..[[').addClass('green');
            setTimeout(function() {
  $('#ModalApagarBoleto]]..i..[[').modal('close');
            }, 1000);
            setTimeout(function() {
location.reload();
}, 2000);
            } else{
$("#BotãoApagarBoleto]]..i..[[").text(result.ERRO);
$('#BotãoApagarBoleto]]..i..[[').addClass('animated shake');
setTimeout(function() {
$('#BotãoApagarBoleto]]..i..[[').removeClass("animated shake");
}, 2000);
setTimeout(function() {
$('#BotãoApagarBoleto]]..i..[[').text("APAGAR");
}, 2000);
              // alert(result.ERRO);
}//else
   },
   error: function(result){
Materialize.toast('ERRO NO SERVIDOR', 3000,'red');
setTimeout(function() {
$('#BotãoAlterarBoleto]]..i..[[').text("APAGAR");
}, 2000);

   }
});
}, 1000);
});


$('#FormularioReceberBoleto]]..i..[[').submit( function(e) {
e.preventDefault();

$('#BotãoReceberBoleto]]..i..[[').text("Recebendo...");

    setTimeout(function() {
$.ajax({
   url:'alterarboleto.prisma',
   data: $("#FormularioReceberBoleto]]..i..[[").serialize(),
   type:'GET',
   success: function(dados){

result=dados;
               
if( result.SUCESSO ){
$('#BotãoReceberBoleto]]..i..[[').text(result.SUCESSO);
$('#BotãoReceberBoleto]]..i..[[').addClass('green');
            setTimeout(function() {
  $('#ModalReceberBoleto]]..i..[[').modal('close');
            }, 1000);
            setTimeout(function() {
location.reload();
}, 2000);
            } else{
$("#BotãoReceberBoleto]]..i..[[").text(result.ERRO);
$('#BotãoReceberBoleto]]..i..[[').addClass('animated shake');
setTimeout(function() {
$('#BotãoReceberBoleto]]..i..[[').removeClass("animated shake");
}, 2000);
setTimeout(function() {
$('#BotãoReceberBoleto]]..i..[[').text("RECEBER");
}, 2000);
              // alert(result.ERRO);
}//else
   },
   error: function(result){
Materialize.toast('ERRO NO SERVIDOR', 3000,'red');
setTimeout(function() {
$('#BotãoAlterarBoleto]]..i..[[').text("RECEBER");
}, 2000);

   }
});
}, 1000);
});


$('#FormularioAlterarBoleto]]..i..[[').submit( function(e) {
e.preventDefault();


$('#BotãoAlterarBoleto]]..i..[[').text("Alterando...");

    setTimeout(function() {
$.ajax({
   url:'alterarboleto.prisma',
   data: $("#FormularioAlterarBoleto]]..i..[[").serialize(),
   type:'GET',
   success: function(dados){

result=dados;
               
if( result.SUCESSO ){
$('#BotãoAlterarBoleto]]..i..[[').text(result.SUCESSO);
$('#BotãoAlterarBoleto]]..i..[[').addClass('green');
            setTimeout(function() {
  $('#ModalApagarBoleto]]..i..[[').modal('close');
            }, 1000);
            setTimeout(function() {
location.reload();
}, 2000);
            } else{
$("#BotãoAlterarBoleto]]..i..[[").text(result.ERRO);
$('#BotãoAlterarBoleto]]..i..[[').addClass('animated shake');
setTimeout(function() {
$('#BotãoAlterarBoleto]]..i..[[').removeClass("animated shake");
}, 2000);
setTimeout(function() {
$('#BotãoAlterarBoleto]]..i..[[').text("ALTERAR");
}, 2000);
              // alert(result.ERRO);
}//else
   },
   error: function(result){
Materialize.toast('ERRO NO SERVIDOR', 3000,'red');
setTimeout(function() {
$('#BotãoAlterarBoleto]]..i..[[').text("ALTERAR");
}, 2000);

   }
});
}, 1000);
});



]])




fim


adalberto

Boa tarde, Rafael.

Então, isso, infelizmente, é uma limitação da própria linguagem.

Não se é possível concatenar mais de 200 vezes simultaneamente, encontrei uma solução, veja no final.

Consegui simular o mesmo erro com o seguinte código:



local i = 0;
local z = i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i;


A única solução foi concatenar em etapas em vez de uma única vez, veja o código corrigido logo abaixo:




local i = 0;
//primeira etapa
local z = i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i;


//segunda etapa; perceba que o valor de z já computado é colocado no início da atribuição:
z = z .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i;

//terceira etapa;
z = z .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i;

//quarta etapa
z = z .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i .. i ..
i .. i .. i .. i;

//e no fim imprimimos sem problemas o valor concatenado:
imprima(z);


No seu caso, vc terá que primeiro fazer as etapas de concatenação colocando em uma variável local temporária e depois passar como parâmetro ao imprima ou à outra função que precise.

Ex.: 
local html_cmd= '';
html_cmd = html_cmd .. '<código html/js>' .. i .. '<código html/js>' ...
html_cmd = html_cmd .. '<código html/js>' .. i .. '<código html/js>'  ... e assim por diante ...
imprima(html_cmd);


Não precisa ser muitas etapas, apenas a quantidade suficiente para não ultrapassar os 200 de limite, na sua situação acho que 2 ou 3 etapas funcionará sem problemas.

Tenta aí depois retorna aqui, ok.

Até mais.

adalberto

Há uma outra forma também, criei uma função que concatena valores e não gera o erro de limite de 200 níveis C.

É necessário passar os valores a serem concatenados em forma de tabela (separados por vírgulas entre chaves):

local valor = 200;
local  result, err = concat { [[ <minha tag>]] , valor , [[</minha tag>]] }  ;
se nao result entao imprima(err); sis.saia(1); fim
imprima(result);
//saída-->   <minha tag>200</minha tag>


Veja o código da função logo abaixo:


local funcao concat(t)
  se tipo(t)<>'tabela' entao retorne falso, 'Espera-se uma tabela em vez de ' .. tipo(t) fim;
  local convstring = convstring;
  local s = '';
  para i,v em pares(t) inicio
    s = s .. convstring(v);
  fim
  retorne s;
fim