
Criando CLIs, MCPs e APIs a partir de uma única fonte com Morloc
Uma Interface de Linha de Comando pega um conjunto central de funções e as expõe como uma utilidade de shell. Um servidor HTTP pode pegar as mesmas funções e expô-las através de uma rede, enquanto um MCP pode expô-las para agentes de IA. Um núcleo funcional, muitas visões. Em cada caso, a interface é um modelo onde o melhor design é o design mais sem graça. Criatividade em uma API ou CLI é como criatividade na ortografia: irritante. Então, por que não derivar automaticamente as visões das funções? O Morloc faz exatamente isso.
Como um compilador poliglota fortemente tipado, o Morloc é singularmente adequado para esse problema. Ele conhece todos os tipos de função, gerencia totalmente a serialização e propaga dicas de docstring até a geração de código. E isso pode ser feito entre linguagens, garantindo consistência.
Aqui está um programa Morloc que renderiza o conjunto de Mandelbrot com o tempo de escape computado em Rust e a imagem renderizada em Python:
-- fractals.loc
module fractals (mandel, julia)
import tensor-rust
import tensor-py
source Rust from "mandel.rs"
( "julia_grid" as julia
, "mandel_grid" as mandel
)
--' Renderiza o conjunto de Mandelbrot sobre uma viewport.
--' @render -a/--ascii=asAscii @default
--' @render -p/--ppm=asPpm
--' @render -g/--png=asPng
mandel :: View -> Matrix I64
--' Renderiza um conjunto de Julia
--' @render -a/--ascii=asAscii @default
--' @render -p/--ppm=asPpm
--' @render -g/--png=asPng
julia ::
--' Parte real da constante de Julia
--' @arg -r/--real
--' @default -0.8
F64 ->
--' Parte imaginária da constante de Julia
--' @arg -i/--imaginary
--' @default 0.156
F64 ->
View ->
Matrix I64
-- continuado no próximo bloco de código Morloc
As definições de tensor Rust são importadas do módulo Morloc tensor-rust. A função mandel é originada do Rust e mapeada para um tipo Morloc. O tipo View é um registro que é definido nas linhas Morloc a seguir:
--' Controles da viewport.
--' @unroll
record View where
--' Parte real do centro da visualização
--' @arg --center-x
--' @metavar X
--' @default -0.5
centerX :: F64
--' Parte imaginária do centro da visualização
--' @arg --center-y
--' @metavar Y
--' @default 0.0
centerY :: F64
--' Ampliação (maior = zoom mais profundo)
--' @arg --zoom
--' @metavar Z
--' @default 1.0
zoom :: F64
--' Largura de saída em células
--' @arg --width
--' @metavar COLS
--' @default 80
width :: I64
--' Altura de saída em células
--' @arg --height
--' @metavar ROWS
--' @default 40
height :: I64
--' Teto de iteração de escape
--' @arg --max-iter
--' @metavar N
--' @default 200
maxIter :: I64
record Rust => View = "View"
-- continuado no bloco final de código Morloc
A definição de tipo Morloc fornece dicas de docstring para o registro que é passado para os geradores de código a jusante. O registro será desdobrado nas interfaces como uma coleção de parâmetros opcionais.
As funções brutas envolvidas lidam com os dados fundamentais - matrizes numéricas neste caso. Os campos @render associam renders que pegam a saída da função e a transformam em uma saída binária ou textual. Esses podem ser escritos em qualquer linguagem suportada. Escrevê-los em Rust teria um desempenho melhor, uma vez que não haveria custos de marshalling de dados, mas optei por Python aqui por conveniência de prototipagem.
--' @mime image/png
type PNG = Vector U8
--' @mime image/x-portable-pixmap
type PPM = Vector U8
source Py from "render.py"
( "as_ascii" as asAscii
, "as_ppm" as asPpm
, "as_png" as asPng
)
--' Sombrear a grade em arte ASCII de terminal.
asAscii :: Matrix I64 -> Str
--' Codificar a grade como uma imagem PPM binária (P6).
asPpm :: Matrix I64 -> PPM
--' Codificar a grade como uma imagem PNG com um mapa de cores suave (Pillow).
asPng :: Matrix I64 -> PNG
O código fonte em Rust e Python é totalmente idiomático. As entradas de dados e o
O uso do Morloc pode otimizar a integração de sistemas para empresas brasileiras, permitindo que suas aplicações se comuniquem de forma mais eficiente com agentes de IA. Isso pode resultar em maior agilidade e inovação nos serviços oferecidos.
