Parcours
/
Factor
Factor
/
Exercices
/
Sécurité d'usine
Sécurité d'usine

Sécurité d'usine

Exercice d'apprentissage

Introduction

Le système d'erreurs de Factor se compose de trois éléments : throw pour signaler une erreur, recover pour en gérer une, et ERROR: pour définir ton propre type d'erreur.

throw

throw (dans kernel) lève une erreur. L'argument peut être n'importe quelle valeur, une string, un nombre ou un tuple, et c'est cette valeur qui devient l'erreur que tu pourras examiner ensuite :

! DOCTEST: SKIP
"file not found" throw

throw ne rend pas la main ; le reste du mot en cours est ignoré.

recover

recover (dans continuations) est le try/catch de Factor. Il prend une quotation try et une quotation recovery :

recover ( try recovery -- )

Si try se termine sans lever d'erreur, recovery est ignoré. Si try lève une erreur, celle-ci est empilée et recovery est exécuté :

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

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

when, dans kernel, est le compagnon naturel : il n'exécute une quotation que lorsque le sommet de la pile est vrai :

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

ERROR:

ERROR: définit une classe de tuple et un mot qui construit une nouvelle instance et la lève :

! DOCTEST: SKIP
ERROR: not-found path ;

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

Une erreur sans slot s'écrit simplement ERROR: name ;. Appeler name lève une instance vide. Les tuples définis avec ERROR: portent un prédicat de classe, name?, que tu peux utiliser pour tester si une erreur interceptée était de ce type.

Relis les slots

Une erreur interceptée n'est qu'un tuple : chaque slot défini avec ERROR: dispose donc du même lecteur slot>> généré automatiquement que n'importe quel autre tuple.

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

Instructions

Elena, la nouvelle responsable qualité d’une usine de journaux, te demande d’écrire un petit logiciel pour surveiller la salle de production.

1. Définis une erreur personnalisée

Définis une classe de tuple d’erreur machine-error à l’aide du mot d’analyse ERROR:. Elle n’a pas besoin de slots.

machine-error   ! throws a fresh machine-error

2. Vérifie l’humidité

Définis check-humidity. Elle prend une mesure d’humidité sur la pile et throw la string "humidity too high" lorsque la mesure est strictement supérieure à 70. Sinon, elle ne renvoie rien.

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

3. Vérifie la température

Définis check-temperature. Elle prend une mesure de température et throw la string "temperature too high" lorsque la mesure est strictement supérieure à 500. Sinon, elle ne renvoie rien.

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

4. Surveille la machine

Définis monitor pour qu’elle prenne une mesure d’humidité et une mesure de température sur la pile, puis exécute les deux vérifications. Si l’une des vérifications lève une erreur, monitor doit lever une nouvelle machine-error à la place. Si les deux vérifications réussissent, monitor ne renvoie rien.

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

5. Surveille un lot de mesures

Définis monitor-batch pour qu’elle prenne un tableau de mesures { humidity temperature } et renvoie combien d’entre elles échoueraient (c’est-à-dire combien feraient échouer monitor).

{ { 50 400 } { 80 400 } { 50 600 } { 60 200 } } monitor-batch .
! => 2
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Factor Exercism

Prêt à commencer Sécurité d'usine ?

Inscris-toi sur Exercism pour apprendre et maîtriser Factor avec 47 concepts163 exercices, et un vrai mentorat humain, le tout gratuitement.