Início rápido
Tradução automática
Esta página foi traduzida automaticamente do inglês e ainda não foi revisada por um falante nativo; correções são bem-vindas no GitHub. Se algo não bater, vale o original em inglês.
Construa sua primeira aplicação Quantum em 5 minutos.
Cada passo desta página roda no CI (tests/docs/test_guide_quick_start.py). O código está em inglês, como no original.
Passo 1: crie um componente
Crie um arquivo chamado counter.q:
<q:component name="Counter" xmlns:q="https://quantum.lang/ns">
<q:function name="double">
<q:param name="n" type="number" />
<q:return value="{n * 2}" />
</q:function>
<q:set name="count" type="number" value="0" />
<q:set name="count" operation="increment" />
<q:set name="count" operation="increment" />
<q:return value="Count: {count}, doubled: {double(count)}" />
</q:component>Saída: Count: 2, doubled: 4
Rode — o quantum run mostra o que o componente retorna:
quantum run counter.q[SUCCESS] Result: Count: 2, doubled: 4Passo 2: acrescente um loop
Crie todo-list.q:
<q:component name="TodoList" xmlns:q="https://quantum.lang/ns">
<q:set name="tasks" type="array" value='["Buy groceries", "Walk the dog", "Write code"]' />
<!-- each q:return adds one item to the result -->
<q:loop type="array" var="task" items="{tasks}">
<q:return value="- {task}" />
</q:loop>
</q:component>Saída: ["- Buy groceries", "- Walk the dog", "- Write code"]
Um q:return dentro de um loop não interrompe o loop: cada valor é guardado, e quando o loop termina o componente retorna a lista (LOOP-1, LOOP-2). Um loop que não executa nenhum q:return deixa a execução seguir para o que vem depois dele.
Passo 3: acrescente condicionais
Crie weather.q:
<q:component name="Weather" xmlns:q="https://quantum.lang/ns">
<q:set name="temperature" value="25" type="number" />
<q:if condition="temperature > 30">
<q:return value="It's hot! Stay hydrated." />
</q:if>
<q:elseif condition="temperature > 20">
<q:return value="Nice weather for a walk." />
</q:elseif>
<q:elseif condition="temperature > 10">
<q:return value="Bring a jacket." />
</q:elseif>
<q:else>
<q:return value="Bundle up, it's cold!" />
</q:else>
</q:component>Saída: Nice weather for a walk.
Passo 4: sirva uma página web
As páginas ficam numa pasta components/; o nome do arquivo é a URL. Crie components/index.q:
<q:component name="index" xmlns:q="https://quantum.lang/ns">
<q:set name="items" value='["Apple", "Banana", "Cherry"]' />
<q:set name="a" value="10" type="number" />
<q:set name="b" value="5" type="number" />
<html>
<head><title>My Quantum App</title></head>
<body>
<h1>Welcome to Quantum</h1>
<ul>
<q:loop type="array" var="item" items="{items}">
<li>{item}</li>
</q:loop>
</ul>
<p>{a} + {b} = {a + b}</p>
</body>
</html>
</q:component>Inicie o servidor a partir da pasta que contém components/:
quantum startAbra http://localhost:8080: a página mostra os três itens e 10 + 5 = 15. components/about.q seria servido em /about. Pare o servidor com quantum stop.
Sem
<!DOCTYPE html>no arquivo: um.qé XML, e um DOCTYPE só é válido antes do elemento raiz. O servidor o acrescenta à resposta.
Passo 5: leia de um banco de dados
Crie um banco SQLite com uma tabela (qualquer Python serve — Quantum já precisa dele):
python -c "import sqlite3, os; os.makedirs('data', exist_ok=True); c = sqlite3.connect('data/app.db'); c.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, email TEXT)'); c.executemany('INSERT INTO users (name, email) VALUES (?, ?)', [('Ana', 'ana@example.com'), ('Bruno', 'bruno@example.com')]); c.commit()"Declare o banco em quantum.config.yaml, ao lado de components/:
datasources:
db:
driver: sqlite
database: ./data/app.dbCrie components/users.q:
<q:component name="users" xmlns:q="https://quantum.lang/ns">
<q:query name="users" datasource="db">
SELECT id, name, email FROM users ORDER BY name
</q:query>
<html><body>
<h1>{users_result.recordCount} users</h1>
<table>
<q:loop query="users">
<tr><td>{users.name}</td><td>{users.email}</td></tr>
</q:loop>
</table>
</body></html>
</q:component>Reinicie o servidor e abra http://localhost:8080/users: 2 users, Ana e Bruno.
Passo 6: trate um formulário
Acrescente um formulário e uma q:action que insere uma linha — o parâmetro é declarado, então o SQL nunca vê a entrada crua. Substitua components/users.q por:
<q:component name="users" xmlns:q="https://quantum.lang/ns">
<q:action name="add" method="POST">
<q:param name="name" required="true" minlength="2" />
<q:param name="email" type="email" required="true" />
<q:query name="inserted" datasource="db">
INSERT INTO users (name, email) VALUES (:name, :email)
<q:param name="name" value="{name}" type="string" />
<q:param name="email" value="{email}" type="string" />
</q:query>
<q:redirect url="/users" flash="Added {name}" />
</q:action>
<q:query name="users" datasource="db">
SELECT id, name, email FROM users ORDER BY name
</q:query>
<html><body>
<q:if condition="flash"><p>{flash}</p></q:if>
<table>
<q:loop query="users">
<tr><td>{users.name}</td><td>{users.email}</td></tr>
</q:loop>
</table>
<form method="POST" action="/users">
<input name="name" /> <input name="email" type="email" />
<button>Add</button>
</form>
</body></html>
</q:component>Enviar Carla e carla@example.com a acrescenta à tabela e mostra Added Carla; um nome de uma letra só é recusado, e nada é inserido.
E agora?
Você aprendeu o básico! Agora explore (páginas em inglês):
- Actions & Forms - validação, redirecionamentos, várias ações
- Authentication - login com verificação de senha
- Components - o sistema de componentes a fundo
- State Management - variáveis em detalhe
- AI - chamadas a LLM, RAG e agentes como tags
- Database Queries - SQL e operações com dados
- Receitas - receitas testadas, uma tarefa cada