Percursos
/
Factor
Factor
/
Exercícios
/
Baralhar a Carga
Baralhar a Carga

Baralhar a Carga

Exercício de aprendizagem

Introdução

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.

Comentários

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.

A pilha de dados

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.

Efeitos na pilha

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.

Definir uma palavra

: 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 ;

Palavras de reorganização

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.

Como as palavras se compõem

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

Convenções de nomenclatura

As palavras usam lowercase-kebab-case: letras minúsculas separadas por hífenes.

Visita guiada: como reorganizar a pilha

Instruções

É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.

1. Troca as duas caixas de cima

Define a palavra swap-crates. Retira duas caixas da pilha e deixa-as ficar na ordem oposta.

1 2 swap-crates .s
! 2
! 1

2. Limpa a caixa entornada

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

3. Guarda uma cópia da caixa de baixo

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

4. Arruma o convés

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
Editar via GitHub A ligação abre numa nova janela ou separador
Factor Exercism

Estás pronto para começar Baralhar a Carga?

Inscreve-te no Exercism para aprenderes e dominares Factor com 47 conceitos163 exercícios, e mentoria humana real, tudo grátis.