Trilhas
/
Factor
Factor
/
Exercícios
/
Fábrica à prova de falhas
Fábrica à prova de falhas

Fábrica à prova de falhas

Exercício de aprendizagem

Introdução

O sistema de erros do Factor tem três partes: throw para sinalizar um erro, recover para tratar um, e ERROR: para definir seu próprio tipo de erro.

throw

throw (em kernel) lança um erro. O argumento pode ser qualquer valor, uma string, um número ou uma tupla, e ele se torna o erro que você pode inspecionar depois:

! DOCTEST: SKIP
"file not found" throw

throw não retorna; o resto da palavra atual é ignorado.

recover

recover (em continuations) é o try/catch do Factor. Ele recebe uma quotation try e uma quotation recovery:

recover ( try recovery -- )

Se try terminar sem lançar nada, recovery é ignorado. Se try lançar um erro, o erro é empilhado na pilha e recovery é executado:

[ "boom" throw ] [ drop "caught" ] recover .
! => "caught"

[ "ok" ] [ drop "never runs" ] recover .
! => "ok"

when, do kernel, é o companheiro natural: ele executa uma quotation apenas quando o topo da pilha é verdadeiro:

: check-positive ( n -- )
    0 < [ "negative!" throw ] when ;

ERROR:

ERROR: define uma classe de tupla e uma palavra que constrói uma nova instância e a lança:

! DOCTEST: SKIP
ERROR: not-found path ;

"/missing" not-found
! throws T{ not-found { path "/missing" } }

Um erro sem slots é apenas ERROR: name ;. Chamar name lança uma instância vazia. Tuplas definidas com ERROR: carregam um predicado de classe name? que você pode usar para testar se um erro capturado era desse tipo.

Lendo os slots de volta

Um erro capturado é apenas uma tupla, então cada slot de ERROR: vem com o mesmo leitor slot>> gerado automaticamente que qualquer outra tupla.

! DOCTEST: SKIP
{
    T{ not-found { path "/a" } }
    T{ not-found { path "/b" } }
}
[ path>> ] map .   ! => { "/a" "/b" }

Instruções

Elena, a nova gerente de qualidade de uma fábrica de jornais, pede que você escreva um pequeno programa para monitorar a sala de produção.

1. Defina um erro personalizado

Defina uma classe de tupla de erro machine-error usando a palavra de parsing ERROR:. Ela não precisa de slots.

machine-error   ! throws a fresh machine-error

2. Verifique a umidade

Defina check-humidity. Ela pega uma leitura de umidade da pilha e usa throw para lançar a string "humidity too high" quando a leitura for estritamente maior que 70. Caso contrário, ela não retorna nada.

50 check-humidity   ! returns nothing
80 check-humidity   ! throws "humidity too high"

3. Verifique a temperatura

Defina check-temperature. Ela pega uma leitura de temperatura e usa throw para lançar a string "temperature too high" quando a leitura for estritamente maior que 500. Caso contrário, ela não retorna nada.

400 check-temperature   ! returns nothing
600 check-temperature   ! throws "temperature too high"

4. Monitore a máquina

Defina monitor para pegar uma umidade e uma temperatura da pilha e rodar as duas verificações. Se qualquer uma das verificações lançar uma exceção, monitor deve lançar um machine-error novo em vez disso. Se as duas passarem, monitor não retorna nada.

50 400 monitor   ! returns nothing
80 400 monitor   ! throws a machine-error
50 600 monitor   ! throws a machine-error

5. Monitore um lote de leituras

Defina monitor-batch para pegar um array de leituras { humidity temperature } e retornar quantas delas falhariam (ou seja, quantas fariam monitor lançar uma exceção).

{ { 50 400 } { 80 400 } { 50 600 } { 60 200 } } monitor-batch .
! => 2
Editar via GitHub O link abre em uma nova janela ou aba
Factor Exercism

Tudo pronto para começar Fábrica à prova de falhas?

Crie sua conta no Exercism para aprender e dominar Factor com 47 conceitos163 exercícios e mentoria humana de verdade, tudo de graça.