# Solução Delégua (linguagem + bibliotecas)

<br>
<p align="center">
  <img src="https://github.com/DesignLiquido/delegua/raw/principal/recursos/imagens/icone-delegua.png" alt="delegua" width="auto" height="130px">
  <h3 align="center">Linguagem Delégua</h3>

  <p align="center">
    Linguagem de programação escrita em TypeScript, derivada da <a href="https://egua.tech/docs/egua" target="_blank">Linguagem Égua</a>
  </p>

  <p align="center">
    <a href="https://designliquido.github.io/delegua-web/" target="_blank">Página Web com Interpretador Delégua para demonstrações</a>
  </p>

  <p align="center">
    <a href="https://github.com/DesignLiquido/delegua/issues" target="_blank"><img src="https://img.shields.io/github/issues/Designliquido/delegua" /></a>
    <img src="https://img.shields.io/github/stars/Designliquido/delegua" />
    <img src="https://img.shields.io/github/forks/Designliquido/delegua" />
    <a href="https://www.npmjs.com/package/delegua" target="_blank"><img src="https://img.shields.io/npm/v/delegua" /></a>
    <img src="https://img.shields.io/github/license/Designliquido/delegua" />
    <br />
  </p>

  <p align="center">
    Acompanhe a Design Líquido nas redes sociais:
  </p>
  
  <p align="center">
    <a href="https://twitter.com/designliquido" target="_blank"><img src="https://img.shields.io/static/v1?style=for-the-badge&message=Twitter&color=1DA1F2&logo=Twitter&logoColor=FFFFFF&label=" /></a>
    <a href="https://www.instagram.com/design.liquido" target="_blank"><img src="https://img.shields.io/static/v1?style=for-the-badge&message=Instagram&color=E4405F&logo=Instagram&logoColor=FFFFFF&label=" /></a>
    <a href="https://www.youtube.com/channel/UCJRn3B7r0aex6LCaOyrQtZQ" target="_blank"><img src="https://img.shields.io/static/v1?style=for-the-badge&message=YouTube&color=FF0000&logo=YouTube&logoColor=FFFFFF&label=" /></a>
    <a href="https://www.linkedin.com/company/design-liquido" target="_blank"><img src="https://img.shields.io/static/v1?style=for-the-badge&message=LinkedIn&color=0A66C2&logo=LinkedIn&logoColor=FFFFFF&label=" /></a>
    <a href="https://www.tiktok.com/@designliquido" target="_blank"><img src="https://img.shields.io/static/v1?style=for-the-badge&message=TikTok&color=000000&logo=TikTok&logoColor=FFFFFF&label=" /></a>
  </p>
</p>

Pacote da Linguagem Delégua para Node.js (NPM) com todas as blbliotecas implementadas até então:

- O núcleo da linguagem propriamente dito: https://github.com/DesignLiquido/delegua
- Biblioteca para arquivos: https://github.com/DesignLiquido/delegua-arquivos
- Biblioteca para criptografia: https://github.com/DesignLiquido/delegua-criptografia
- Biblioteca para estatística: https://github.com/DesignLiquido/delegua-estatistica
- Biblioteca para física: https://github.com/DesignLiquido/delegua-fisica
- Biblioteca para matemática: https://github.com/DesignLiquido/delegua-matematica
- Biblioteca para manejo de datas e horas: https://github.com/DesignLiquido/delegua-tempo
- Biblioteca para manejo de JSON (JavaScript Object Notation): https://github.com/DesignLiquido/delegua-json
- Biblioteca para requisições HTTP: https://github.com/DesignLiquido/delegua-http

Outra vantagem do uso deste pacote é a paridade de versões entre o núcleo e as bibliotecas. Por esta forma de instalação, todas as versões mais recentes de todas as bibliotecas de Delégua estão devidamente pareadas com a versão da linguagem em si.

## Instalação

[Você deve ter o Node.js instalado em seu ambiente](https://dicasdejavascript.com.br/instalacao-do-nodejs-e-npm-no-windows-passo-a-passo). 

Com o Node.js instalado, execute o seguinte comando em um prompt de comando (Terminal, PowerShell ou `cmd` no Windows, Terminal ou `bash` em Mac e Linux):

```bash
npm install -g delegua
```

### Usando como LAIR (Leia-Avalie-Imprima-Repita) em console

Feita a instalação no seu ambiente, execute o seguinte comando:

```sh
delegua
```

Você terá um interpretador Delégua que avalia expressões linha a linha.

Um exemplo de uso é como uma calculadora:

```js
delegua> 2 + 2
4

delegua> 2 * 3
6

delegua> 2 ** 10
1024
```

Para finalizar a execução do interpretador LAIR Delégua, use o atalho <key>Ctrl</key> + <key>C</key> (todos os sistemas operacionais).

Se quiser apenas ver a versão instalada (sem executar), use:

```sh
delegua -v
```

Ou

```sh
delegua --versao
```

Para saber os demais comandos e opções, use:

```sh
delegua --ajuda
```

#### Dialetos que suportam o modo LAIR

- Delégua
- Égua Clássico
- Pituguês

### Executando arquivos

É possível usar o interpretador com outros dialetos, como Égua.

```sh
delegua --dialeto egua
```

Ou

```sh
delegua -d pitugues
```

[Veja aqui todos os dialetos suportados](https://github.com/DesignLiquido/delegua/wiki/Dialetos).

### Executando código

É possível passar código como argumento para Delégua usando a opção `-c`:

```sh
delegua -c "escreva('Olá mundo')"
```

### Lendo código do _pipe_

```sh
echo 'escreva("Ola mundo")' | delegua -
```

## Depuração

A instalação do pacote `delegua` inclui o comando `delegua-dap`, que implementa o [Debug Adapter Protocol](https://microsoft.github.io/debug-adapter-protocol/) (DAP) da Microsoft. Qualquer editor ou IDE com suporte a DAP pode depurar programas Delégua sem configuração adicional.

### Iniciando o adaptador DAP

```sh
delegua-dap
```

O adaptador lê requisições de `stdin` e escreve respostas em `stdout` usando JSON-RPC com cabeçalho `Content-Length`, conforme especificado pelo protocolo DAP.

### Usando com o Code::Blocks

Instale o plugin **LinguagensDL** no Code::Blocks. O plugin já usa `delegua-dap` como adaptador padrão — basta ter o pacote `delegua` instalado globalmente e o depurador funcionará automaticamente ao acionar "Depurar arquivo atual".

### Usando com o VS Code

No arquivo `launch.json` do seu projeto:

```json
{
    "type": "delegua",
    "request": "launch",
    "name": "Depurar arquivo Delégua",
    "program": "${file}",
    "dialeto": "delegua"
}
```

### Comandos DAP suportados

| Comando             | Descrição                                              |
|---------------------|--------------------------------------------------------|
| `initialize`        | Handshake inicial; retorna capabilities                |
| `launch`            | Carrega o programa (`program`) e dialeto               |
| `setBreakpoints`    | Define pontos de parada por arquivo e linha            |
| `configurationDone` | Inicia execução até o primeiro ponto de parada         |
| `threads`           | Retorna a lista de threads                             |
| `stackTrace`        | Retorna a pilha de execução                            |
| `scopes`            | Retorna os escopos de um frame                         |
| `variables`         | Retorna as variáveis de um escopo                      |
| `continue`          | Retoma execução até o próximo ponto de parada          |
| `next`              | Passo sobre (_Step Over_)                              |
| `stepIn`            | Passo dentro (_Step Into_)                             |
| `stepOut`           | Passo fora (_Step Out_)                                |
| `disconnect`        | Encerra a sessão                                       |

## Tradução para outras linguagens

O comando geral é o seguinte:

```sh
delegua --traduzir {linguagem-origem}-para-{linguagem-destino} meu-arquivo.{extensão}
```

Exemplos:

```sh
delegua --traduzir delegua-para-javascript meu-arquivo.delegua
```
ou

```sh
delegua --traduzir javascript-para-delegua meu-arquivo.js
```

De uma forma resumida, podemos alterar o `--traduzir` para `-t`, assim como para gerar um arquivo de saída basta passar o parâmetro `--saida` ou `-s`:

```sh
delegua --traduzir delegua-para-javascript --saida meu-arquivo.delegua
```

Traduções suportadas até o momento:

- Delégua para Assembly ARM (`delegua-para-arm`) (use a opção `-a` para especificar um alvo. Padrão: `linux-arm`)
- Delégua para Assembly x64 (`delegua-para-x64`) (use a opção `-a` para especificar um alvo. Padrão: `linux`)
- Delégua para AssemblyScript (`delegua-para-assemblyscript` ou `delegua-para-as`)
- Delégua para JavaScript (`delegua-para-javascript` ou `delegua-para-js`)
- Delégua para Python (`delegua-para-python` ou `delegua-para-py`)

Traduções reversas suportadas até o momento:

- JavaScript para Delégua (`javascript-para-delegua` ou `js-para-delegua`)
- Python para Delégua (`python-para-delegua`)
- VisuAlg para Delégua (`visualg-para-delegua`)
