Skip to content

Demos 2018 W28

Erik Martin-Dorel edited this page Jul 13, 2018 · 4 revisions

learn-ocaml-editor

Link to this page: https://git.io/fNtKZ

Tutoriel/Démo PFITAXEL (semaine 28)

Conception d'un exercice corrigé automatiquement

  1. Se connecter à l'URL https://pfitaxel.github.io/pfitaxel-demo/
  2. Cliquer sur Éditeur
  3. Créer un nouvel exercice
  4. Choisir les méta-données ("demo_tp", "Démo TP", "Démonstration...") et Valider le formulaire
  5. Remplir l'onglet Question (à droite) avec le texte de l'exercice de TP (en Markdown)
    • Vous pouvez copier-coller l'exemple de l'Annexe 1
  6. Remplir l'onglet Solution (à gauche) avec une correction complète (et correcte)
  7. Aller sur l'onglet Toplevel (à droite), cliquer sur Évaluer le code (en bas) et faire quelques tests
  8. Aller sur l'onglet Test (à droite) et cliquer sur Générer (en bas) pour générer 1 test par question (ou 2 tests en cas de fonction polymorphe) avec 10 cas de tests aléatoires par défaut
  9. Cliquer sur le bouton Noter! (en haut) (puis cliquer si besoin sur Compile pour valider)
  10. Le résultat de la correction-test devrait s'afficher dans l'onglet Rapport. (Vous venez de tester l'évaluation automatique de votre solution avec les tests compilés automatiquement !)
  11. Cliquer sur Test.ml
  12. Vous voyez alors le code OCaml généré à partir de votre spécification de tests de haut niveau.
  13. Revenir sur l'onglet Test et cliquer sur un des bandeaux de test déjà générés, puis (en laissant sélectionné le bouton radio Solution) ajoutez un ou deux cas de test "manuel" en respectant la syntaxe de l'Annexe 2
  14. Cliquer sur Sauvegarder (en haut)
  15. Cliquer sur Compiler (en bas)
  16. Cliquer à nouveau sur le bouton Noter!

Préparation de l'environnement complet de test pour l'étudiant

  1. Cliquer sur l'onglet Patron (ou Template en anglais) puis sur le bouton Créer le patron (en bas) pour générer un squelette de code
  2. Un squelette de code avec des TODO est alors généré
  3. Vous pouvez le modifier et vérifier qu'il "type-check" en cliquant sur Valider
  4. Remplir légèrement l'onglet Prélude (à droite) avec une définition globale de variable (montrée à l'étudiant)

Expérimentation du point de vue étudiant

  1. Cliquer sur le bouton Tester situé en haut
  2. On voit alors l'énoncé de l'exercice avec une mise en forme riche
  3. La réponse de l'étudiant doit être faite à gauche
  4. Un buffer Toplevel est disponible pour faire des tests, regarder le type de fonctions, etc.
  5. Cliquer sur Valider (vérification de syntaxe et de typage)
  6. Cliquer sur Noter!
  7. Le résultat de la correction devrait s'afficher dans l'onglet Rapport

Exercice pour les enseignants (s'il reste du temps)

  1. Revenir à la vue enseignant en cliquant sur Éditer (en haut)
  2. Choisir des fonctions sur les listes (par exemple plusieurs fonctions de la première page de la feuille de TD Listes
  3. Compléter les 3 fichiers nécessaires (Question, Solution et Test (ou Test.ml))
  4. Tester le sujet
  5. Sauvegardez/téléchargez votre exercice au format .json et envoyez-le par e-mail à @erikmd

Annexe 1

# Démo TP

## Question 1.

Écrivez la fonction suivante :

    xor : bool -> bool -> bool

correspondant au **OU EXCLUSIF**.

*Remarque :* Vous pouvez fournir une fonction ayant un profil plus général.

## Question 2.

Écrivez la fonction suivante :

    power : int -> int -> int
    
correspondant à l'exponentiation.

*Remarque :* `power m n` lèvera une exception (`failwith`) si `n < 0`.

Annexe 2

Exemple de la syntaxe à utiliser pour spécifier les cas de tests dans l'onglet Test.

Pour TestAgainstSol (premier bouton radio)

Liste de listes hétérogènes :

[false @:!! false;
 false @:!! true;
 true @:!! false;
 true @:!! true]

Autre exemple :

[3 @: true @:!! "Aa";
 1 @: false @:!! "B"]

Pour TestSuite (troisième bouton radio)

Liste de couples (liste hétérogène, résultat) :

[false @:!! false ==> false;
 false @:!! true ==> true;
 true @:!! false ==> true;
 true @:!! true ==> false]

Plus généralement

Les cas de tests des 3 types de questions utilisent ainsi des listes hétérogènes grâce aux notations suivantes (il y aura plus tard un commentaire dans l'interface Web donnant un exemple de la syntaxe) :

let (@:) a l = arg a @@ l
let (!!) b = last b
let (@:!!) a b = a @: !! b
let (==>) a b = (a, fun () -> b)
let (~~) b = if b then Correct None else Wrong None

Des listes hétérogènes de taille 1, 2, 3 peuvent donc être écrites comme suit :

  • !! 1
  • 1 @:!! 2
  • 1 @: 2 @:!! 3

Annexe 3 (remarque)

Les 3 types de "tests fonctionnels de haut niveau" sont stockés (avant sérialisation dans le LocalStorage) sous la forme de termes du type suivant :

type test_qst_untyped =
  | TestAgainstSol of
      { name: string
      ; ty: string 
      ; gen: int
      ; suite: string
      ; tester: string
      ; sampler : string}
  | TestAgainstSpec of
      { name: string
      ; ty: string
      ; gen: int
      ; suite: string
      ; spec : string
      ; tester: string
      ; sampler: string}
  | TestSuite of
      { name: string;
        ty: string;
        suite: string;
        tester :string}

Voir aussi