1. Variaveis (SET)

Comando para definir variaveis. Suporta strings, numeros, listas, objetos e expressoes.

SINTAXE
SET <nome_variavel> TO <valor>
# Atribuicao de string SET nome TO "Maria" # Atribuicao de numero SET idade TO 25 # Numero decimal SET preco TO 19.99 # Lista SET frutas TO ["maca", "banana", "laranja"] # Expressao matematica SET dobro TO ${idade * 2} # Interpolacao de string SET saudacao TO "Ola, ${nome}!" # Acessar item de lista (indice 0) SET primeira TO ${frutas[0]} # Acessar campo de objeto SET valor TO ${last_result["campo"]}
Regras:
  • Nomes: letras, numeros e underscore (_)
  • Nao podem comecar com numero
  • Case-sensitive (nome != Nome)
  • Valores interpolados com ${...}

2. Chamada de Tools (CALL)

Comando para invocar tools nativas do HMP.

SINTAXE
CALL <categoria>.<tool> WITH <param1>=<valor1>, <param2>=<valor2>
# Imprimir mensagem CALL log.print WITH message="Ola, mundo!" # Soma com label para resultado CALL math.sum WITH a=10, b=5, label="soma" SET resultado TO ${last_result["soma"]} # Usando variaveis como parametros SET x TO 100 SET y TO 50 CALL math.subtract WITH a=${x}, b=${y} # Requisicao HTTP CALL http.get WITH url="https://api.github.com/users/octocat" # Gerar UUID CALL crypto.uuid
Resultado:
  • Resultado da ultima chamada: ${last_result}
  • Com label: ${last_result["label"]}

3. Condicional (IF/THEN/ELSE/ENDIF)

Executa blocos de codigo baseado em condicoes.

SINTAXE
IF <condicao> THEN ... ELSE ... ENDIF
== Igual
!= Diferente
> Maior
< Menor
>= Maior ou igual
<= Menor ou igual
AND E logico
OR Ou logico
# Condicional simples SET idade TO 18 IF ${idade >= 18} THEN CALL log.print WITH message="Maior de idade" ENDIF # Com ELSE SET nota TO 7 IF ${nota >= 6} THEN CALL log.print WITH message="Aprovado!" ELSE CALL log.print WITH message="Reprovado" ENDIF # Multiplas condicoes com AND SET idade TO 25 SET tem_cnh TO true IF ${idade >= 18} AND ${tem_cnh == true} THEN CALL log.print WITH message="Pode dirigir" ENDIF # Condicao com OR SET dia TO "sabado" IF ${dia == "sabado"} OR ${dia == "domingo"} THEN CALL log.print WITH message="Final de semana!" ENDIF

4. Loops

4.1 LOOP N TIMES

Executa um bloco de codigo um numero fixo de vezes.

SINTAXE
LOOP <numero> TIMES ... ENDLOOP
# Loop simples - ${loop_index} comeca em 0 LOOP 5 TIMES CALL log.print WITH message="Iteracao ${loop_index}" ENDLOOP # Saida: Iteracao 0, Iteracao 1, Iteracao 2, Iteracao 3, Iteracao 4 # Construindo uma lista SET lista TO [] LOOP 3 TIMES CALL list.push WITH list=${lista}, item=${loop_index} SET lista TO ${last_result} ENDLOOP # lista = [0, 1, 2] # Tabuada do 5 SET numero TO 5 LOOP 10 TIMES SET i TO ${loop_index + 1} SET resultado TO ${numero * i} CALL log.print WITH message="${numero} x ${i} = ${resultado}" ENDLOOP

4.2 WHILE

Executa enquanto uma condicao for verdadeira. Limite: 1000 iteracoes.

SINTAXE
WHILE <condicao> ... ENDWHILE
# Contador simples SET contador TO 0 WHILE ${contador < 5} CALL log.print WITH message="Contador: ${contador}" SET contador TO ${contador + 1} ENDWHILE # Fibonacci ate 100 SET a TO 0 SET b TO 1 WHILE ${b < 100} CALL log.print WITH message=${b} SET temp TO ${b} SET b TO ${a + b} SET a TO ${temp} ENDWHILE

4.3 FOR EACH

Itera sobre cada item de uma lista.

SINTAXE
FOR EACH <variavel> IN <lista> ... ENDFOR
# Iterar sobre lista de strings SET frutas TO ["maca", "banana", "laranja"] FOR EACH fruta IN ${frutas} CALL log.print WITH message="Fruta: ${fruta}" ENDFOR # Iterar com indice SET nomes TO ["Ana", "Bruno", "Carlos"] FOR EACH nome IN ${nomes} SET posicao TO ${loop_index + 1} CALL log.print WITH message="${posicao}. ${nome}" ENDFOR # Processar lista de numeros SET numeros TO [10, 20, 30, 40] SET soma TO 0 FOR EACH num IN ${numeros} SET soma TO ${soma + num} ENDFOR CALL log.print WITH message="Soma total: ${soma}" # Filtrar lista SET valores TO [5, 12, 3, 18, 7, 25] SET maiores TO [] FOR EACH v IN ${valores} IF ${v > 10} THEN CALL list.push WITH list=${maiores}, item=${v} SET maiores TO ${last_result} ENDIF ENDFOR # maiores = [12, 18, 25]

5. Execucao Paralela (PARALLEL)

Executa multiplas operacoes simultaneamente. Ideal para requisicoes HTTP independentes.

SINTAXE
PARALLEL ... ENDPARALLEL
# Requisicoes HTTP paralelas PARALLEL CALL http.get WITH url="https://api.github.com/users/user1", label="user1" CALL http.get WITH url="https://api.github.com/users/user2", label="user2" CALL http.get WITH url="https://api.github.com/users/user3", label="user3" ENDPARALLEL # Acessar resultados SET dados1 TO ${last_result["user1"]} SET dados2 TO ${last_result["user2"]} SET dados3 TO ${last_result["user3"]} # Operacoes paralelas diversas PARALLEL CALL crypto.uuid WITH label="id1" CALL crypto.uuid WITH label="id2" CALL random.int WITH min=1, max=1000, label="numero" ENDPARALLEL
Nota: Comandos dentro de PARALLEL devem ser independentes entre si.

6. Tratamento de Erros (TRY/CATCH)

Captura e trata erros durante a execucao. A variavel ${error} contem a mensagem do erro.

SINTAXE
TRY ... CATCH ... ENDTRY
# Tratar erro de requisicao HTTP TRY CALL http.get WITH url="https://api.invalida.com/dados" CALL log.print WITH message="Sucesso!" CATCH CALL log.print WITH message="Erro: ${error}" ENDTRY # Divisao segura SET divisor TO 0 TRY CALL math.divide WITH a=100, b=${divisor} SET resultado TO ${last_result} CATCH SET resultado TO 0 CALL log.print WITH message="Divisao por zero evitada" ENDTRY # Multiplas operacoes com fallback TRY CALL http.get WITH url="https://api1.exemplo.com/dados" SET dados TO ${last_result} CATCH TRY CALL http.get WITH url="https://api2.exemplo.com/dados" SET dados TO ${last_result} CATCH SET dados TO {"erro": "Nenhuma API disponivel"} ENDTRY ENDTRY

7. Funcoes (FUNCTION)

Define funcoes reutilizaveis com parametros.

SINTAXE
FUNCTION <nome>(<params>) ... RETURN <valor> ENDFUNCTION
# Funcao simples FUNCTION saudacao(nome) SET msg TO "Ola, ${nome}!" CALL log.print WITH message=${msg} RETURN ${msg} ENDFUNCTION CALL saudacao WITH nome="Maria" # Funcao com calculos FUNCTION calcular_media(a, b, c) SET soma TO ${a + b + c} SET media TO ${soma / 3} RETURN ${media} ENDFUNCTION CALL calcular_media WITH a=10, b=20, c=30 SET resultado TO ${last_result} CALL log.print WITH message="Media: ${resultado}" # Funcao com logica condicional FUNCTION classificar_nota(nota) IF ${nota >= 9} THEN RETURN "Excelente" ENDIF IF ${nota >= 7} THEN RETURN "Bom" ENDIF IF ${nota >= 5} THEN RETURN "Regular" ENDIF RETURN "Insuficiente" ENDFUNCTION CALL classificar_nota WITH nota=8.5 CALL log.print WITH message="Classificacao: ${last_result}" # Funcao recursiva (fatorial) FUNCTION fatorial(n) IF ${n <= 1} THEN RETURN 1 ENDIF SET n_menos_1 TO ${n - 1} CALL fatorial WITH n=${n_menos_1} SET resultado TO ${n * last_result} RETURN ${resultado} ENDFUNCTION CALL fatorial WITH n=5 CALL log.print WITH message="5! = ${last_result}"

8. Expressoes e Operadores

Expressoes sao avaliadas dentro de ${...}

8.1 Operadores Aritmeticos

+Adicao${5 + 3}= 8
-Subtracao${10 - 4}= 6
*Multiplicacao${6 * 7}= 42
/Divisao${20 / 4}= 5
%Modulo (resto)${17 % 5}= 2
**Potencia${2 ** 8}= 256

8.2 Operadores de Comparacao

==Igual${x == 5}
!=Diferente${x != 0}
>Maior${x > 10}
<Menor${x < 100}
>=Maior ou igual${x >= 18}
<=Menor ou igual${x <= 65}

8.3 Operadores Logicos

ANDE logico${x > 0 AND x < 100}
OROu logico${x == 0 OR x == 1}
NOTNegacao${NOT encontrado}

8.4 Acesso a Dados

# Acesso a lista por indice SET lista TO [10, 20, 30] SET item TO ${lista[1]} # item = 20 # Acesso a dicionario por chave SET obj TO {"nome": "Ana", "idade": 25} SET nome TO ${obj["nome"]} # nome = "Ana" # Acesso aninhado SET dados TO {"user": {"nome": "Bob"}} SET nome TO ${dados["user"]["nome"]} # nome = "Bob"

8.5 Interpolacao de Strings

SET nome TO "Carlos" SET idade TO 30 SET msg TO "Nome: ${nome}, Idade: ${idade}" # msg = "Nome: Carlos, Idade: 30"

9. Variaveis Especiais

Variaveis automaticamente gerenciadas pelo motor HMP.

last_result

Resultado da ultima chamada CALL.

CALL math.sum WITH a=5, b=3 SET soma TO ${last_result} # soma = 8 CALL http.get WITH url="https://api.github.com/users/octocat" SET nome TO ${last_result["login"]} # nome = "octocat"

loop_index

Indice atual em loops (LOOP, FOR EACH). Comeca em 0.

LOOP 3 TIMES CALL log.print WITH message="Indice: ${loop_index}" ENDLOOP # Indice: 0 # Indice: 1 # Indice: 2

error

Mensagem de erro capturado no bloco CATCH.

TRY CALL math.divide WITH a=10, b=0 CATCH CALL log.print WITH message="Erro: ${error}" ENDTRY

10. Limites de Seguranca

O HMP v3.0.0 implementa diversos limites de seguranca para execucao segura.

Execucao

  • Timeout global: 30 segundos
  • Iteracoes maximas: 10.000 (global)
  • Profundidade maxima: 50 niveis
  • WHILE maximo: 1.000 por loop
  • system.sleep: 5 segundos max

HTTP

  • Timeout: 5 segundos por requisicao
  • Tamanho resposta: 1 MB maximo
  • Hosts: Apenas allowlist (8 dominios)
  • Protecao SSRF: Validacao exata de host

Avaliacao

  • Metodo: AST (sem eval/exec)
  • Cache LRU: 2.000 entradas
  • Variaveis ambiente: Lista segura apenas

Hosts HTTP Permitidos

  • api.github.com
  • jsonplaceholder.typicode.com
  • httpbin.org
  • api.openai.com
  • api.anthropic.com
  • reqres.in
  • dummyjson.com
  • fakestoreapi.com