Now tem objetos

now logo

Uma das grandes influências de Now foi Tcl. Tcl é uma linguagem magnífica! Com relação a sintaxe, concorre fácil com qualquer outra para ser a que mais gosto.

Como concluímos, eu e um colega: “Tcl é um diálogo, não uma fórmula matemática”.

E talvez o maior trunfo de Tcl seja justamente não ter sintaxe. Os caras se apegam ao “dodecálogo” da linguagem e é isso aí. Fora aprender novos comandos, não existe nenhum momento “aha! Descobri uma parada nova na sintaxe!”, porque não usa-se sintaxe para resolver os problemas.

Voltar a trabalhar num projeto Tcl, depois de alguns meses sem mexer no mesmo, é interessantíssimo: a impressão que eu tive foi a mesma de voltar no dia seguinte. E eu nunca tinha experimentado algo assim antes!

Porém, essa simplicidade toda tem um custo: falta sintaxe, haha! Há momentos em que essa troca de simplicidade por previsibilidade faz c om que certas operações sejam previsivelmente chatas. Indexação de arrays é um bom exemplo. Extrair coisas de dentro de strings. Índices e slicing são sempre complicados, geralmente exigindo uma porção de [] aninhados.

Então uma das ideias de Now é favorecer composição linear, ou seja, evitar chamadas de comandos aninhadas.

Um exemplo da vida real:

return [clock format [clock seconds] -format %y-%m-%d]_[clock format [clock seconds] -format %H:%M:%S]

Em Now, imaginando que os mesmos comandos estivessem disponíveis, isso seria escrito assim:

list
    . [clock seconds | clock format -- (format = "%y-%m-%d")]
    . [clock seconds | clock format -- (format = "%H:%M:%S")]
    : join "_"
    | return

Como a ideia é retornar dois valores de duas chamadas de comandos, não tem muito como fugir dessas duas chamadas com []. Mas dentro dessas chamadas, pelo menos não temos aninhamento.

(Para quem não sabe, -- separa “args” de “keyword args” em Now.)

Objetos

Já é um avanço, mas não é o bastante, ainda. Repare que chamamos um mesmo comando, clock, para retornar o tempo em segundos since Epoch e para fazer a formatação. Mas ficaria mais fácil se clock seconds retornasse um objeto e format fosse um método:

list
    . [clock seconds : format "%y-%m-%d"]
    . [clock seconds : format "%H:%M:%S"]
    : join "_"
    | return

(Para quem não sabe, line continuation em Now se faz com aquele . no começo da linha ao invés de um \ horrível no fim da linha anterior.)

Veja como a chamada toda fica bem mais limpa!

O macete para ler Now facilmente é olhar tanto o pipe (|) quanto o dois-pontos sempre pensando em “o que vem antes?”. Por exemplo: ao nos depararmos com : join "_", devemos nos perguntar o que vem antes: no caso, uma chamada a list. Então sabemos que isso é uma chamada ao método join de um objeto List.

Ao nos depararmos com | return, o que vem antes? O resultado de um List : join, que é uma String! Logo, estaremos retornando uma string.

Forma alternativa

list "%y-%m-%d" "%H:%M:%S"
    | transform fmt { clock seconds : format $fmt | return }
    | collect
    : join "_"
    | return