Bem-vindo ao Factor! O Factor é uma linguagem concatenativa: em vez de chamares funções como square(add(2, 3)), escreves uma fila de palavras da esquerda para a direita — 2 3 + square — que passam valores umas às outras através de uma pilha de dados partilhada. Imagina uma pilha de caixotes de carga num cais, com o mais recente no topo.
Um ! inicia um comentário de linha: o Factor ignora tudo desde o ! até ao fim da linha. Os exemplos abaixo usam ! para anotar o que o código faz.
Escrever um literal empilha-o no topo da pilha. O código lê-se da esquerda para a direita.
1 2 3 ! stack (bottom → top): 1 2 3
Cada palavra lê os seus valores de entrada do topo da pilha e volta a escrever aí os seus resultados. . retira o valor do topo e imprime-o; .s imprime a pilha toda sem consumir nada, o que dá jeito para veres o que um trecho de código deixou para trás.
Cada palavra está documentada com um efeito na pilha da forma ( inputs -- outputs ). É o contrato da palavra: a palavra retira os valores de entrada do topo da pilha e deixa os valores de saída no lugar deles. Os nomes no interior são documentação para humanos: a pilha em si é posicional, não tem nomes. O topo da pilha é o nome mais à direita.
: inicia a definição de uma palavra, a seguir vem o efeito na pilha, depois o corpo, e ; termina-a. O compilador do Factor verifica se o corpo deixa mesmo o que o efeito na pilha declara.
: restow ( a b -- b a ) swap ;
Estas palavras do kernel rearranjam o topo da pilha sem fazerem aritmética nenhuma: limitam-se a mover caixotes de um lado para o outro.
dup ( x -- x x ) ! copy the top crate
drop ( x -- ) ! remove the top crate
swap ( x y -- y x ) ! flip the top two
over ( x y -- x y x ) ! copy the second crate onto the top
nip ( x y -- y ) ! remove the second crate
rot ( x y z -- y z x ) ! roll the third crate up to the top
Recorre a dup quando um caixote tem de alimentar duas palavras, a drop para deitares um caixote fora, a swap quando os dois do topo estão na ordem errada, a over ou nip para trabalhares com o caixote que está por baixo, e a rot para trazeres ao topo um caixote que está soterrado.
A família mais alargada (-rot, dupd, swapd, 2dup, …) segue a mesma ideia; vais conhecer essas palavras mais tarde.
As palavras escritas em fila executam-se da esquerda para a direita: cada palavra atua sobre a pilha que a palavra anterior deixou. Eis o que swap nip faz à pilha 1 2 (de baixo para cima), uma palavra de cada vez:
1 2 ! 1 2 the starting crates
swap ! 2 1 swap flipped the top two
nip ! 1 nip dropped the 2nd-from-top crate (the 2)
E eis o dup rot nos mesmos caixotes iniciais, também uma palavra de cada vez:
1 2 ! 1 2 the starting crates
dup ! 1 2 2 dup copied the top crate
rot ! 2 2 1 rot rolled the 3rd-from-top crate up to the top
As palavras usam lowercase-kebab-case: letras minúsculas separadas por hífenes.
És um marinheiro a voltar a arrumar as caixas de carga no cais. Cada tarefa é uma única palavra cujo corpo usa apenas palavras de baralhamento, sem aritmética.
Define a palavra swap-crates. Retira duas caixas da pilha e deixa-as ficar
na ordem oposta.
1 2 swap-crates .s
! 2
! 1
Define a palavra clear-spill. Retira três caixas da pilha e deixa ficar as
duas de baixo, descartando a de cima.
1 2 3 clear-spill .s
! 1
! 2
Define a palavra peek-under. Retira duas caixas da pilha e deixa-as ficar
com uma cópia da caixa de baixo colocada por cima.
1 2 peek-under .s
! 1
! 2
! 1
Define a palavra tidy-deck. Retira três caixas da pilha, na ordem
x y z, e deixa ficar z z y: descarta a caixa de baixo e deixa duas
cópias da caixa de cima debaixo da do meio.
1 2 3 tidy-deck .s
! 3
! 3
! 2
Inscreve-te no Exercism para aprenderes e dominares Factor com 47 conceitos163 exercícios, e mentoria humana real, tudo grátis.