Now tem objetos
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
list
cria uma lista com aqueles 2 elementos;transform
lê de uma lista ou generator e “vai cuspindo” o que vier como retorno no SubPrograma;collect
lê de uma lista ou generator e “cospe” uma Lista com os elementos coletados;join
vai unir todos os elementos da lista, separador pela string passada como argumento;return
vai retornar o que vier como input ou args.