Os verbos do pipeline
Seis palavras contextuais que fazem um quadro fluir pelo operador >> — com as colunas escritas nuas.
O operador >> já existia, com sift, morph e distill. Para dado tabular faltava o vocabulário: seis verbos que operam sobre o quadro inteiro, e não sobre um item por vez.
resumo := vendas
>> onde valor bigger 50
>> agrupar produto
>> resumir {"valor": "soma"}
>> ordenar valor desc
out resumo.texto()produto valor
------- -----
cafe 210
cha 60Os seis#
| Verbo | Faz | Devolve |
|---|---|---|
onde <expressão> | filtra, com as colunas escritas nuas | quadro |
pegar a, b | escolhe colunas, nessa ordem | quadro |
sem a | descarta colunas | quadro |
ordenar col [desc] | ordena | quadro |
agrupar col[, col2] | agrupa | agrupamento |
resumir {…} | agrega | quadro |
agrupar é o único que não devolve quadro: um agrupamento não tem forma retangular até alguém dizer "média de quê". Depois dele vem resumir — e qualquer outro verbo ali diz isso.
A coluna se escreve nua#
É o que faz o verbo valer a pena. onde valor bigger 50 lê como se lê, sem lambda l: l["valor"]:
out (vendas >> onde qtd bigger 3).altura()Nem todo cabeçalho de CSV é um identificador válido — Valor Total e preco/kg são nomes comuns de coluna. Por isso as duas formas convivem:
q := Q.de_vaults([{"Valor Total": 10}, {"Valor Total": 30}])
out (q >> pegar "Valor Total").colunas()Duas regras de escopo, e elas são previsíveis#
Dentro de um onde | Vale |
|---|---|
| um nome que é coluna | a coluna vence, sempre |
| um nome que não é coluna | o escopo de fora, como em qualquer expressão |
limite := 100.0
out (vendas >> onde valor bigger limite).altura() // 1 — 'limite' vem de foraA primeira regra é o contrato do verbo: dentro de um onde, um nome nu é uma coluna. Sem ela, o mesmo código leria de dois jeitos conforme o que houvesse no escopo.
A ausência não passa no filtro#
Comparar com o desconhecido não dá nem sim nem não, e a linha não passa. É a lógica de três valores do SQL, e a de toda ferramenta de dados que existe:
out (vendas >> onde valor bigger 0).altura() // 4 — a linha sem valor fica fora
out (vendas >> onde valor is void).altura() // 1 — e quem quer a ausência perguntaOs verbos convivem com `sift` e `morph`#
A conversão é preguiçosa: cada estágio pede a forma de que precisa, na hora em que precisa.
out vendas >> onde regiao is "sul" >> morph l: l["produto"]E a fonte pode ser um cluster de vaults, que é o que sai de IO.read_csv(caminho, yes) e de Database.query — obrigar a converter na mão faria o verbo valer menos justamente onde o dado entra.
linhas := [{"a": 1}, {"a": 5}]
out (linhas >> onde a bigger 2).altura()Por que contextuais, e não reservadas#
As seis palavras não entram em KEYWORDS. Elas valem só logo depois de um >>, e continuam livres como nome em todo o resto:
onde := 1
pegar := 2
agrupar := 3
out onde + pegar + agruparÉ o mesmo tratamento das onze palavras do Kiln. agrupar, ordenar e pegar são nomes bons demais para tirar de quem escreve — e este repositório já removeu sete palavras reservadas por serem caras sem entregar nada.
O que o analisador confere, e o que ele não pode#
A expressão de um onde não é inferida no escopo de fora: os nomes dela são colunas, e o analisador não sabe quais colunas um quadro tem em tempo de análise. Inferir ali acusaria onde valor bigger 50 com "'valor' is not defined" — um falso alarme no caminho mais comum do verbo, que é exatamente o que ensina a desligar a verificação inteira.
O que ele confere é o que consegue provar: que o verbo existe, que agrupar é seguido de resumir, e o tipo que o pipeline produz.