Bem-vindo ao Factor! Factor é uma linguagem concatenativa: em vez de
chamar funções como square(add(2, 3)), você escreve uma sequência de
palavras da esquerda para a direita, 2 3 + square, que passam valores
umas para as outras através de uma pilha de dados compartilhada. Imagine
uma pilha de caixas de carga num cais, com as mais recentes em cima.
Um ! inicia um comentário de linha: o Factor ignora tudo de ! até o fim
da linha. Os exemplos abaixo usam ! para anotar o que o código faz.
Escrever um literal o empurra para o topo da pilha. O código é lido da esquerda para a direita.
1 2 3 ! stack (bottom → top): 1 2 3
Cada palavra lê suas entradas do topo da pilha e escreve suas saídas de volta
lá. . desempilha o valor do topo e o imprime; .s imprime a pilha inteira
sem consumir nada, o que é útil para ver o que um trecho deixou para trás.
Cada palavra é documentada com um efeito de pilha no formato
( inputs -- outputs ). É o contrato da palavra: ela desempilha as entradas
do topo da pilha e deixa as saídas no lugar delas. Os nomes ali dentro são
documentação para humanos: a pilha em si é posicional, não nomeada. O topo da
pilha é o nome da direita.
: inicia a definição de uma palavra, o efeito de pilha vem em seguida, depois
o corpo, e então ; a encerra. O compilador do Factor verifica se o corpo
realmente deixa na pilha o que o efeito de pilha declara.
: restow ( a b -- b a ) swap ;
Essas palavras do kernel reorganizam o topo da pilha sem fazer nenhuma
aritmética: elas apenas movem as caixas de lugar:
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
Recorra a dup quando uma caixa precisa alimentar duas palavras, a drop para
jogar uma caixa fora, a swap quando as duas do topo estão na ordem errada, a
over ou nip para trabalhar com a caixa de baixo, e a rot para trazer ao
topo uma caixa soterrada.
A família mais ampla (-rot, dupd, swapd, 2dup, …) segue a mesma ideia;
você vai conhecer essas palavras mais adiante.
Palavras escritas em sequência são executadas da esquerda para a direita:
cada palavra age sobre a pilha que a palavra anterior deixou. Veja o que
swap nip faz com a 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 aqui está dup rot sobre as mesmas caixas 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 unidas por hífens.
Você é um tripulante de convés que está reorganizando caixas de carga no cais. Cada tarefa é uma única palavra cujo corpo usa apenas palavras de embaralhamento, sem aritmética.
Defina a palavra swap-crates. Ela tira duas caixas da pilha e as deixa em ordem inversa.
1 2 swap-crates .s
! 2
! 1
Defina a palavra clear-spill. Ela tira três caixas da pilha e deixa as duas de baixo, descartando a de cima.
1 2 3 clear-spill .s
! 1
! 2
Defina a palavra peek-under. Ela tira duas caixas da pilha e as deixa com uma cópia da caixa de baixo em cima.
1 2 peek-under .s
! 1
! 2
! 1
Defina a palavra tidy-deck. Ela tira três caixas da pilha, na ordem x y z, e deixa z z y: descarte a caixa de baixo e depois deixe duas cópias da caixa de cima por baixo da caixa do meio.
1 2 3 tidy-deck .s
! 3
! 3
! 2
Crie sua conta no Exercism para aprender e dominar Factor com 47 conceitos163 exercícios e mentoria humana de verdade, tudo de graça.