Prisma - Linguagem de programação

Prisma-1.0 => Lista de Bugs => Tópico iniciado por: rafael online Janeiro 21, 2018, 07:39:26 AM

Título: too many C levels (limit is 200) in function
Enviado por: rafael online Janeiro 21, 2018, 07:39:26 AM
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

Título: Re:too many C levels (limit is 200) in function
Enviado por: adalberto online Janeiro 23, 2018, 09:40:47 PM
Poderia dar mais detalhe do seu código? Geralmente esse erro acontece com chamada recursiva de função.
Título: Re:too many C levels (limit is 200) in function
Enviado por: rafael online Janeiro 24, 2018, 07:09:27 AM
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

Título: Re:too many C levels (limit is 200) in function
Enviado por: adalberto online Janeiro 24, 2018, 09:25:29 AM
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.
Título: Re:too many C levels (limit is 200) in function
Enviado por: adalberto online Janeiro 25, 2018, 08:42:22 PM
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