parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Способ есть — структурное программирование...

Sumo 24.01.2018 08:26 / 24.01.2018 11:49

Замените свою непрерывную последовательность операторов на логические части — функции. Вывод, проверка, обработка и возврат результата — это разные задачи, которые можно и нужно разнести по функциям.

Внутри функции, как написал Moko, можно использовать return, и throw для неявного «goto» (break и continue в циклах — это тоже неявный goto).

Пример:
@main[][locals]
^try{
  ^if(^request:method.lower[] eq "post"){
    $lErrors[^validateForm[$form:fields]]
    ^if(!$lErrors){
      ^processForm[$form:fields]
      ^redirectTo[/form/action/result]
    }
  }
  ^printForm[$form:fields;$lErrors]   
}{
  ^if($exception.type eq "http.redirect"){
     $exception.handled(true)
     $response:status[$exception.source]
     $response:location[$exception.comment]
  }
}

@redirectTo[aURL]
  ^throw[http.redirect;302;$aURL]

@printForm[aData;aErrors]
  $aData[^hash::create[$aData]]
  $aErrors[^hash::create[$aErrors]]
  <form method="post">
     <label class="^if(def $aErrors.field1){error}">Поле 1
       <input type="text" name="field1" value="$aData.field1">
     </label>
     ^if(def $aErrors.[field1]){
       <p class="error-message">$aErrors.field1</p>
     }
     <input type="submit" />
  </form>

@validateForm[aFormData]
  $result[^hash::create[]]
  ^if(!def $aFormData.field1){
    $result.field1[Заполните поле.]
  }

@processForm[aFormData]
  ...