Giter Site home page Giter Site logo

ocaml-sf / learn-ocaml Goto Github PK

View Code? Open in Web Editor NEW
296.0 16.0 66.0 4.99 MB

A Web Application for Learning OCaml

Home Page: https://ocaml-sf.org/learn-ocaml/

License: MIT License

Makefile 0.25% HTML 0.42% OCaml 45.23% Standard ML 0.01% JavaScript 48.63% Shell 0.90% Dockerfile 0.14% CSS 4.38% Emacs Lisp 0.05%
ocaml teaching learn-ocaml

learn-ocaml's Introduction

Learn-OCaml

This is Learn-OCaml, a platform for learning the OCaml language, featuring a Web toplevel, an exercise environment, and a directory of lessons and tutorials.

A demo is available online.

CI macOS learn-ocaml learn-ocaml-client

Howtos

Contacts

To ask any question about how to use Learn-OCaml, subscribe to the mailing-list learn-ocaml-club.

To discuss about the development of Learn-OCaml, subscribe to the mailing-list learn-ocaml-dev.

License and copyright

Unless explicitly written below or in the files themselves, the source code for the app, images, static files, course content and exercises are placed under the MIT license.

Lightly modified third party components ACE and ppx_metaquot are included, under their original licenses (respectively BSD and MIT).

The OCamlPro logo images are (c) OCamlPro. Redistribution is permitted, alteration requires prior written authorization by OCamlPro.

The OCaml / ocaml.org logo is released under the very liberal UNLICENSE. See https://github.com/ocaml/ocaml.org/blob/master/LICENSE.md.

The Inconsolata font is released under the Open Font License. See http://www.levien.com/type/myfonts/inconsolata.html.

The Biolinum font is licensed under the GNU General Public License with a 'Font-Exception'. See http://www.linuxlibertine.org.

The public instance of Learn OCaml uses the Fontin font instead of Biolinum. This font is licensed under the exljbris Font Foundry Free Font License Agreement, which, to our understanding, does not allow us to redistribute it. See http://www.exljbris.com/eula.html. You will optionally have to procure the files by yourself while building the app. If not, the CSS provides a reasonable fallback font.

Contributions to this repository are placed under the MIT license. This means that we can merge them with the same license as the rest of the codebase, while you keep all the rights on your code. And we will not have to bother you with any future license update. See https://opensource.org/licenses/MIT.

Authors and Acknowledgements

Learn-OCaml is a free software by the OCaml Software Foundation.

It was written by OCamlPro from 2015 to 2018.

The current main contributors are Érik Martin-Dorel, Yann Régis-Gianas, and Louis Gesbert.

The initial authors were Benjamin Canou, Çağdaş Bozman, Grégoire Henry, and Louis Gesbert.

It builds on the previous experience of Try OCaml, by Çağdaş Bozman and Fabrice Le Fessant.

We heavily use js_of_ocaml, so thanks to the Ocsigen team.

The text editing component is a customized version of ACE.

We also include a derivative of ppx_metaquot by Alain Frisch.

learn-ocaml's People

Contributors

adhameer avatar agrn avatar altgr avatar asere avatar beobillly avatar cesclass avatar dm0n3y avatar emilerolley avatar erikmd avatar fourchaux avatar fpottier avatar gasche avatar github-actions[bot] avatar hernoufm avatar hferee avatar hnrgrgr avatar ineol avatar klakplok avatar leunam217 avatar louisayroles avatar lsylvestre avatar lyrm avatar maiste avatar naereen avatar niols avatar nobrakal avatar plictox avatar tsani avatar wyschean avatar yurug avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

learn-ocaml's Issues

Introduction tab in exercise menu

Here is a little suggestion to improve exercise readability.

On paper, it is pretty usual for a group of exercises to share an introduction. To be able to do the same with learn-ocaml, a basic solution is to copy the introduction at the beginning of the first exercise but this makes this exercise less readable and then it is difficult to reach introduction from following exercises.

A more practical possibility could be to add a tab between the title of the exercise group and the first exercise tab (in exercises menu) that either links to a page with the corresponding text or can be unfold to read the introduction.

However, that would probably require to add a specific field in index.json and a file (.html ou .mk) in each exercise directory and break some retro-compatibility...

Installation windows

Bonjour,
Je participe au projet PFITAXEl . Lors de l'installation de learn ocaml sur windows (j'ai installer opam a l'aide de http://fdopen.github.io/opam-repository-mingw/). J'obtiens cette erreur.
Merci pour votre attention.

$ make
Compiler: ocaml 4.05.0
Warning: 13 old env warnings were not printed (add --env-warnings)
ocp-build: Entering directory `c:\Users\Damien\gui\learn-ocaml-editor'
Warning: 8 old project warnings were not printed (add --project-warnings)
File "c:\Users\Damien\gui\learn-ocaml-editor\src\app\build.ocp", line 1, charact              ers -1--1:
ocp-build: Leaving directory `c:\Users\Damien\gui\learn-ocaml-editor'
Error: in project "learnocaml-exercise", the source filename
        ".\_obuild\learnocaml-exercise\learnocaml-exercise.byte" does not exist
RULE 365 (state active)
                SOURCE .\_obuild\learnocaml-exercise\learnocaml-exercise validat              ed(not available)
                SOURCE .\_obuild\learnocaml-exercise\learnocaml-exercise.byte(no              t available)
        cd "c:\\Users\\Damien\\gui\\learn-ocaml-editor\\src\\app"
        js_of_ocaml +weak.js +cstruct/cstruct.js C:\Users\Damien\gui\learn-ocaml              -editor\.\src\ace-lib/ace_bindings.js C:\Users\Damien\gui\learn-ocaml-editor\.\_              obuild\learnocaml-exercise/learnocaml-exercise.byte
                TARGET .\_obuild\learnocaml-exercise\learnocaml-exercise.js
make: *** [Makefile:22: build] Error 2

Error message of learn-ocaml grade

The following error message is a bit disturbing. (In that example, tmp does not contain any learn-ocaml related material.)

yann➜/tmp» learn-ocaml grade                                                                                                                                                                            [15:22:00]
Fatal error: exception Learnocaml_exercise.Missing_field("solution.ml")
Called from unknown location
Called from unknown location
Called from unknown location
Called from unknown location
Called from unknown location
Called from unknown location
Called from unknown location

Display exercise identifiers on the web interface

To use the command line client, an exercise identifier is needed. Yet, as far as I can tell, the web interface does not display this identifier.

Would it make sense to also update the command line client to get the student current homework assignments? Something like:

learn-ocaml-client assignments

would display a two-columns list like:

exercise-identifier-0      http://learn-ocaml-server/url-to-exercise-0-statement
exercise-identifier-1      http://learn-ocaml-server/url-to-exercise-1-statement
exercise-identifier-2      http://learn-ocaml-server/url-to-exercise-2-statement

Tracking issue: internationalisation (a.k.a. i18n)

  • Internationalisation of the interface (framework is here, only english and french at the moment; note: translations are not dynamic, i.e. they are built-in and fixed at compile-time rather than fetched dynamically. But that could be improved)
  • Internationalisation of exercises
    • Simple solution: duplicate the exercises files with language variants (descr.en.html, descr.fr.html...)
    • More comprehensive solution: avoid duplicating code between languages. Indeed, template.ml or others may contain strings; test.ml even generates reports that should probably be localised too. Some templating mechanism / inclusion of the ppx ? This is not easy to solve ; also, if we even want to localise values names, I think dumplication remains the better option.

More structures in exercises directories

@AltGr will it be possible to add more structures (i.e. sub-(...)-directories) to the exercises ? Right now, this is basically flat and the teachers are structuring their exercises by naming properly the exercises directories (1.1 - 1.2 - 2.1 - 2-2). Being at least able to add one level ( 1/1 - 1/2 - 2/1 - 2/2) will be great.

The build system is broken

I tried to start a fresh install of learn-ocaml on new machine and I just realized that the build system is broken. The system was still working on my machine for bad reasons: there were previously installed files found by the learn-ocaml program (doing uninstall before install would avoid that kind of inconsistencies).

Anyway, when doing make after make build-deps, I get the following warnings:

Compiler: ocaml 4.05.0
----- 10 env warnings -----
Warning: inexistent package directory:
  "/home/yann/.opam/4.05.0/lib/coq/ide"
  Disabling package "coq.ide".
    (from "/home/yann/.opam/4.05.0/lib/coq/META")
Warning: inexistent package directory:
  "/home/yann/.opam/4.05.0/lib/coq/ide"
  Disabling package "coq.idetop".
    (from "/home/yann/.opam/4.05.0/lib/coq/META")
Warning: missing package "cohttp-async":
  Disabling package "cohttp.async".
    (from "/home/yann/.opam/4.05.0/lib/cohttp/META")
Warning: missing package "cohttp-lwt-js":
  Disabling package "cohttp.js".
    (from "/home/yann/.opam/4.05.0/lib/cohttp/META")
Warning: missing package "cohttp-top":
  Disabling package "cohttp.top".
    (from "/home/yann/.opam/4.05.0/lib/cohttp/META")
Warning: missing package "cstruct-async":
  Disabling package "cstruct.async".
    (from "/home/yann/.opam/4.05.0/lib/cstruct/META")
Warning: missing package "cstruct-lwt":
  Disabling package "cstruct.lwt".
    (from "/home/yann/.opam/4.05.0/lib/cstruct/META")
Warning: missing package "cstruct-unix":
  Disabling package "cstruct.unix".
    (from "/home/yann/.opam/4.05.0/lib/cstruct/META")
Warning: missing package "js_of_ocaml-ppx_deriving_json":
  Disabling package "js_of_ocaml-ppx.deriving".
    (from "/home/yann/.opam/4.05.0/lib/js_of_ocaml-ppx/META")
Warning: missing package "js_of_ocaml-ocamlbuild":
  Disabling package "js_of_ocaml.ocamlbuild".
    (from "/home/yann/.opam/4.05.0/lib/js_of_ocaml/META")
----- 27 project warnings -----
Warning: in package grading, comp_requires dependency "ppx_ocplib_i18n" not declared
Warning: in package grading, comp_requires dependency "ppx_metaquot" not declared
Warning: in package grading, comp_requires dependency "ppx_ocplib_i18n" not declared
Warning: in package grading, comp_requires dependency "ppx_metaquot" not declared
Warning: in package grading, comp_requires dependency "ppx_ocplib_i18n" not declared
Warning: in package grading, comp_requires dependency "ppx_metaquot" not declared
Warning: in package testing, comp_requires dependency "ppx_metaquot" not declared
Warning: in package testing, comp_requires dependency "ppx_metaquot" not declared
Warning: in package testing, comp_requires dependency "ppx_metaquot" not declared
Warning: in package testing, comp_requires dependency "ppx_metaquot" not declared
Warning: in package testing, comp_requires dependency "ppx_metaquot" not declared
Warning: in package learnocaml-state, comp_requires dependency "ppx_ocplib_i18n" not declared
Warning: in package learnocaml-state, comp_requires dependency "ppx_ocplib_i18n" not declared
Warning: in package learnocaml-state, comp_requires dependency "ppx_ocplib_i18n" not declared
Warning: in package learnocaml-state, comp_requires dependency "ppx_ocplib_i18n" not declared
Warning: in package ocplib_i18n, comp_requires dependency "ppx_ocplib_i18n" not declared
Warning: in package ocplib_i18n, comp_requires dependency "ppx_ocplib_i18n" not declared
Warning: missing package "ace":
  Disabling package "learnocaml-toplevel".
    (from "/home/yann/git/teaching/learn-ocaml/learn-ocaml/src/toplevel/build.ocp")
Warning: missing package "learnocaml-toplevel":
  Disabling package "learnocaml-main".
    (from "/home/yann/git/teaching/learn-ocaml/learn-ocaml/src/app/build.ocp")
Warning: missing package "learnocaml-toplevel":
  Disabling package "learnocaml-exercise".
    (from "/home/yann/git/teaching/learn-ocaml/learn-ocaml/src/app/build.ocp")
Warning: missing package "learnocaml-app-common":
  Disabling package "learnocaml-main".
    (from "/home/yann/git/teaching/learn-ocaml/learn-ocaml/src/app/build.ocp")
Warning: missing package "learnocaml-app-common":
  Disabling package "learnocaml-exercise".
    (from "/home/yann/git/teaching/learn-ocaml/learn-ocaml/src/app/build.ocp")
Warning: missing package "learnocaml-toplevel":
  Disabling package "learnocaml-app-common".
    (from "/home/yann/git/teaching/learn-ocaml/learn-ocaml/src/app/build.ocp")
Warning: missing package "ocp-indent-nlfork.lib":
  Disabling package "learnocaml-toplevel".
    (from "/home/yann/git/teaching/learn-ocaml/learn-ocaml/src/toplevel/build.ocp")
Warning: missing package "ace":
  Disabling package "learnocaml-main".
    (from "/home/yann/git/teaching/learn-ocaml/learn-ocaml/src/app/build.ocp")
Warning: missing package "ace":
  Disabling package "learnocaml-exercise".
    (from "/home/yann/git/teaching/learn-ocaml/learn-ocaml/src/app/build.ocp")
Warning: missing package "ocp-indent-nlfork.lib":
  Disabling package "ace".
    (from "/home/yann/git/teaching/learn-ocaml/learn-ocaml/src/ace-lib/build.ocp")
Compiler: ocaml 4.05.0
Warning: 10 old env warnings were not printed (add --env-warnings)
Warning: 27 old project warnings were not printed (add --project-warnings)

Since a lot of packages are disabled, the platform is dysfunctional.

Icons

Icons still do not display on my machine even though I rebuilt everything from scratch. Other users reported me the same behavior.

Customizing the "nickname" field

We are using the Learn OCaml platform in a course where we need students to use their student ID number as their nickname so that we can associate their grades to them. Since there is no explanation of the nickname field on the welcome page, several have written something else in the nickname field instead. I imagine this would be a problem in any course where Learn OCaml is used.

It would be nice to have some customization of the welcome screen - at least being able to add a message at the top, or ideally to change the nickname field to say "student ID" or something similar.

Teacher activity: Special characters in nicknames not displayed properly before sync

When creating a new student token with the nickname "new test student", the student's name shows up in the student list in the teacher activity as "new%20test%20student". The issue is resolved after the student clicks the "Sync" button.

This also affects the downloaded CSV, and if the student closes the window and then logs in again on another machine, their nickname becomes "new%20test%20student".

Fresh installation of learn-ocaml issues an error

After a fresh installation of learn-ocaml with opam2, I get the following error:

yann➜teaching/learn-ocaml/learn-ocaml(master✗)» learn-ocaml                                                                      
Updating app at ./www
Fatal: (Sys_error "./tutorials: No such file or directory")
Cannot process exercises: (Sys_error "./exercises: No such file or directory")

with no command provided, learn-ocaml should probably simply exit silently with a success status.

Partial building of exercises session.

In the context of a large corpus of exercises, it will be useful to be able to build either one single exercise or every exercises except one. Will it be possible to add such an option ?

Exercise metadata fields not recognized

On the latest version of learn-ocaml, certain exercise metadata fields (in exercises/<exercise-name>/meta.json) don't seem to be recognized. Trying to run learn-ocaml build when a metadata file contains one of those fields gives the error message:

Updating app at ./www
Unexpected object field short_description

The fields I've experienced problems with are short_description, authors, forward_exercises, and backward_exercises.

A full example meta.json file that is causing problems:

{
  "learnocaml_version" : "1",
  "kind"               : "exercise",
  "stars"              : 0,
  "title"              : "Homework 1",
  "short_description"  : "Week 1",
  "identifier"         : "hw1",
  "authors"            : [["test author", "[email protected]"]],
  "focus"              : [],
  "requirements"       : [],
  "forward_exercises"  : [],
  "backward_exercises" : []
}

Changing the version to 2 doesn't fix the issue.

Compiling learn-ocaml now gives `cp: cannot stat '_obuild/*/learnocaml-main.js': No such file or directory`

Dear learn-ocaml developers,

Just trying reinstalling learn-ocaml from scratch, I get the error

cp: cannot stat '_obuild/*/learnocaml-main.js': No such file or directory
~/git/learn-ocaml$ opam config exec -- make
Warning: file "/home/caml/git/learn-ocaml/_obuild/ocp-build.root" does not exist. Creating with default values.
Compiler: ocaml 4.05.0
----- 12 env warnings -----
Warning: inexistent package directory:
  "/home/caml/.opam/4.05.0/lib/ocp-indent/dynlink"
  Disabling package "ocp-indent.dynlink".
    (from "/home/caml/.opam/4.05.0/lib/ocp-indent/META")
Warning: missing package "cohttp-async":
  Disabling package "cohttp.async".
    (from "/home/caml/.opam/4.05.0/lib/cohttp/META")
Warning: missing package "cohttp-lwt-js":
  Disabling package "cohttp.js".
    (from "/home/caml/.opam/4.05.0/lib/cohttp/META")
Warning: missing package "cohttp-top":
  Disabling package "cohttp.top".
    (from "/home/caml/.opam/4.05.0/lib/cohttp/META")
Warning: missing package "cstruct-async":
  Disabling package "cstruct.async".
    (from "/home/caml/.opam/4.05.0/lib/cstruct/META")
Warning: missing package "cstruct-lwt":
  Disabling package "cstruct.lwt".
    (from "/home/caml/.opam/4.05.0/lib/cstruct/META")
Warning: missing package "cstruct-unix":
  Disabling package "cstruct.unix".
    (from "/home/caml/.opam/4.05.0/lib/cstruct/META")
Warning: missing package "js_of_ocaml-ppx_deriving_json":
  Disabling package "js_of_ocaml-ppx.deriving".
    (from "/home/caml/.opam/4.05.0/lib/js_of_ocaml-ppx/META")
Warning: missing package "js_of_ocaml-ocamlbuild":
  Disabling package "js_of_ocaml.ocamlbuild".
    (from "/home/caml/.opam/4.05.0/lib/js_of_ocaml/META")
Warning: missing package "ppx_deriving":
  Disabling package "ppx_fields_conv".
    (from "/home/caml/.opam/4.05.0/lib/ppx_fields_conv/META")
Warning: missing package "ppx_deriving":
  Disabling package "ppx_sexp_conv".
    (from "/home/caml/.opam/4.05.0/lib/ppx_sexp_conv/META")
Warning: missing package "ppx_deriving":
  Disabling package "ppx_type_conv".
    (from "/home/caml/.opam/4.05.0/lib/ppx_type_conv/META")
----- 14 project warnings -----
Warning: in package grading, comp_requires dependency "ppx_metaquot" not declared
Warning: in package grading, comp_requires dependency "ppx_metaquot" not declared
Warning: in package grading, comp_requires dependency "ppx_metaquot" not declared
Warning: in package testing, comp_requires dependency "ppx_metaquot" not declared
Warning: in package testing, comp_requires dependency "ppx_metaquot" not declared
Warning: in package testing, comp_requires dependency "ppx_metaquot" not declared
Warning: in package testing, comp_requires dependency "ppx_metaquot" not declared
Warning: in package testing, comp_requires dependency "ppx_metaquot" not declared
Warning: missing package "learnocaml-app-common":
  Disabling package "learnocaml-main".
    (from "/home/caml/git/learn-ocaml/src/app/build.ocp")
Warning: missing package "ocplib-json-typed.browser":
  Disabling package "learnocaml-grader-worker".
    (from "/home/caml/git/learn-ocaml/src/grader/build.ocp")
Warning: missing package "learnocaml-app-common":
  Disabling package "learnocaml-exercise".
    (from "/home/caml/git/learn-ocaml/src/app/build.ocp")
Warning: missing package "grading-jsoo":
  Disabling package "learnocaml-exercise".
    (from "/home/caml/git/learn-ocaml/src/app/build.ocp")
Warning: missing package "ocplib-json-typed.browser":
  Disabling package "learnocaml-app-common".
    (from "/home/caml/git/learn-ocaml/src/app/build.ocp")
Warning: missing package "ocplib-json-typed.browser":
  Disabling package "grading-jsoo".
    (from "/home/caml/git/learn-ocaml/src/grader/build.ocp")
0.00s _obuild/toploop_results/toploop_results.mlimods                                           [ done ]
0.00s _obuild/ty/ty.mlimods                                                                     [ done ]
0.01s _obuild/toploop_results/toploop_results.cmi                                               [ done ]
0.01s _obuild/toploop_results/toploop_results.mlmods                                            [ done ]
0.01s _obuild/ty/ty.cmi                                                                         [ done ]
0.03s _obuild/toploop/_temp/toploop_ext.mlipp                                                   [ done ]
0.00s _obuild/toploop/toploop_ext.mlimods                                                       [ done ]
0.02s _obuild/toploop_results/toploop_results.cmo                                               [ done ]
0.02s _obuild/ty/ty.mlmods                                                                      [ done ]
0.00s _obuild/toploop_results/toploop_results.cma                                               [ done ]
0.00s _obuild/ppx_metaquot/ppx_metaquot_main.mlmods                                             [ done ]
0.03s _obuild/ppx_metaquot_lib/ppx_metaquot.mlmods                                              [ done ]
0.02s _obuild/toploop/toploop_ext.cmi                                                           [ done ]
0.02s _obuild/ty/ty.cmo                                                                         [ done ]
0.00s _obuild/ty/ty.cma                                                                         [ done ]
0.01s _obuild/toploop_unix/toploop_unix.mlimods                                                 [ done ]
0.01s src/grader/embedded_cmis.ml                                                               [ done ]
0.02s _obuild/genlifter/genlifter.mlmods                                                        [ done ]
0.01s _obuild/toploop_unix/toploop_unix.mlmods                                                  [ done ]
0.01s _obuild/toploop_unix/toploop_unix.cmi                                                     [ done ]
0.09s _obuild/toploop/_temp/toploop_ext.mlpp                                                    [ done ]
0.03s _obuild/embedded_cmis/embedded_cmis.mlmods                                                [ done ]
0.01s _obuild/toploop/toploop_ext.mlmods                                                        [ done ]
0.03s _obuild/toploop_unix/toploop_unix.cmo                                                     [ done ]
0.00s _obuild/toploop_unix/toploop_unix.cma                                                     [ done ]
0.03s _obuild/embedded_cmis/embedded_cmis.cmo                                                   [ done ]
0.07s _obuild/genlifter/genlifter.cmo                                                           [ done ]
0.00s _obuild/embedded_cmis/embedded_cmis.cma                                                   [ done ]
0.00s _obuild/xor/xor.mlimods                                                                   [ done ]
0.01s _obuild/xor/xor.cmi                                                                       [ done ]
0.00s _obuild/xor/xor.mlmods                                                                    [ done ]
0.05s _obuild/learnocaml-toplevel-history/_temp/learnocaml_toplevel_history.mlipp               [ done ]
0.00s _obuild/learnocaml-toplevel-history/learnocaml_toplevel_history.mlimods                   [ done ]
0.10s _obuild/learnocaml-toplevel-history/_temp/learnocaml_toplevel_history.mlpp                [ done ]
0.04s _obuild/genlifter/genlifter.byte                                                          [ done ]
0.01s _obuild/learnocaml-toplevel-history/learnocaml_toplevel_history.mlmods                    [ done ]
0.01s _obuild/learnocaml-toplevel-history/learnocaml_toplevel_history.cmi                       [ done ]
0.03s _obuild/xor/xor.cmo                                                                       [ done ]
0.01s _obuild/xor/xor.cma                                                                       [ done ]
0.10s _obuild/toploop/toploop_ext.cmo                                                           [ done ]
0.02s _obuild/learnocaml-toplevel-history/learnocaml_toplevel_history.cmo                       [ done ]
0.01s _obuild/toploop/toploop.cma                                                               [ done ]
0.01s _obuild/learnocaml-toplevel-history/learnocaml-toplevel-history.cma                       [ done ]
0.02s _obuild/learnocaml-repository/learnocaml_index.mlimods                                    [ done ]
0.01s _obuild/learnocaml-repository/learnocaml_index.mlmods                                     [ done ]
0.04s _obuild/xor/xor.cmx                                                                       [ done ]
0.01s _obuild/learnocaml-repository/learnocaml_lesson.mlimods                                   [ done ]
0.01s _obuild/learnocaml-repository/learnocaml_index.cmi                                        [ done ]
0.01s _obuild/learnocaml-repository/learnocaml_lesson.mlmods                                    [ done ]
0.01s _obuild/learnocaml-repository/learnocaml_lesson.cmi                                       [ done ]
0.01s _obuild/learnocaml-repository/learnocaml_tutorial.mlimods                                 [ done ]
0.02s _obuild/xor/xor.cmxa                                                                      [ done ]
0.01s _obuild/learnocaml-repository/learnocaml_tutorial.cmi                                     [ done ]
0.02s _obuild/learnocaml-repository/learnocaml_lesson.cmo                                       [ done ]
0.01s _obuild/learnocaml-repository/learnocaml_tutorial.mlmods                                  [ done ]
0.01s _obuild/learnocaml-repository/learnocaml_exercise.mlimods                                 [ done ]
0.09s src/ppx-metaquot/ast_lifter.ml                                                            [ done ]
0.04s _obuild/learnocaml-repository/learnocaml_index.cmo                                        [ done ]
0.02s _obuild/learnocaml-repository/learnocaml_tutorial.cmo                                     [ done ]
0.02s _obuild/learnocaml-repository/learnocaml_exercise.cmi                                     [ done ]
0.01s _obuild/learnocaml-repository/learnocaml_exercise.mlmods                                  [ done ]
0.01s _obuild/learnocaml-state/learnocaml_report.mlimods                                        [ done ]
0.01s _obuild/learnocaml-state/learnocaml_report.mlmods                                         [ done ]
0.02s _obuild/ppx_metaquot_lib/ast_lifter.mlmods                                                [ done ]
0.01s _obuild/learnocaml-state/learnocaml_exercise_state.mlimods                                [ done ]
0.02s _obuild/learnocaml-state/learnocaml_report.cmi                                            [ done ]
0.07s _obuild/xor/xor.cmxa                                                                      [ done ]
0.02s _obuild/learnocaml-state/learnocaml_exercise_state.mlmods                                 [ done ]
0.04s _obuild/learnocaml-repository/learnocaml_exercise.cmo                                     [ done ]
0.01s _obuild/learnocaml-state/learnocaml_exercise_state.cmi                                    [ done ]
0.01s _obuild/learnocaml-sync/learnocaml_sync.mlimods                                           [ done ]
0.01s _obuild/learnocaml-repository/learnocaml-repository.cma                                   [ done ]
0.00s _obuild/learnocaml-sync/learnocaml_sync.mlmods                                            [ done ]
0.02s _obuild/learnocaml-state/learnocaml_exercise_state.cmo                                    [ done ]
0.02s _obuild/learnocaml-sync/learnocaml_sync.cmi                                               [ done ]
0.02s _obuild/testing/introspection_intf.mlimods                                                [ done ]
0.01s _obuild/testing/introspection.mlimods                                                     [ done ]
0.02s _obuild/learnocaml-sync/learnocaml_sync.cmo                                               [ done ]
0.01s _obuild/testing/test_lib.mlimods                                                          [ done ]
0.01s _obuild/learnocaml-sync/learnocaml-sync.cma                                               [ done ]
0.02s _obuild/testing/introspection.mlmods                                                      [ done ]
0.07s _obuild/learnocaml-state/learnocaml_report.cmo                                            [ done ]
0.01s _obuild/grading/grading.mlimods                                                           [ done ]
0.01s _obuild/learnocaml-state/learnocaml-state.cma                                             [ done ]
0.02s _obuild/grading/grading.mlmods                                                            [ done ]
0.03s _obuild/testing/test_lib.mlmods                                                           [ done ]
0.14s _obuild/ppx_metaquot_lib/ast_lifter.cmo                                                   [ done ]
0.03s _obuild/jsutils/_temp/lwt_request.mlipp                                                   [ done ]
0.06s _obuild/jsutils/_temp/lwt_request.mlpp                                                    [ done ]
0.02s _obuild/jsutils/lwt_request.mlimods                                                       [ done ]
0.02s _obuild/jsutils/lwt_request.cmi                                                           [ done ]
0.02s _obuild/jsutils/lwt_request.mlmods                                                        [ done ]
0.09s _obuild/ppx_metaquot_lib/ppx_metaquot.cmo                                                 [ done ]
0.02s _obuild/ace/ace_types.mlimods                                                             [ done ]
0.01s _obuild/ppx_metaquot_lib/ppx_metaquot_lib.cma                                             [ done ]
0.16s _obuild/jsutils/_temp/js_utils.mlipp                                                      [ done ]
0.01s _obuild/jsutils/js_utils.mlimods                                                          [ done ]
0.22s _obuild/ace/_temp/ace.mlpp                                                                [ done ]
0.25s _obuild/ace/ace_types.cmi                                                                 [ done ]
0.01s _obuild/ace/ace.mlmods                                                                    [ done ]
0.10s _obuild/ace/_temp/ace.mlipp                                                               [ done ]
0.01s _obuild/ace/ace.mlimods                                                                   [ done ]
0.34s _obuild/jsutils/js_utils.cmi                                                              [ done ]
0.15s _obuild/ace/_temp/ocaml_mode.mlpp                                                         [ done ]
0.09s _obuild/jsutils/lwt_request.cmo                                                           [ done ]
0.05s _obuild/ace/_temp/ocaml_mode.mlipp                                                        [ done ]
0.02s _obuild/ace/ocaml_mode.mlmods                                                             [ done ]
0.01s _obuild/ace/ocaml_mode.mlimods                                                            [ done ]
0.02s _obuild/learnocaml-toplevel/learnocaml_toplevel_worker_messages.mlimods                   [ done ]
0.65s _obuild/jsutils/_temp/js_utils.mlpp                                                       [ done ]
0.03s _obuild/learnocaml-toplevel/learnocaml_toplevel_worker_messages.cmi                       [ done ]
0.21s _obuild/ace/ace.cmi                                                                       [ done ]
0.05s _obuild/learnocaml-toplevel/_temp/learnocaml_toplevel_worker_caller.mlipp                 [ done ]
0.08s _obuild/jsutils/js_utils.mlmods                                                           [ done ]
0.11s _obuild/learnocaml-toplevel/_temp/learnocaml_toplevel_worker_caller.mlpp                  [ done ]
0.01s _obuild/learnocaml-toplevel/learnocaml_toplevel_worker_caller.mlimods                     [ done ]
0.01s _obuild/learnocaml-toplevel/learnocaml_toplevel_worker_caller.cmi                         [ done ]
0.02s _obuild/learnocaml-toplevel/learnocaml_toplevel_worker_caller.mlmods                      [ done ]
0.17s _obuild/ace/ocaml_mode.cmi                                                                [ done ]
0.85s _obuild/ppx_metaquot_lib/ast_lifter.cmx                                                   [ done ]
0.24s _obuild/learnocaml-toplevel/learnocaml_toplevel_worker_caller.cmo                         [ done ]
0.14s _obuild/ppx_metaquot_lib/ppx_metaquot.cmx                                                 [ done ]
0.02s _obuild/ppx_metaquot_lib/ppx_metaquot_lib.cmxa                                            [ done ]
0.06s _obuild/ppx_metaquot_lib/ppx_metaquot_lib.cmxa                                            [ done ]
0.24s _obuild/ace/ocaml_mode.cmo                                                                [ done ]
0.02s _obuild/ppx_metaquot/ppx_metaquot_main.cmx                                                [ done ]
0.16s _obuild/learnocaml-toplevel/_temp/learnocaml_toplevel_output.mlpp                         [ done ]
0.04s _obuild/learnocaml-toplevel/_temp/learnocaml_toplevel_output.mlipp                        [ done ]
0.47s _obuild/ace/ace.cmo                                                                       [ done ]
0.01s _obuild/learnocaml-toplevel/learnocaml_toplevel_output.mlimods                            [ done ]
0.01s _obuild/learnocaml-toplevel/learnocaml_toplevel_output.mlmods                             [ done ]
0.01s _obuild/ace/ace.cma                                                                       [ done ]
0.06s _obuild/learnocaml-toplevel/_temp/learnocaml_toplevel_input.mlipp                         [ done ]
0.02s _obuild/learnocaml-toplevel/learnocaml_toplevel_input.mlimods                             [ done ]
0.10s _obuild/learnocaml-toplevel/learnocaml_toplevel_output.cmi                                [ done ]
0.12s _obuild/learnocaml-toplevel/_temp/learnocaml_toplevel_input.mlpp                          [ done ]
0.01s _obuild/learnocaml-toplevel/learnocaml_toplevel_input.mlmods                              [ done ]
0.11s _obuild/learnocaml-toplevel/learnocaml_toplevel_input.cmi                                 [ done ]
0.20s _obuild/learnocaml-toplevel/_temp/learnocaml_toplevel.mlpp                                [ done ]
0.10s _obuild/learnocaml-toplevel/_temp/learnocaml_toplevel.mlipp                               [ done ]
0.02s _obuild/learnocaml-toplevel/learnocaml_toplevel.mlimods                                   [ done ]
0.58s _obuild/ppx_metaquot/ppx_metaquot.asm                                                     [ done ]
0.02s _obuild/testing/introspection_intf.cmi                                                    [ done ]
0.05s _obuild/testing/introspection.cmi                                                         [ done ]
0.20s _obuild/learnocaml-toplevel/learnocaml_toplevel.cmi                                       [ done ]
0.63s _obuild/learnocaml-toplevel/learnocaml_toplevel_output.cmo                                [ done ]
0.16s _obuild/testing/introspection.cmo                                                         [ done ]
0.02s _obuild/grading/grading.cmi                                                               [ done ]
0.10s _obuild/testing/test_lib.cmi                                                              [ done ]
0.01s _obuild/learnocaml-toplevel/learnocaml_toplevel.mlmods                                    [ done ]
0.01s src/grader/embedded_grading_cmis.ml                                                       [ done ]
0.03s _obuild/grading/embedded_grading_cmis.mlmods                                              [ done ]
0.06s _obuild/grading/grading.cmo                                                               [ done ]
0.03s _obuild/grading/embedded_grading_cmis.cmo                                                 [ done ]
0.01s _obuild/grading/grading.cma                                                               [ done ]
0.15s _obuild/toploop_jsoo/_temp/toploop_jsoo.mlpp                                              [ done ]
0.85s _obuild/learnocaml-toplevel/learnocaml_toplevel_input.cmo                                 [ done ]
0.06s _obuild/toploop_jsoo/_temp/toploop_jsoo.mlipp                                             [ done ]
0.01s _obuild/toploop_jsoo/toploop_jsoo.mlmods                                                  [ done ]
0.01s _obuild/learnocaml-toplevel-worker/learnocaml_toplevel_worker_messages.mlimods            [ done ]
0.02s _obuild/toploop_jsoo/toploop_jsoo.mlimods                                                 [ done ]
0.02s _obuild/toploop_jsoo/toploop_jsoo.cmi                                                     [ done ]
0.04s _obuild/learnocaml-toplevel-worker/learnocaml_toplevel_worker_messages.cmi                [ done ]
0.07s _obuild/toploop_jsoo/toploop_jsoo.cmo                                                     [ done ]
0.40s _obuild/testing/test_lib.cmo                                                              [ done ]
0.00s _obuild/testing/testing.cma                                                               [ done ]
0.02s _obuild/toploop_jsoo/toploop_jsoo.cma                                                     [ done ]
0.02s _obuild/grading-cli/grading_cli.mlimods                                                   [ done ]
0.02s _obuild/learnocaml-toplevel-worker/_temp/learnocaml_toplevel_worker_main.mlipp            [ done ]
0.01s _obuild/grading-cli/grading_cli.cmi                                                       [ done ]
0.01s _obuild/grading-cli/grading_cli.mlmods                                                    [ done ]
0.11s _obuild/learnocaml-toplevel-worker/_temp/learnocaml_toplevel_worker_main.mlpp             [ done ]
0.01s _obuild/learnocaml-toplevel-worker/learnocaml_toplevel_worker_main.mlmods                 [ done ]
0.03s _obuild/learnocaml-toplevel-worker/learnocaml_toplevel_worker_main.mlimods                [ done ]
0.01s _obuild/learnocaml-toplevel-worker/learnocaml_toplevel_worker_main.cmi                    [ done ]
0.02s _obuild/grading-cli/grader_cli.mlmods                                                     [ done ]
0.03s _obuild/grading-cli/grading_cli.cmo                                                       [ done ]
0.01s _obuild/learnocaml-grader/grader_cli_main.mlmods                                          [ done ]
0.01s _obuild/learnocaml-process-repository/learnocaml_process_exercise_repository.mlmods       [ done ]
0.01s _obuild/learnocaml-process-repository/learnocaml_tutorial_parser.mlimods                  [ done ]
0.01s _obuild/learnocaml-process-repository/learnocaml_tutorial_parser.cmi                      [ done ]
0.48s _obuild/learnocaml-toplevel/learnocaml_toplevel.cmo                                       [ done ]
0.06s _obuild/grading-cli/grader_cli.cmo                                                        [ done ]
0.01s _obuild/learnocaml-toplevel/learnocaml-toplevel.cma                                       [ done ]
0.01s _obuild/grading-cli/grading-cli.cma                                                       [ done ]
0.02s _obuild/learnocaml-process-repository/learnocaml_tutorial_parser.mlmods                   [ done ]
0.01s _obuild/learnocaml-grader/grader_cli_main.cmo                                             [ done ]
0.09s _obuild/learnocaml-toplevel-worker/learnocaml_toplevel_worker_main.cmo                    [ done ]
0.03s _obuild/learnocaml-process-repository/learnocaml_process_tutorial_repository.mlmods       [ done ]
0.08s _obuild/learnocaml-process-repository/learnocaml_process_exercise_repository.cmo          [ done ]
0.01s _obuild/learnocaml-process-repository/learnocaml_process_repository_main.mlmods           [ done ]
0.09s _obuild/learnocaml-grader/learnocaml-grader.byte                                          [ done ]
0.01s _obuild/learnocaml-tutorial-reader/learnocaml_tutorial_parser.mlimods                     [ done ]
0.06s _obuild/learnocaml-process-repository/learnocaml_process_tutorial_repository.cmo          [ done ]
0.02s _obuild/learnocaml-tutorial-reader/learnocaml_tutorial_parser.mlmods                      [ done ]
0.02s _obuild/learnocaml-tutorial-reader/learnocaml_tutorial_parser.cmi                         [ done ]
0.01s _obuild/learnocaml-tutorial-reader/learnocaml_tutorial_reader_main.mlmods                 [ done ]
0.13s _obuild/learnocaml-process-repository/learnocaml_tutorial_parser.cmo                      [ done ]
0.04s _obuild/learnocaml-process-repository/learnocaml_process_repository_main.cmo              [ done ]
0.02s _obuild/learnocaml-simple-server/learnocaml_simple_server.mlmods                          [ done ]
0.04s _obuild/learnocaml-tutorial-reader/learnocaml_tutorial_reader_main.cmo                    [ done ]
0.08s _obuild/learnocaml-simple-server/learnocaml_simple_server.cmo                             [ done ]
0.10s _obuild/learnocaml-process-repository/learnocaml-process-repository.byte                  [ done ]
0.13s _obuild/learnocaml-tutorial-reader/learnocaml_tutorial_parser.cmo                         [ done ]
0.04s _obuild/learnocaml-simple-server/learnocaml-simple-server.byte                            [ done ]
0.08s _obuild/learnocaml-tutorial-reader/learnocaml-tutorial-reader.byte                        [ done ]
2.66s _obuild/jsutils/js_utils.cmo                                                              [ done ]
0.00s _obuild/jsutils/jsutils.cma                                                               [ done ]
0.05s _obuild/learnocaml-toplevel-worker/learnocaml-toplevel-worker.byte                        [ done ]
18.88s _obuild/learnocaml-toplevel-worker/learnocaml-toplevel-worker.js                          [ done ]
-- stderr for ...-worker/learnocaml-toplevel-worker.js --
warning: overriding primitive "caml_ephe_key_offset"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:25
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:25
warning: overriding primitive "caml_ephe_data_offset"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:29
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:29
warning: overriding primitive "caml_weak_create"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:33
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:33
warning: overriding primitive "caml_weak_set"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:41
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:41
warning: overriding primitive "caml_weak_get"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:49
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:49
warning: overriding primitive "caml_weak_get_copy"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:56
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:56
warning: overriding primitive "caml_weak_check"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:68
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:68
warning: overriding primitive "caml_weak_blit"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:77
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:77
warning: overriding primitive "caml_ephe_create"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:88
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:88
warning: overriding primitive "caml_ephe_blit_key"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:92
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:92
warning: overriding primitive "caml_ephe_get_key"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:96
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:96
warning: overriding primitive "caml_ephe_get_key_copy"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:100
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:100
warning: overriding primitive "caml_ephe_check_key"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:104
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:104
warning: overriding primitive "caml_ephe_set_key"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:108
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:108
warning: overriding primitive "caml_ephe_unset_key"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:114
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:114
warning: overriding primitive "caml_ephe_blit_data"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:120
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:120
warning: overriding primitive "caml_ephe_get_data"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:128
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:128
warning: overriding primitive "caml_ephe_get_data_copy"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:138
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:138
warning: overriding primitive "caml_ephe_set_data"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:149
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:149
warning: overriding primitive "caml_ephe_unset_data"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:157
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:157
warning: overriding primitive "caml_ephe_check_data"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:165
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:165
There are some missing primitives
Dummy implementations (raising 'Failure' exception) will be used if they are not available at runtime.
You can prevent the generation of dummy implementations with the commandline option '--disable genprim'
Missing primitives:
  caml_sys_time_include_children
Build Successful in 22.92s. 210 jobs (parallelism 1.5x), 237 files generated.
make[1]: Entering directory '/home/caml/git/learn-ocaml/static'
sed "s/#000000/#000/g" icon_upload_src.svg > icon_upload_black.svg
sed "s/#000000/#000/g" icon_run_src.svg > icon_run_black.svg
sed "s/#000000/#000/g" icon_typecheck_src.svg > icon_typecheck_black.svg
sed "s/#000000/#000/g" icon_reload_src.svg > icon_reload_black.svg
sed "s/#000000/#000/g" icon_sync_src.svg > icon_sync_black.svg
sed "s/#000000/#000/g" icon_left_src.svg > icon_left_black.svg
sed "s/#000000/#000/g" icon_cleanup_src.svg > icon_cleanup_black.svg
sed "s/#000000/#000/g" icon_save_src.svg > icon_save_black.svg
sed "s/#000000/#000/g" icon_right_src.svg > icon_right_black.svg
sed "s/#000000/#000/g" icon_list_src.svg > icon_list_black.svg
sed "s/#000000/#000/g" icon_down_src.svg > icon_down_black.svg
sed "s/#000000/#000/g" icon_menu_src.svg > icon_menu_black.svg
sed "s/#000000/#000/g" icon_download_src.svg > icon_download_black.svg
sed "s/#000000/#000/g" icon_up_src.svg > icon_up_black.svg
sed "s/#000000/#FFF/g" icon_upload_src.svg > icon_upload_white.svg
sed "s/#000000/#FFF/g" icon_run_src.svg > icon_run_white.svg
sed "s/#000000/#FFF/g" icon_typecheck_src.svg > icon_typecheck_white.svg
sed "s/#000000/#FFF/g" icon_reload_src.svg > icon_reload_white.svg
sed "s/#000000/#FFF/g" icon_sync_src.svg > icon_sync_white.svg
sed "s/#000000/#FFF/g" icon_left_src.svg > icon_left_white.svg
sed "s/#000000/#FFF/g" icon_cleanup_src.svg > icon_cleanup_white.svg
sed "s/#000000/#FFF/g" icon_save_src.svg > icon_save_white.svg
sed "s/#000000/#FFF/g" icon_right_src.svg > icon_right_white.svg
sed "s/#000000/#FFF/g" icon_list_src.svg > icon_list_white.svg
sed "s/#000000/#FFF/g" icon_down_src.svg > icon_down_white.svg
sed "s/#000000/#FFF/g" icon_menu_src.svg > icon_menu_white.svg
sed "s/#000000/#FFF/g" icon_download_src.svg > icon_download_white.svg
sed "s/#000000/#FFF/g" icon_up_src.svg > icon_up_white.svg
sed "s/#000000/#222/g" icon_upload_src.svg > icon_upload_dark.svg
sed "s/#000000/#222/g" icon_run_src.svg > icon_run_dark.svg
sed "s/#000000/#222/g" icon_typecheck_src.svg > icon_typecheck_dark.svg
sed "s/#000000/#222/g" icon_reload_src.svg > icon_reload_dark.svg
sed "s/#000000/#222/g" icon_sync_src.svg > icon_sync_dark.svg
sed "s/#000000/#222/g" icon_left_src.svg > icon_left_dark.svg
sed "s/#000000/#222/g" icon_cleanup_src.svg > icon_cleanup_dark.svg
sed "s/#000000/#222/g" icon_save_src.svg > icon_save_dark.svg
sed "s/#000000/#222/g" icon_right_src.svg > icon_right_dark.svg
sed "s/#000000/#222/g" icon_list_src.svg > icon_list_dark.svg
sed "s/#000000/#222/g" icon_down_src.svg > icon_down_dark.svg
sed "s/#000000/#222/g" icon_menu_src.svg > icon_menu_dark.svg
sed "s/#000000/#222/g" icon_download_src.svg > icon_download_dark.svg
sed "s/#000000/#222/g" icon_up_src.svg > icon_up_dark.svg
sed "s/#000000/#EEE/g" icon_upload_src.svg > icon_upload_light.svg
sed "s/#000000/#EEE/g" icon_run_src.svg > icon_run_light.svg
sed "s/#000000/#EEE/g" icon_typecheck_src.svg > icon_typecheck_light.svg
sed "s/#000000/#EEE/g" icon_reload_src.svg > icon_reload_light.svg
sed "s/#000000/#EEE/g" icon_sync_src.svg > icon_sync_light.svg
sed "s/#000000/#EEE/g" icon_left_src.svg > icon_left_light.svg
sed "s/#000000/#EEE/g" icon_cleanup_src.svg > icon_cleanup_light.svg
sed "s/#000000/#EEE/g" icon_save_src.svg > icon_save_light.svg
sed "s/#000000/#EEE/g" icon_right_src.svg > icon_right_light.svg
sed "s/#000000/#EEE/g" icon_list_src.svg > icon_list_light.svg
sed "s/#000000/#EEE/g" icon_down_src.svg > icon_down_light.svg
sed "s/#000000/#EEE/g" icon_menu_src.svg > icon_menu_light.svg
sed "s/#000000/#EEE/g" icon_download_src.svg > icon_download_light.svg
sed "s/#000000/#EEE/g" icon_up_src.svg > icon_up_light.svg
make[1]: Leaving directory '/home/caml/git/learn-ocaml/static'
cp static/* /home/caml/git/learn-ocaml/www
cp /home/caml/git/learn-ocaml/demo-repository/lessons/* /home/caml/git/learn-ocaml/www
cp: cannot stat '_obuild/*/learnocaml-main.js': No such file or directory
Makefile:24: recipe for target 'build' failed
make: *** [build] Error 1
~/git/learn-ocaml$ ls _obuild/*/*.js
_obuild/learnocaml-toplevel-worker/learnocaml-toplevel-worker.js

~/git/learn-ocaml$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="16.04.4 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.4 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

Can you reproduce this error?

I'm not 100% sure but it seems to be due to the recent update of the ocplib-json-typed.browser dependency… (according to the warnings above).

Kind regards, Erik

Question: how can we do `ocamlc -i solution.ml` in js_of_ocaml?

Dear learn-ocaml developers,

During our work on learn-ocaml-editor, we are currently implementing a feature that generate a set of test cases (to basically scaffold test.ml from the specified solution.ml), and we are facing with the following question:

Is there an easy way to get the list of all types of all functions from some OCaml code stored in a string? Basically an equivalent of ocamlc -i solution.ml would be very OK, but we are unsure how to do it properly in jsoo...

Generating exercises PDF

It would be nice to have an option (learn-ocaml --pdf ?) which takes a list of exercise repertories and concatenate titles and [descr.html] or [descr.md] contents to generate a pdf. It can probably be easily done using Pandoc for example. I did not find the time to do it, so ... good luck !

Grade incomplete solutions?

I’m writing a program intended to check the validity of the tests proposed by the teachers.

The idea is to have them write several “essays”, that are more or less correct copies of students inside an essay directory inside each exercise directories. Each essay will be associated to the grade the teacher expects a student to have for this essay.
Then, the program would grade them to see if the expected grade matches the generated one. The goal is to detect errors in the test function or in the solution.

I’m using the grade functionality of the learn-ocaml command. Sadly, I didn’t find a way to fetch the score obtained by a graded essay (with --grade-student). For example, if I use learn-ocaml grade --display-progression in the exercise directory, I get full points as the solution is tested, which is correct. That also gets printed on the screen. Same if I grade a correct solution. But if I grade an incorrect solution, I only get “Failure” and no more informations, even though some answers are correct. The generated grade misses, so I can’t check it against the defined one.

To put it in a nutshell, I think it would be interesting to give the grade obtained when using grade from the command line instead of just outputting “Failure”.

Typos error in Ty.ty

I was writing an exercise without copy/paste today (!) and I inadvertently wrote :

let exercise_1 =
  Section (
      [ Text "Variable: "; Code "n"],
      test_variable [%ty float] "n" 10 )

There are actually 2 mistakes in this exercise but a learn-ocaml command with as many options as possible (--display-outcomes etc...) gives me:

Updating app at ./www
references (no changes)

(The previous extract code comes from a variables/test.ml file and I have two exercises: variables and references)

So : no error message, nothing about variables and no server launch....

The error causing this is that I forgot the colon in [%ty: float] ...
(After correction, I finally have the right error message for my second mistakes : 10 is not a float....)

Will it be possible to have nice error messages for this kind of stupid typos in Ty.ty ?

Sort students using a lexical order on nicknames

With several hundreds of students, it could be nice to have this sorting by default : in Paris Diderot, they ask the students to use a nickname starting with their group number. That way, students of the same group will appear alongside each other.

Add support for Markdown in exercises

Hey,

It would be great if we could write exercise descriptions directly in Markdown. This is usually much easier to write, read and correct than HTML. Moreover, because it's much more limited than HTML, it forces exercises to look the same.

I don't think it is hard to add to the project, especially considering that it is already implemented in learnocaml_tutorial_parser.ml. Here is a PR that tries to implement this feature if you are interested: #135.

Cheers,

Order of groups and exercises not kept at processing

(I open this issue for tracking purpose, and possible discussion. It has been orginally reported by @lyrm )

The order defined in a index.json is not kept when processing the repository. This is due to how exercises are represented internaly:

  • a group contains a Map.t of groups or exercises
  • an exercises list contains a Map.t of exercises
    These maps are ordered by name, which obviously will not preserve the original order.

I plan to fix it in #64.

Suggestion (enable Travis CI) & Fix (required version of OCaml)

Hi,

Would you have an objection to enabling continuous integration using Travis CI? The repo already contains a .travis.yml file, so I guess it would suffice to enable the GitHub/Travis-CI integration… (BTW since a few days, the URL of Travis' plaform for open source projects is now travis-ci.com instead of travis-ci.org…)

Unrelated remark: since be0e079, shouldn't the line

Note: you need a working opam environment with OCaml 4.03.0.

in the README.md be replaced with

Note: you need a working opam environment with OCaml 4.05.0.

? (Compiling with 4.03.0 raises the error learn-ocaml-deps is not available because your system doesn't comply with ocaml-version >= "4.05.0".)

Kind regards, Erik

Test test functions with wrong solutions

When I define an exercise with some particular conditions for success, I’m not sure that my test functions correspond to what I want to do. For example, I have an exercise asking to sort a list in linear time. To be sure that my measurement is correct, I want to define and grade several answers for which I know what is false.

I think of it this way:
You add files wrong_solution_{1..n}.ml to the exercise. They are different versions of solution.ml, with a few mistakes. In our example, a function that is not linear in time. When building or grading, their essays (the wrong_solutions) are graded. They should not get full points. Otherwise, an error is diplayed. There can also be an optional file wrong_solutions.expected_points with some syntax describing the points awaited for the essays (or a range).

This suggestion is a follow-up of #58 .
I’m opening it as an issue on Learn-OCaml because I think the automatic grading of wrong solutions should be integrated in the grader and/or build and activated in case there are files named wrong_solution_{1..n}.

Student page

Create a page per student :

  • to observe student's progress in the exercises ;
  • to allow exercise to be assigned specifically to that student ;
  • to evaluate the skills he masters and the skills he has to work on.

Deleting accidental duplicate tokens

It's easy for users to accidentally create duplicate tokens with the same nickname when logging in on different machines instead of reusing the same token to log in. The students then need to request for us to manually delete the extra tokens by removing them from the /sync folder, so that we can associate only the intended token with them when calculating their grades.

Would it be possible to have some better way of dealing with this, maybe allowing users to delete their own tokens, adding token deletion to the teacher activity, and/or having the option of giving a warning when a user tries to register a new token with a nickname that's already in use?

Feature request: basic authentication at exercise level

Dear learn-ocaml developers,

I'd like to suggest implementing some feature to ease the following use case:

  • undergraduate students use (the same instance of) a learn-ocaml server during the lab sessions
  • they have to work on a given learn-ocaml exercise (the main exercise of the week)
  • all students are separated in several groups (viz., with at least 5 different schedules during the week)
  • we'd like they can access this exercise only starting from the time slot of their own lab session
  • indeed even if the exercise is not formally graded, we would like to put all the students all on an equal footing, despite the different schedules.

Obviously a complex feature of «student individual authentication» combined with a «list of authorized exercises by student group» would address this... but maybe a simpler solution such as a basic authentication feature would suffice and be worth it to implement?

In particular I was wondering whether one could add an optional token (corresponding e.g., to the hash of a password) to the metadata of an exercise so that on the JavaScript side, the learn-ocaml client asks a password to the student and compares its hash with the one specified in order to unlock the exercise…

What do you think?

learn-ocaml generates a javascript error

I know get the following error after building 73eace9

yann➜teaching/learn-ocaml/learn-ocaml(master)» learn-ocaml build --repo demo-repository                                                                                                                                                                                        [14:22:43]
Unimplemented Javascript primitive caml_pure_js_expr!

Requirements in terms of resources

Which server requirements (RAM, CPUs, etc) should be allocated to learn-ocaml instances? I guess it depends on the number of users interacting with the platform.

We probably need a basic performance monitoring subsystem to collect information and to build solid answers to this question.

Mathjax error loading TeX font

Currently static/js/mathjax/fonts/HTML-CSS/TeX/* doesn't exist, so mathjax processing stalls until it finds a fallback font

Implementing Exercises : error file ?

Is there a way to test an exercises implementation (and especially the grader) without starting a server ? The error message are very imprecise (basically, it says FAILED).

Or is there a log file somewhere with proper error messages ?

Including images in exercises

As far as I can tell, there is no way of including our own static content (e.g. images) when deploying the server. We would like to include some example images in one of our exercise descriptions.

FTBFS - Error: Required module 'Condition' is unavailable

Dear learn-ocaml developers,

I tried to recompile learn-ocaml from scratch (on an Ubuntu LTS (16.04) environment) with OCaml 4.05.0:

  • the script install-opam-deps.sh worked smoothly
  • but make fails with Error: Required module 'Condition' is unavailable (cf. the output below).

Do you have an idea of the cause of this error?
Kind regards,
Erik

Warning: file "/home/caml/git/learn-ocaml/_obuild/ocp-build.root" does not exist. Creating with default values.
Compiler: ocaml 4.05.0
----- 12 env warnings -----
Warning: inexistent package directory:
  "/home/caml/.opam/4.05.0/lib/ocp-indent/dynlink"
  Disabling package "ocp-indent.dynlink".
    (from "/home/caml/.opam/4.05.0/lib/ocp-indent/META")
Warning: missing package "cohttp-async":
  Disabling package "cohttp.async".
    (from "/home/caml/.opam/4.05.0/lib/cohttp/META")
Warning: missing package "cohttp-lwt-jsoo":
  Disabling package "cohttp.js".
    (from "/home/caml/.opam/4.05.0/lib/cohttp/META")
Warning: missing package "cohttp-top":
  Disabling package "cohttp.top".
    (from "/home/caml/.opam/4.05.0/lib/cohttp/META")
Warning: missing package "cstruct-async":
  Disabling package "cstruct.async".
    (from "/home/caml/.opam/4.05.0/lib/cstruct/META")
Warning: missing package "cstruct-lwt":
  Disabling package "cstruct.lwt".
    (from "/home/caml/.opam/4.05.0/lib/cstruct/META")
Warning: missing package "cstruct-unix":
  Disabling package "cstruct.unix".
    (from "/home/caml/.opam/4.05.0/lib/cstruct/META")
Warning: missing package "js_of_ocaml-ppx_deriving_json":
  Disabling package "js_of_ocaml-ppx.deriving".
    (from "/home/caml/.opam/4.05.0/lib/js_of_ocaml-ppx/META")
Warning: missing package "js_of_ocaml-ocamlbuild":
  Disabling package "js_of_ocaml.ocamlbuild".
    (from "/home/caml/.opam/4.05.0/lib/js_of_ocaml/META")
Warning: missing package "ppx_deriving":
  Disabling package "ppx_fields_conv".
    (from "/home/caml/.opam/4.05.0/lib/ppx_fields_conv/META")
Warning: missing package "ppx_deriving":
  Disabling package "ppx_sexp_conv".
    (from "/home/caml/.opam/4.05.0/lib/ppx_sexp_conv/META")
Warning: missing package "ppx_deriving":
  Disabling package "ppx_type_conv".
    (from "/home/caml/.opam/4.05.0/lib/ppx_type_conv/META")
----- 8 project warnings -----
Warning: in package grading, comp_requires dependency "ppx_metaquot" not declared
Warning: in package grading, comp_requires dependency "ppx_metaquot" not declared
Warning: in package grading, comp_requires dependency "ppx_metaquot" not declared
Warning: in package testing, comp_requires dependency "ppx_metaquot" not declared
Warning: in package testing, comp_requires dependency "ppx_metaquot" not declared
Warning: in package testing, comp_requires dependency "ppx_metaquot" not declared
Warning: in package testing, comp_requires dependency "ppx_metaquot" not declared
Warning: in package testing, comp_requires dependency "ppx_metaquot" not declared
0.00s _obuild/ty/ty.mlimods                                            [ done ]
0.01s _obuild/toploop_results/toploop_results.mlmods                   [ done ]
0.01s _obuild/toploop_results/toploop_results.mlimods                  [ done ]
0.01s _obuild/ty/ty.mlmods                                             [ done ]
0.01s _obuild/ty/ty.cmi                                                [ done ]
0.01s _obuild/toploop_results/toploop_results.cmi                      [ done ]
0.01s _obuild/toploop_results/toploop_results.cmo                      [ done ]
0.00s _obuild/toploop_results/toploop_results.cma                      [ done ]
0.03s _obuild/toploop/_temp/toploop_ext.mlipp                          [ done ]
0.02s _obuild/ppx_metaquot_lib/ppx_metaquot.mlmods                     [ done ]
0.01s _obuild/ppx_metaquot/ppx_metaquot_main.mlmods                    [ done ]
0.02s _obuild/ty/ty.cmo                                                [ done ]
0.01s _obuild/toploop/toploop_ext.mlimods                              [ done ]
0.01s _obuild/genlifter/genlifter.mlmods                               [ done ]
0.01s src/grader/embedded_cmis.ml                                      [ done ]
0.01s _obuild/ty/ty.cma                                                [ done ]
0.01s _obuild/toploop/toploop_ext.cmi                                  [ done ]
0.01s _obuild/toploop_unix/toploop_unix.mlimods                        [ done ]
0.01s _obuild/toploop_unix/toploop_unix.mlmods                         [ done ]
0.03s _obuild/embedded_cmis/embedded_cmis.mlmods                       [ done ]
0.02s _obuild/toploop_unix/toploop_unix.cmi                            [ done ]
0.02s _obuild/toploop_unix/toploop_unix.cmo                            [ done ]
0.10s _obuild/toploop/_temp/toploop_ext.mlpp                           [ done ]
0.01s _obuild/toploop/toploop_ext.mlmods                               [ done ]
0.02s _obuild/toploop_unix/toploop_unix.cma                            [ done ]
0.04s _obuild/embedded_cmis/embedded_cmis.cmo                          [ done ]
0.01s _obuild/embedded_cmis/embedded_cmis.cma                          [ done ]
0.08s _obuild/genlifter/genlifter.cmo                                  [ done ]
0.01s _obuild/xor/xor.mlimods                                          [ done ]
0.03s _obuild/learnocaml-toplevel.../learnocaml_toplevel_history.mlipp [ done ]
0.08s _obuild/learnocaml-toplevel-.../learnocaml_toplevel_history.mlpp [ done ]
0.00s _obuild/learnocaml-toplev.../learnocaml_toplevel_history.mlimods [ done ]
0.01s _obuild/learnocaml-topleve.../learnocaml_toplevel_history.mlmods [ done ]
0.02s _obuild/xor/xor.cmi                                              [ done ]
0.01s _obuild/learnocaml-toplevel-h.../learnocaml_toplevel_history.cmi [ done ]
0.01s _obuild/learnocaml-repository/learnocaml_index.mlimods           [ done ]
0.01s _obuild/xor/xor.mlmods                                           [ done ]
0.05s _obuild/genlifter/genlifter.byte                                 [ done ]
0.02s _obuild/learnocaml-toplevel-h.../learnocaml_toplevel_history.cmo [ done ]
0.02s _obuild/learnocaml-repository/learnocaml_index.cmi               [ done ]
0.07s _obuild/toploop/toploop_ext.cmo                                  [ done ]
0.01s _obuild/learnocaml-toplevel-h.../learnocaml-toplevel-history.cma [ done ]
0.02s _obuild/xor/xor.cmo                                              [ done ]
0.01s _obuild/toploop/toploop.cma                                      [ done ]
0.01s _obuild/xor/xor.cma                                              [ done ]
0.01s _obuild/learnocaml-repository/learnocaml_index.mlmods            [ done ]
0.01s _obuild/learnocaml-repository/learnocaml_lesson.mlimods          [ done ]
0.01s _obuild/learnocaml-repository/learnocaml_lesson.mlmods           [ done ]
0.01s _obuild/learnocaml-repository/learnocaml_tutorial.mlimods        [ done ]
0.04s _obuild/xor/xor.cmx                                              [ done ]
0.02s _obuild/learnocaml-repository/learnocaml_lesson.cmi              [ done ]
0.03s _obuild/learnocaml-repository/learnocaml_index.cmo               [ done ]
0.01s _obuild/xor/xor.cmxa                                             [ done ]
0.02s _obuild/learnocaml-repository/learnocaml_tutorial.cmi            [ done ]
0.01s _obuild/learnocaml-repository/learnocaml_exercise.mlimods        [ done ]
0.02s _obuild/learnocaml-repository/learnocaml_lesson.cmo              [ done ]
0.02s _obuild/learnocaml-repository/learnocaml_tutorial.mlmods         [ done ]
0.01s _obuild/learnocaml-repository/learnocaml_exercise.cmi            [ done ]
0.01s _obuild/learnocaml-repository/learnocaml_exercise.mlmods         [ done ]
0.01s _obuild/learnocaml-state/learnocaml_report.mlimods               [ done ]
0.02s _obuild/learnocaml-repository/learnocaml_tutorial.cmo            [ done ]
0.01s _obuild/learnocaml-state/learnocaml_report.cmi                   [ done ]
0.01s _obuild/learnocaml-state/learnocaml_report.mlmods                [ done ]
0.10s src/ppx-metaquot/ast_lifter.ml                                   [ done ]
0.01s _obuild/learnocaml-state/learnocaml_exercise_state.mlimods       [ done ]
0.03s _obuild/learnocaml-repository/learnocaml_exercise.cmo            [ done ]
0.01s _obuild/learnocaml-state/learnocaml_exercise_state.cmi           [ done ]
0.02s _obuild/ppx_metaquot_lib/ast_lifter.mlmods                       [ done ]
0.01s _obuild/learnocaml-state/learnocaml_exercise_state.mlmods        [ done ]
0.08s _obuild/xor/xor.cmxa                                             [ done ]
0.03s _obuild/learnocaml-repository/learnocaml-repository.cma          [ done ]
0.01s _obuild/learnocaml-sync/learnocaml_sync.mlimods                  [ done ]
0.01s _obuild/learnocaml-sync/learnocaml_sync.mlmods                   [ done ]
0.01s _obuild/learnocaml-sync/learnocaml_sync.cmi                      [ done ]
0.02s _obuild/learnocaml-state/learnocaml_exercise_state.cmo           [ done ]
0.01s _obuild/grading-jsoo/grader_jsoo_messages.mlimods                [ done ]
0.06s _obuild/learnocaml-state/learnocaml_report.cmo                   [ done ]
0.01s _obuild/grading-jsoo/grader_jsoo_messages.mlmods                 [ done ]
0.01s _obuild/grading-jsoo/grader_jsoo_messages.cmi                    [ done ]
0.01s _obuild/learnocaml-state/learnocaml-state.cma                    [ done ]
0.02s _obuild/learnocaml-sync/learnocaml_sync.cmo                      [ done ]
0.01s _obuild/grading-jsoo/grader_jsoo_messages.cmo                    [ done ]
0.01s _obuild/learnocaml-sync/learnocaml-sync.cma                      [ done ]
0.01s _obuild/testing/introspection_intf.mlimods                       [ done ]
0.01s _obuild/testing/introspection.mlimods                            [ done ]
0.03s _obuild/grading-jsoo/_temp/grading_jsoo.mlipp                    [ done ]
0.01s _obuild/grading-jsoo/grading_jsoo.mlimods                        [ done ]
0.01s _obuild/testing/introspection.mlmods                             [ done ]
0.05s _obuild/grading-jsoo/_temp/grading_jsoo.mlpp                     [ done ]
0.02s _obuild/testing/test_lib.mlimods                                 [ done ]
0.01s _obuild/grading/grading.mlimods                                  [ done ]
0.01s _obuild/grading-jsoo/grading_jsoo.mlmods                         [ done ]
0.03s _obuild/grading-jsoo/grading_jsoo.cmi                            [ done ]
0.01s _obuild/grading/grading.mlmods                                   [ done ]
0.03s _obuild/testing/test_lib.mlmods                                  [ done ]
0.17s _obuild/ppx_metaquot_lib/ast_lifter.cmo                          [ done ]
0.07s _obuild/jsutils/_temp/lwt_request.mlpp                           [ done ]
0.16s _obuild/jsutils/_temp/js_utils.mlipp                             [ done ]
0.01s _obuild/jsutils/js_utils.mlimods                                 [ done ]
0.14s _obuild/ppx_metaquot_lib/ppx_metaquot.cmo                        [ done ]
0.02s _obuild/ppx_metaquot_lib/ppx_metaquot_lib.cma                    [ done ]
0.24s _obuild/grading-jsoo/grading_jsoo.cmo                            [ done ]
0.01s _obuild/grading-jsoo/grading-jsoo.cma                            [ done ]
0.01s _obuild/jsutils/lwt_request.mlmods                               [ done ]
0.04s _obuild/jsutils/_temp/lwt_request.mlipp                          [ done ]
0.00s _obuild/jsutils/lwt_request.mlimods                              [ done ]
0.01s _obuild/jsutils/lwt_request.cmi                                  [ done ]
0.03s _obuild/ace/ace_types.mlimods                                    [ done ]
0.17s _obuild/ace/_temp/ace.mlpp                                       [ done ]
0.19s _obuild/ace/ace_types.cmi                                        [ done ]
0.06s _obuild/ace/_temp/ace.mlipp                                      [ done ]
0.04s _obuild/ace/ace.mlmods                                           [ done ]
0.01s _obuild/ace/ace.mlimods                                          [ done ]
0.39s _obuild/jsutils/js_utils.cmi                                     [ done ]
0.62s _obuild/jsutils/_temp/js_utils.mlpp                              [ done ]
0.08s _obuild/jsutils/lwt_request.cmo                                  [ done ]
0.06s _obuild/jsutils/js_utils.mlmods                                  [ done ]
0.07s _obuild/ace/_temp/ocaml_mode.mlipp                               [ done ]
0.02s _obuild/ace/ocaml_mode.mlimods                                   [ done ]
0.21s _obuild/ace/_temp/ocaml_mode.mlpp                                [ done ]
0.01s _obuild/ace/ocaml_mode.mlmods                                    [ done ]
0.01s _obuild/learnocam.../learnocaml_toplevel_worker_messages.mlimods [ done ]
0.26s _obuild/ace/ace.cmi                                              [ done ]
0.06s _obuild/learnocaml-to.../learnocaml_toplevel_worker_messages.cmi [ done ]
0.75s _obuild/ppx_metaquot_lib/ast_lifter.cmx                          [ done ]
0.13s _obuild/learnocaml-top.../learnocaml_toplevel_worker_caller.mlpp [ done ]
0.08s _obuild/learnocaml-to.../learnocaml_toplevel_worker_caller.mlipp [ done ]
0.01s _obuild/learnocaml-.../learnocaml_toplevel_worker_caller.mlimods [ done ]
0.20s _obuild/ace/ocaml_mode.cmi                                       [ done ]
0.04s _obuild/learnocaml-topl.../learnocaml_toplevel_worker_caller.cmi [ done ]
0.01s _obuild/learnocaml-t.../learnocaml_toplevel_worker_caller.mlmods [ done ]
0.24s _obuild/ppx_metaquot_lib/ppx_metaquot.cmx                        [ done ]
0.02s _obuild/ppx_metaquot_lib/ppx_metaquot_lib.cmxa                   [ done ]
0.35s _obuild/ace/ace.cmo                                              [ done ]
0.02s _obuild/ppx_metaquot/ppx_metaquot_main.cmx                       [ done ]
0.13s _obuild/ppx_metaquot_lib/ppx_metaquot_lib.cmxa                   [ done ]
0.27s _obuild/ace/ocaml_mode.cmo                                       [ done ]
0.03s _obuild/ace/ace.cma                                              [ done ]
0.17s _obuild/learnocaml-toplevel/_.../learnocaml_toplevel_output.mlpp [ done ]
0.01s _obuild/learnocaml-toplevel/learnocaml_toplevel_output.mlmods    [ done ]
0.33s _obuild/learnocaml-topl.../learnocaml_toplevel_worker_caller.cmo [ done ]
0.07s _obuild/learnocaml-toplevel/.../learnocaml_toplevel_output.mlipp [ done ]
0.01s _obuild/learnocaml-toplevel/learnocaml_toplevel_output.mlimods   [ done ]
0.05s _obuild/learnocaml-toplevel/_.../learnocaml_toplevel_input.mlipp [ done ]
0.01s _obuild/learnocaml-toplevel/learnocaml_toplevel_input.mlimods    [ done ]
0.10s _obuild/learnocaml-toplevel/_temp/learnocaml_toplevel_input.mlpp [ done ]
0.01s _obuild/learnocaml-toplevel/learnocaml_toplevel_input.mlmods     [ done ]
0.09s _obuild/learnocaml-toplevel/learnocaml_toplevel_input.cmi        [ done ]
0.13s _obuild/learnocaml-toplevel/learnocaml_toplevel_output.cmi       [ done ]
0.21s _obuild/learnocaml-toplevel/_temp/learnocaml_toplevel.mlpp       [ done ]
0.05s _obuild/learnocaml-toplevel/_temp/learnocaml_toplevel.mlipp      [ done ]
0.01s _obuild/learnocaml-toplevel/learnocaml_toplevel.mlimods          [ done ]
0.16s _obuild/learnocaml-toplevel/learnocaml_toplevel.cmi              [ done ]
0.68s _obuild/ppx_metaquot/ppx_metaquot.asm                            [ done ]
0.01s _obuild/learnocaml-toplevel/learnocaml_toplevel.mlmods           [ done ]
0.02s _obuild/testing/introspection_intf.cmi                           [ done ]
0.04s _obuild/testing/introspection.cmi                                [ done ]
0.09s _obuild/testing/test_lib.cmi                                     [ done ]
0.13s _obuild/testing/introspection.cmo                                [ done ]
0.01s src/grader/embedded_grading_cmis.ml                              [ done ]
0.02s _obuild/grading/embedded_grading_cmis.mlmods                     [ done ]
0.03s _obuild/grading/embedded_grading_cmis.cmo                        [ done ]
0.05s _obuild/grading/grading.cmi                                      [ done ]
0.10s _obuild/grading/grading.cmo                                      [ done ]
0.02s _obuild/grading/grading.cma                                      [ done ]
0.79s _obuild/learnocaml-toplevel/learnocaml_toplevel_output.cmo       [ done ]
0.81s _obuild/learnocaml-toplevel/learnocaml_toplevel_input.cmo        [ done ]
0.03s _obuild/learnocaml-app-common/.../learnocaml_local_storage.mlipp [ done ]
0.02s _obuild/learnocaml-app-common/learnocaml_local_storage.mlimods   [ done ]
0.37s _obuild/testing/test_lib.cmo                                     [ done ]
0.02s _obuild/testing/testing.cma                                      [ done ]
0.03s _obuild/learnocaml-app-common/learnocaml_local_storage.cmi       [ done ]
0.09s _obuild/learnocaml-app-common/_.../learnocaml_local_storage.mlpp [ done ]
0.02s _obuild/learnocaml-app-common/learnocaml_local_storage.mlmods    [ done ]
0.05s _obuild/learnocaml-app-common/_temp/server_caller.mlipp          [ done ]
0.06s _obuild/learnocaml-app-common/_temp/server_caller.mlpp           [ done ]
0.01s _obuild/learnocaml-app-common/server_caller.mlmods               [ done ]
0.02s _obuild/learnocaml-app-common/server_caller.mlimods              [ done ]
0.02s _obuild/learnocaml-app-common/server_caller.cmi                  [ done ]
0.06s _obuild/learnocaml-app-common/server_caller.cmo                  [ done ]
0.16s _obuild/learnocaml-app-common/_temp/learnocaml_common.mlpp       [ done ]
0.07s _obuild/learnocaml-app-common/_temp/learnocaml_common.mlipp      [ done ]
0.01s _obuild/learnocaml-app-common/learnocaml_common.mlmods           [ done ]
0.01s _obuild/learnocaml-app-common/learnocaml_common.mlimods          [ done ]
0.13s _obuild/learnocaml-exercise/_temp/learnocaml_exercise_main.mlpp  [ done ]
0.01s _obuild/learnocaml-exercise/learnocaml_exercise_main.mlmods      [ done ]
0.53s _obuild/learnocaml-toplevel/learnocaml_toplevel.cmo              [ done ]
0.01s _obuild/learnocaml-toplevel/learnocaml-toplevel.cma              [ done ]
0.23s _obuild/learnocaml-app-common/learnocaml_common.cmi              [ done ]
0.06s _obuild/toploop_jsoo/_temp/toploop_jsoo.mlpp                     [ done ]
0.48s _obuild/learnocaml-app-common/learnocaml_local_storage.cmo       [ done ]
0.03s _obuild/toploop_jsoo/_temp/toploop_jsoo.mlipp                    [ done ]
0.00s _obuild/toploop_jsoo/toploop_jsoo.mlimods                        [ done ]
0.01s _obuild/toploop_jsoo/toploop_jsoo.cmi                            [ done ]
0.01s _obuild/toploop_jsoo/toploop_jsoo.mlmods                         [ done ]
0.05s _obuild/toploop_jsoo/toploop_jsoo.cmo                            [ done ]
0.00s _obuild/toploop_jsoo/toploop_jsoo.cma                            [ done ]
0.01s _obuild/learnocaml-grader-worker/grader_jsoo_messages.mlimods    [ done ]
0.01s _obuild/learnocaml-grader-worker/grader_jsoo_messages.cmi        [ done ]
0.01s _obuild/learnocaml-grader-worker/grader_jsoo_messages.mlmods     [ done ]
0.01s _obuild/learnocaml-grader-worker/grader_jsoo_messages.cmo        [ done ]
0.04s _obuild/learnocaml-grader-worker/_temp/grader_jsoo_worker.mlpp   [ done ]
0.01s _obuild/learnocaml-grader-worker/grader_jsoo_worker.mlmods       [ done ]
0.04s _obuild/learnocaml-grader-worker/grader_jsoo_worker.cmo          [ done ]
0.40s _obuild/learnocaml-main/_temp/learnocaml_index_main.mlpp         [ done ]
0.03s _obuild/learnocaml-main/learnocaml_index_main.mlmods             [ done ]
0.13s _obuild/learnocaml-grader-worker/learnocaml-grader-worker.byte   [ done ]
3.12s _obuild/jsutils/js_utils.cmo                                     [ done ]
0.01s _obuild/jsutils/jsutils.cma                                      [ done ]
0.01s _obuild/learnocam.../learnocaml_toplevel_worker_messages.mlimods [ done ]
0.02s _obuild/learnocaml-to.../learnocaml_toplevel_worker_messages.cmi [ done ]
0.97s _obuild/learnocaml-exercise/learnocaml_exercise_main.cmo         [ done ]
1.00s _obuild/learnocaml-app-common/learnocaml_common.cmo              [ done ]
0.02s _obuild/learnocaml-app-common/learnocaml-app-common.cma          [ done ]
0.04s _obuild/learnocaml-topl.../learnocaml_toplevel_worker_main.mlipp [ done ]
0.01s _obuild/learnocaml-to.../learnocaml_toplevel_worker_main.mlimods [ done ]
0.01s _obuild/learnocaml-toplev.../learnocaml_toplevel_worker_main.cmi [ done ]
0.11s _obuild/learnocaml-tople.../learnocaml_toplevel_worker_main.mlpp [ done ]
0.03s _obuild/grading-cli/grading_cli.mlimods                          [ done ]
0.01s _obuild/learnocaml-top.../learnocaml_toplevel_worker_main.mlmods [ done ]
0.02s _obuild/grading-cli/grading_cli.cmi                              [ done ]
0.01s _obuild/grading-cli/grading_cli.mlmods                           [ done ]
0.10s _obuild/learnocaml-exercise/learnocaml-exercise.byte             [ done ]
0.07s _obuild/grading-cli/grading_cli.cmo                              [ done ]
0.03s _obuild/grading-cli/grader_cli.mlmods                            [ done ]
0.13s _obuild/learnocaml-toplev.../learnocaml_toplevel_worker_main.cmo [ done ]
0.08s _obuild/grading-cli/grader_cli.cmo                               [ done ]
0.97s _obuild/learnocaml-main/learnocaml_index_main.cmo                [ done ]
0.02s _obuild/grading-cli/grading-cli.cma                              [ done ]
0.01s _obuild/learnocaml-grader/grader_cli_main.mlmods                 [ done ]
0.12s _obuild/learnocaml-toplevel-w.../learnocaml-toplevel-worker.byte [ done ]
0.01s _obuild/learnocaml-grader/grader_cli_main.cmo                    [ done ]
0.04s _obuild/learnocaml-grader/learnocaml-grader.byte                 [failed]
[433.1] Command failed: '/home/caml/.opam/4.05.0/bin/ocamlc.opt' '-o' './_obuild/learnocaml-grader/learnocaml-grader.byte' '-I' './_obuild/learnocaml-grader' '-I' './src/grader' '-I' './_obuild/grading-cli' '-I' './_obuild/toploop_unix' '-I' './src/toploop' '-I' '/home/caml/.opam/4.05.0/lib/ocplib-ocamlres' '-I' '/home/caml/.opam/4.05.0/lib/ocaml' '-I' '/home/caml/.opam/4.05.0/lib/pprint' '-I' './_obuild/grading' '-I' './_obuild/testing' '-I' './_obuild/ty' '-I' './src/ppx-metaquot' '-I' './_obuild/toploop' '-I' './_obuild/toploop_results' '-I' './_obuild/learnocaml-state' '-I' './src/state' '-I' './_obuild/learnocaml-repository' '-I' './src/repo' '-I' './_obuild/xor' '-I' './src/utils' '-I' '/home/caml/.opam/4.05.0/lib/ocplib-json-typed' '-I' './_obuild/ppx_metaquot_lib' '-I' '/home/caml/.opam/4.05.0/lib/ppx_tools' '-I' '/home/caml/.opam/4.05.0/lib/ezjsonm' '-I' '/home/caml/.opam/4.05.0/lib/jsonm' '-I' '/home/caml/.opam/4.05.0/lib/hex' '-I' './_obuild/embedded_cmis' '-I' '/home/caml/.opam/4.05.0/lib/cstruct' '-I' '/home/caml/.opam/4.05.0/lib/ocaml/compiler-libs' '-I' '/home/caml/.opam/4.05.0/lib/lwt' '-I' '/home/caml/.opam/4.05.0/lib/uri' '-I' '/home/caml/.opam/4.05.0/lib/re/posix' '-I' '/home/caml/.opam/4.05.0/lib/stringext' '-I' '/home/caml/.opam/4.05.0/lib/sexplib' '-I' '/home/caml/.opam/4.05.0/lib/parsexp' '-I' '/home/caml/.opam/4.05.0/lib/ppx_sexp_conv/runtime-lib' '-I' '/home/caml/.opam/4.05.0/lib/base64' '-I' '/home/caml/.opam/4.05.0/lib/base' '-I' '/home/caml/.opam/4.05.0/lib/sexplib0' '-I' '/home/caml/.opam/4.05.0/lib/base/shadow_stdlib' '-I' '/home/caml/.opam/4.05.0/lib/base/caml' '-I' '/home/caml/.opam/4.05.0/lib/astring' '-I' '/home/caml/.opam/4.05.0/lib/uutf' '-I' '/home/caml/.opam/4.05.0/lib/re' '-I' '/home/caml/.opam/4.05.0/lib/result' '-I' '/home/caml/.opam/4.05.0/lib/uchar' '-I' '/home/caml/.opam/4.05.0/lib/bytes' '/home/caml/.opam/4.05.0/lib/ocaml/unix.cma' '/home/caml/.opam/4.05.0/lib/result/result.cma' '/home/caml/.opam/4.05.0/lib/lwt/lwt.cma' '/home/caml/.opam/4.05.0/lib/re/re.cma' '/home/caml/.opam/4.05.0/lib/uutf/uutf.cma' '/home/caml/.opam/4.05.0/lib/astring/astring.cma' '/home/caml/.opam/4.05.0/lib/base/caml/caml.cma' '/home/caml/.opam/4.05.0/lib/base/shadow_stdlib/shadow_stdlib.cma' '/home/caml/.opam/4.05.0/lib/sexplib0/sexplib0.cma' '/home/caml/.opam/4.05.0/lib/base/base.cma' '/home/caml/.opam/4.05.0/lib/base64/base64.cma' '/home/caml/.opam/4.05.0/lib/ocaml/bigarray.cma' '/home/caml/.opam/4.05.0/lib/ppx_sexp_conv/runtime-lib/ppx_sexp_conv_lib.cma' '/home/caml/.opam/4.05.0/lib/parsexp/parsexp.cma' '/home/caml/.opam/4.05.0/lib/sexplib/sexplib.cma' '/home/caml/.opam/4.05.0/lib/stringext/stringext.cma' '/home/caml/.opam/4.05.0/lib/re/posix/re_posix.cma' '/home/caml/.opam/4.05.0/lib/uri/uri.cma' '/home/caml/.opam/4.05.0/lib/lwt/lwt_log.cma' '/home/caml/.opam/4.05.0/lib/lwt/lwt_unix.cma' '/home/caml/.opam/4.05.0/lib/ocaml/compiler-libs/ocamlcommon.cma' '/home/caml/.opam/4.05.0/lib/ocaml/compiler-libs/ocamlbytecomp.cma' '/home/caml/.opam/4.05.0/lib/ocaml/compiler-libs/ocamltoplevel.cma' '/home/caml/.opam/4.05.0/lib/cstruct/cstruct.cma' '/home/caml/.opam/4.05.0/lib/ocplib-ocamlres/ocplib-ocamlres-runtime.cma' './_obuild/embedded_cmis/embedded_cmis.cma' '/home/caml/.opam/4.05.0/lib/hex/hex.cma' '/home/caml/.opam/4.05.0/lib/jsonm/jsonm.cma' '/home/caml/.opam/4.05.0/lib/ezjsonm/ezjsonm.cma' '/home/caml/.opam/4.05.0/lib/ppx_tools/ppx_tools.cma' './_obuild/ppx_metaquot_lib/ppx_metaquot_lib.cma' '/home/caml/.opam/4.05.0/lib/ocplib-json-typed/ocplib_json_typed.cma' './_obuild/xor/xor.cma' './_obuild/learnocaml-repository/learnocaml-repository.cma' './_obuild/learnocaml-state/learnocaml-state.cma' './_obuild/toploop_results/toploop_results.cma' './_obuild/toploop/toploop.cma' './_obuild/ty/ty.cma' '-linkall' './_obuild/testing/testing.cma' '-linkall' './_obuild/grading/grading.cma' '/home/caml/.opam/4.05.0/lib/pprint/PPrintLib.cma' '/home/caml/.opam/4.05.0/lib/ocaml/str.cma' '/home/caml/.opam/4.05.0/lib/ocplib-ocamlres/ocplib-ocamlres.cma' './_obuild/toploop_unix/toploop_unix.cma' './_obuild/grading-cli/grading-cli.cma' './_obuild/learnocaml-grader/grader_cli_main.cmo'
-- stderr for ...rnocaml-grader/learnocaml-grader.byte --
File "_none_", line 1:
Error: Required module `Condition' is unavailable
0.11s _obuild/learnocaml-main/learnocaml-main.byte                     [ done ]
7.03s _obuild/learnocaml-exercise/learnocaml-exercise.js               [ done ]
-- stderr for ...ocaml-exercise/learnocaml-exercise.js --
warning: overriding primitive "caml_ephe_key_offset"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:25
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:25
warning: overriding primitive "caml_ephe_data_offset"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:29
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:29
warning: overriding primitive "caml_weak_create"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:33
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:33
warning: overriding primitive "caml_weak_set"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:41
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:41
warning: overriding primitive "caml_weak_get"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:49
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:49
warning: overriding primitive "caml_weak_get_copy"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:56
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:56
warning: overriding primitive "caml_weak_check"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:68
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:68
warning: overriding primitive "caml_weak_blit"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:77
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:77
warning: overriding primitive "caml_ephe_create"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:88
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:88
warning: overriding primitive "caml_ephe_blit_key"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:92
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:92
warning: overriding primitive "caml_ephe_get_key"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:96
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:96
warning: overriding primitive "caml_ephe_get_key_copy"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:100
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:100
warning: overriding primitive "caml_ephe_check_key"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:104
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:104
warning: overriding primitive "caml_ephe_set_key"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:108
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:108
warning: overriding primitive "caml_ephe_unset_key"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:114
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:114
warning: overriding primitive "caml_ephe_blit_data"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:120
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:120
warning: overriding primitive "caml_ephe_get_data"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:128
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:128
warning: overriding primitive "caml_ephe_get_data_copy"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:138
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:138
warning: overriding primitive "caml_ephe_set_data"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:149
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:149
warning: overriding primitive "caml_ephe_unset_data"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:157
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:157
warning: overriding primitive "caml_ephe_check_data"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:165
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:165
warning: overriding primitive "caml_blit_string_to_bigstring"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/bigstring.js:43
  new: /home/caml/.opam/4.05.0/lib/cstruct/cstruct.js:16
warning: overriding primitive "caml_blit_bigstring_to_string"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/bigstring.js:26
  new: /home/caml/.opam/4.05.0/lib/cstruct/cstruct.js:26
There are some missing primitives
Dummy implementations (raising 'Failure' exception) will be used if they are not available at runtime.
You can prevent the generation of dummy implementations with the commandline option '--disable genprim'
Missing primitives:
  Base_am_testing
  Base_internalhash_fold_float
  Base_internalhash_fold_int
  Base_internalhash_fold_int64
  Base_internalhash_fold_string
  Base_internalhash_get_hash_value
21.59s _obuild/learnocaml-toplevel-worker/learnocaml-toplevel-worker.js [ done ]
-- stderr for ...-worker/learnocaml-toplevel-worker.js --
warning: overriding primitive "caml_ephe_key_offset"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:25
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:25
warning: overriding primitive "caml_ephe_data_offset"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:29
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:29
warning: overriding primitive "caml_weak_create"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:33
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:33
warning: overriding primitive "caml_weak_set"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:41
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:41
warning: overriding primitive "caml_weak_get"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:49
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:49
warning: overriding primitive "caml_weak_get_copy"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:56
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:56
warning: overriding primitive "caml_weak_check"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:68
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:68
warning: overriding primitive "caml_weak_blit"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:77
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:77
warning: overriding primitive "caml_ephe_create"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:88
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:88
warning: overriding primitive "caml_ephe_blit_key"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:92
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:92
warning: overriding primitive "caml_ephe_get_key"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:96
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:96
warning: overriding primitive "caml_ephe_get_key_copy"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:100
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:100
warning: overriding primitive "caml_ephe_check_key"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:104
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:104
warning: overriding primitive "caml_ephe_set_key"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:108
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:108
warning: overriding primitive "caml_ephe_unset_key"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:114
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:114
warning: overriding primitive "caml_ephe_blit_data"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:120
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:120
warning: overriding primitive "caml_ephe_get_data"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:128
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:128
warning: overriding primitive "caml_ephe_get_data_copy"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:138
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:138
warning: overriding primitive "caml_ephe_set_data"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:149
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:149
warning: overriding primitive "caml_ephe_unset_data"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:157
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:157
warning: overriding primitive "caml_ephe_check_data"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:165
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:165
There are some missing primitives
Dummy implementations (raising 'Failure' exception) will be used if they are not available at runtime.
You can prevent the generation of dummy implementations with the commandline option '--disable genprim'
Missing primitives:
  caml_sys_time_include_children
25.46s _obuild/learnocaml-grader-worker/learnocaml-grader-worker.js     [ done ]
-- stderr for ...er-worker/learnocaml-grader-worker.js --
warning: overriding primitive "caml_ephe_key_offset"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:25
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:25
warning: overriding primitive "caml_ephe_data_offset"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:29
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:29
warning: overriding primitive "caml_weak_create"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:33
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:33
warning: overriding primitive "caml_weak_set"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:41
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:41
warning: overriding primitive "caml_weak_get"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:49
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:49
warning: overriding primitive "caml_weak_get_copy"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:56
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:56
warning: overriding primitive "caml_weak_check"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:68
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:68
warning: overriding primitive "caml_weak_blit"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:77
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:77
warning: overriding primitive "caml_ephe_create"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:88
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:88
warning: overriding primitive "caml_ephe_blit_key"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:92
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:92
warning: overriding primitive "caml_ephe_get_key"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:96
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:96
warning: overriding primitive "caml_ephe_get_key_copy"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:100
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:100
warning: overriding primitive "caml_ephe_check_key"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:104
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:104
warning: overriding primitive "caml_ephe_set_key"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:108
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:108
warning: overriding primitive "caml_ephe_unset_key"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:114
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:114
warning: overriding primitive "caml_ephe_blit_data"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:120
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:120
warning: overriding primitive "caml_ephe_get_data"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:128
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:128
warning: overriding primitive "caml_ephe_get_data_copy"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:138
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:138
warning: overriding primitive "caml_ephe_set_data"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:149
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:149
warning: overriding primitive "caml_ephe_unset_data"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:157
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:157
warning: overriding primitive "caml_ephe_check_data"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:165
  new: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/weak.js:165
warning: overriding primitive "caml_blit_string_to_bigstring"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/bigstring.js:43
  new: /home/caml/.opam/4.05.0/lib/cstruct/cstruct.js:16
warning: overriding primitive "caml_blit_bigstring_to_string"
  old: /home/caml/.opam/4.05.0/lib/js_of_ocaml-compiler/bigstring.js:26
  new: /home/caml/.opam/4.05.0/lib/cstruct/cstruct.js:26
There are some missing primitives
Dummy implementations (raising 'Failure' exception) will be used if they are not available at runtime.
You can prevent the generation of dummy implementations with the commandline option '--disable genprim'
Missing primitives:
  Base_am_testing
  Base_clear_caml_backtrace_pos
  Base_hash_double
  Base_hash_string
  Base_heap_block_is_heap_block
  Base_int_math_int64_pow_stub
  Base_int_math_int_clz
  Base_int_math_int_popcount
  Base_int_math_int_pow_stub
  Base_internalhash_fold_float
  Base_internalhash_fold_int
  Base_internalhash_fold_int64
  Base_internalhash_fold_string
  Base_internalhash_get_hash_value
  caml_channel_descriptor
  caml_sys_time_include_children
  unix_accept
  unix_access
  unix_alarm
  unix_bind
  unix_chdir
  unix_chmod
  unix_chown
  unix_chroot
  unix_clear_close_on_exec
  unix_clear_nonblock
  unix_close
  unix_closedir
  unix_connect
  unix_dup
  unix_dup2
  unix_environment
  unix_error_message
  unix_execv
  unix_execve
  unix_execvp
  unix_execvpe
  unix_fchmod
  unix_fchown
  unix_fork
  unix_fstat
  unix_fstat_64
  unix_ftruncate
  unix_ftruncate_64
  unix_getaddrinfo
  unix_getcwd
  unix_getegid
  unix_geteuid
  unix_getgid
  unix_getgrgid
  unix_getgrnam
  unix_getgroups
  unix_gethostbyaddr
  unix_gethostbyname
  unix_gethostname
  unix_getitimer
  unix_getlogin
  unix_getnameinfo
  unix_getpeername
  unix_getpid
  unix_getppid
  unix_getprotobyname
  unix_getprotobynumber
  unix_getpwnam
  unix_getpwuid
  unix_getservbyname
  unix_getservbyport
  unix_getsockname
  unix_getsockopt
  unix_getuid
  unix_has_symlink
  unix_initgroups
  unix_isatty
  unix_kill
  unix_link
  unix_listen
  unix_lockf
  unix_lseek
  unix_lseek_64
  unix_lstat
  unix_lstat_64
  unix_mkdir
  unix_mkfifo
  unix_nice
  unix_open
  unix_opendir
  unix_pipe
  unix_putenv
  unix_read
  unix_readdir
  unix_readlink
  unix_recv
  unix_recvfrom
  unix_rename
  unix_rewinddir
  unix_rmdir
  unix_select
  unix_send
  unix_sendto
  unix_set_close_on_exec
  unix_set_nonblock
  unix_setgid
  unix_setgroups
  unix_setitimer
  unix_setsid
  unix_setsockopt
  unix_setuid
  unix_shutdown
  unix_sigpending
  unix_sigprocmask
  unix_sigsuspend
  unix_single_write
  unix_sleep
  unix_socket
  unix_socketpair
  unix_stat
  unix_stat_64
  unix_string_of_inet_addr
  unix_symlink
  unix_tcdrain
  unix_tcflow
  unix_tcflush
  unix_tcgetattr
  unix_tcsendbreak
  unix_tcsetattr
  unix_times
  unix_truncate
  unix_truncate_64
  unix_umask
  unix_unlink
  unix_utimes
  unix_wait
  unix_waitpid
  unix_write
2 errors in 29.38s. 237 jobs (parallelism 2.6x), 262 files generated.
Error log:
Error:
[433.1] '/home/caml/.opam/4.05.0/bin/ocamlc.opt' '-o' './_obuild/learnocaml-grader/learnocaml-grader.byte' '-I' './_obuild/learnocaml-grader' '-I' './src/grader' '-I' './_obuild/grading-cli' '-I' './_obuild/toploop_unix' '-I' './src/toploop' '-I' '/home/caml/.opam/4.05.0/lib/ocplib-ocamlres' '-I' '/home/caml/.opam/4.05.0/lib/ocaml' '-I' '/home/caml/.opam/4.05.0/lib/pprint' '-I' './_obuild/grading' '-I' './_obuild/testing' '-I' './_obuild/ty' '-I' './src/ppx-metaquot' '-I' './_obuild/toploop' '-I' './_obuild/toploop_results' '-I' './_obuild/learnocaml-state' '-I' './src/state' '-I' './_obuild/learnocaml-repository' '-I' './src/repo' '-I' './_obuild/xor' '-I' './src/utils' '-I' '/home/caml/.opam/4.05.0/lib/ocplib-json-typed' '-I' './_obuild/ppx_metaquot_lib' '-I' '/home/caml/.opam/4.05.0/lib/ppx_tools' '-I' '/home/caml/.opam/4.05.0/lib/ezjsonm' '-I' '/home/caml/.opam/4.05.0/lib/jsonm' '-I' '/home/caml/.opam/4.05.0/lib/hex' '-I' './_obuild/embedded_cmis' '-I' '/home/caml/.opam/4.05.0/lib/cstruct' '-I' '/home/caml/.opam/4.05.0/lib/ocaml/compiler-libs' '-I' '/home/caml/.opam/4.05.0/lib/lwt' '-I' '/home/caml/.opam/4.05.0/lib/uri' '-I' '/home/caml/.opam/4.05.0/lib/re/posix' '-I' '/home/caml/.opam/4.05.0/lib/stringext' '-I' '/home/caml/.opam/4.05.0/lib/sexplib' '-I' '/home/caml/.opam/4.05.0/lib/parsexp' '-I' '/home/caml/.opam/4.05.0/lib/ppx_sexp_conv/runtime-lib' '-I' '/home/caml/.opam/4.05.0/lib/base64' '-I' '/home/caml/.opam/4.05.0/lib/base' '-I' '/home/caml/.opam/4.05.0/lib/sexplib0' '-I' '/home/caml/.opam/4.05.0/lib/base/shadow_stdlib' '-I' '/home/caml/.opam/4.05.0/lib/base/caml' '-I' '/home/caml/.opam/4.05.0/lib/astring' '-I' '/home/caml/.opam/4.05.0/lib/uutf' '-I' '/home/caml/.opam/4.05.0/lib/re' '-I' '/home/caml/.opam/4.05.0/lib/result' '-I' '/home/caml/.opam/4.05.0/lib/uchar' '-I' '/home/caml/.opam/4.05.0/lib/bytes' '/home/caml/.opam/4.05.0/lib/ocaml/unix.cma' '/home/caml/.opam/4.05.0/lib/result/result.cma' '/home/caml/.opam/4.05.0/lib/lwt/lwt.cma' '/home/caml/.opam/4.05.0/lib/re/re.cma' '/home/caml/.opam/4.05.0/lib/uutf/uutf.cma' '/home/caml/.opam/4.05.0/lib/astring/astring.cma' '/home/caml/.opam/4.05.0/lib/base/caml/caml.cma' '/home/caml/.opam/4.05.0/lib/base/shadow_stdlib/shadow_stdlib.cma' '/home/caml/.opam/4.05.0/lib/sexplib0/sexplib0.cma' '/home/caml/.opam/4.05.0/lib/base/base.cma' '/home/caml/.opam/4.05.0/lib/base64/base64.cma' '/home/caml/.opam/4.05.0/lib/ocaml/bigarray.cma' '/home/caml/.opam/4.05.0/lib/ppx_sexp_conv/runtime-lib/ppx_sexp_conv_lib.cma' '/home/caml/.opam/4.05.0/lib/parsexp/parsexp.cma' '/home/caml/.opam/4.05.0/lib/sexplib/sexplib.cma' '/home/caml/.opam/4.05.0/lib/stringext/stringext.cma' '/home/caml/.opam/4.05.0/lib/re/posix/re_posix.cma' '/home/caml/.opam/4.05.0/lib/uri/uri.cma' '/home/caml/.opam/4.05.0/lib/lwt/lwt_log.cma' '/home/caml/.opam/4.05.0/lib/lwt/lwt_unix.cma' '/home/caml/.opam/4.05.0/lib/ocaml/compiler-libs/ocamlcommon.cma' '/home/caml/.opam/4.05.0/lib/ocaml/compiler-libs/ocamlbytecomp.cma' '/home/caml/.opam/4.05.0/lib/ocaml/compiler-libs/ocamltoplevel.cma' '/home/caml/.opam/4.05.0/lib/cstruct/cstruct.cma' '/home/caml/.opam/4.05.0/lib/ocplib-ocamlres/ocplib-ocamlres-runtime.cma' './_obuild/embedded_cmis/embedded_cmis.cma' '/home/caml/.opam/4.05.0/lib/hex/hex.cma' '/home/caml/.opam/4.05.0/lib/jsonm/jsonm.cma' '/home/caml/.opam/4.05.0/lib/ezjsonm/ezjsonm.cma' '/home/caml/.opam/4.05.0/lib/ppx_tools/ppx_tools.cma' './_obuild/ppx_metaquot_lib/ppx_metaquot_lib.cma' '/home/caml/.opam/4.05.0/lib/ocplib-json-typed/ocplib_json_typed.cma' './_obuild/xor/xor.cma' './_obuild/learnocaml-repository/learnocaml-repository.cma' './_obuild/learnocaml-state/learnocaml-state.cma' './_obuild/toploop_results/toploop_results.cma' './_obuild/toploop/toploop.cma' './_obuild/ty/ty.cma' '-linkall' './_obuild/testing/testing.cma' '-linkall' './_obuild/grading/grading.cma' '/home/caml/.opam/4.05.0/lib/pprint/PPrintLib.cma' '/home/caml/.opam/4.05.0/lib/ocaml/str.cma' '/home/caml/.opam/4.05.0/lib/ocplib-ocamlres/ocplib-ocamlres.cma' './_obuild/toploop_unix/toploop_unix.cma' './_obuild/grading-cli/grading-cli.cma' './_obuild/learnocaml-grader/grader_cli_main.cmo'

File "none", line 1:
Error: Required module `Condition' is unavailable

Error:
rule 433: target ./_obuild/learnocaml-grader/learnocaml-grader.byte not built
Makefile:21: recipe for target 'build' failed
make: *** [build] Error 2

Ordering of exercise tabs

When working on an exercise, I always end up clicking the Report tab when I'm looking for the exercise, and vice versa. I think Toplevel, Exercise, Report is a more intuitive ordering.

Prelude error on files ending with an end-of-line character

On the exercise list of the learn-ocaml web application, I get the error “error in prelude” when clicking on some exercises, and can’t do the exercise. This occurs on all exercices for which prelude.ml or prepare.ml is terminated by an end-of-line character. It is very inconvenient because learn-ocaml-autogen generates files with an end-of-line character.
For example, I don’t have this error on an empty prelude created by touch, which is 0 byte long, but I do on an empty prelude created by autogen, which is 1 byte long.
The presence or not of an end-of-line character on the other files seems not to affect the behaviour of the application.
There is also no such error when using learn-ocaml-client from the command line, and the exercise is evaluated correctly.

Edit: the error occurs if there is an eol in prepare or prelude, not just prelude.

test_ref : can't write a proper grader

Hi,
I am writing a tutorial for test functions 'test_ref' but my grader is not working : any student answer is ok (even no answer). I may have done something wrong ... any help is welcome. Here is a basic example

prelude.ml

let forty_two = ref 0;;

solution.ml

let () = forty_two := 42

test.ml

let exercise_1 =
  Section ([Text "Ref: "; Code "forty_two"] ,
           test_ref [%ty: int] forty_two 42)

Wishlist for a company-like feature in learn-ocaml

Dear learn-ocaml developers,

Would it be easy to implement in learn-ocaml some auto-complete feature, similar to that of company Emacs mode?

In particular, a feature that would be very convenient would be:

  • for writing a qualified identifier Module. …,
  • when one types the dot,
  • learn-ocaml will display a menu with the list of the Module fields and their type...
  • and we could select one item using the mouse (or Enter).

(see this screenshot for an example in Emacs+Tuareg+Merlin+Company context)

What do you think about this?

Test_lib.require is broken

File : src/grader/Test_lib.ml, lines 704-711.

Issue : the function "require" is supposed to compare the incoming expressions "n" to a given expression "expr" and return a success on the first time n is equal to expr. However, there are no comparisons made in that function; instead, it returns the success effectively on the first run of the function, and then the "already" flag stays on.

Error : Division_by_zero

Two issues :

  • the header of this error is written in french (Erreur Interne)

  • this error occurs very often when working on the grader but is absolutely not informative. Here are two cases I have seen it occurs :

    • when the solution function is needed but is missing in the solution.ml file. However sometimes the right error is raised (can't found a solution) and written in the report. I did not manage to determine why I have the right error sometimes and not in other cases.
    • when I test an exercise on the platform (do the exercise and grade it), then make some changes in the test.ml file (not minors one, for example when I remove a complete test section). If I reload the exercise (without resetting my session), I have a division by zero error.

Question: construct a prot term from the string representation of the type

Context

With the current API of test_lib, fixed-arity primitives such as test_function_1 take as argument some _ Ty.ty:

val test_function_1 : ?test: 'b tester -> …
  ('a -> 'b) Ty.ty -> string -> ('a * 'b * string * string) list -> Learnocaml_report.report

while the n-arity primitives take as argument some (_, _, _) prot, the advantage of which being thus that the co-domain type 'ret is clearly specified:

val test_function : ?test: 'ret tester -> …
  (('ar -> 'row) Ty.ty, 'ar -> 'urow, 'ret) prot -> ('ar -> 'row) lookup ->
  (('ar -> 'row, 'ar -> 'urow, 'ret) args * (unit -> 'ret)) list -> Learnocaml_report.report

In learn-ocaml-editor we decided to preferably rely on test_function (and test_function_against) to have more generic code, while providing notations to easily construct some term of type (('ar -> 'row, 'ar -> 'urow, 'ret) args * (unit -> 'ret)) list.

The current bottleneck for specifying such test cases is that the syntax to construct a term of type (('ar -> 'row) Ty.ty, 'ar -> 'urow, 'ret) prot is not very user-friendly. We thus obtain some code like this:

type test_qst_typed =
  | TestAgainstSol :
      { name: string
      ; prot: (('ar -> 'row) Ty.ty, 'ar -> 'urow, 'ret) prot
      ; gen: int
      ; suite: ('ar -> 'row, 'ar -> 'urow, 'ret) args list } -> test_qst_typed
  …
  | TestSuite :
      { name: string
      ; prot: (('ar -> 'row) Ty.ty, 'ar -> 'urow, 'ret) prot
      ; suite: (('ar -> 'row, 'ar -> 'urow, 'ret) args * (unit -> 'ret)) list } -> test_qst_typed

let example_constr_sol =
  TestAgainstSol
    { name = "min";
      prot = (arg_ty [%ty: int] (last_ty [%ty: int] [%ty: int]));
      gen = 4;
      suite = []
    }

Question

The question is: would it be feasible to add to the test_lib API a facility to get a prot from a string representation of the type? Basically one of the two approaches would be OK for us:

  1. Either implement a syntax [%prot: a -> b] similar to [%ty: a -> b]
  2. Or implement a function that has a type such as prot_of_string: string -> (('ar -> 'row) Ty.ty, 'ar -> 'urow, 'ret) prot

Remarks

  • Using approach 1. would thus allow us to write:
let example_constr_sol =
  TestAgainstSol
    { name = "min";
      prot = [%prot: int -> int -> int];
      gen = 4;
      suite = []
    }
  • If I'm not mistaken, approach 1. could be implemented either directly, or by implementing 2. first and relying on it.

  • We already have a prototype implementation of a function parse_type : string -> string that yields the following trace:

# let str = parse_type "int->(int->int)->int";;
val str : string = "arg_ty [%ty :int ] (last_ty [%ty :(int->int) ] [%ty :int ])"

Kind regards, Erik

No error when building exercise without an appropriate sampler

The issue is simple: an user type is both defined in prelude.md and in test.ml but no sampler for this type is given. An error should be raised when building exercise session. However, it is not the case, and so, it's resulting in a failure report when the user tries to grade the exercise.

Obviously, user types must not be redefined in test.ml but still, an error should be raised at building time.

A dummy example:
prelude.ml:

type ab = A | B

solution.ml :

let foo x = match x with
  | A -> 0
  | B -> 1

test.ml

type ab = A | B
let exercise_1 =
  Section ([ Text "Function: " ; Code "foo" ], 
           test_function_1_against_solution 
             [%ty: ab -> int] 
             "foo"                  
             ~gen:10                            
             []               
          )

Moreover, the teachers who report this issue actually did not have a nice failure report, but a "Division_by_zero" error but I did not manage to reproduce this behavior.

Missing dependency for learn-ocaml's opam-2.0.0 build chain

Hi,

I've just noticed (thanks to the Travis CI test-build of learn-ocaml-editor, not yet based on Docker) that the opam-installer dependency (used by make opaminstall) is not specified in learn-ocaml.opam* files.

I had not noticed this beforehand on my config because I migrated to opam-2.0.0 from an APT-packaged version of opam 1.2, so there was already some opam-installer binary in the PATH:

$ which opam-installer
/usr/bin/opam-installer
$ opam-installer --version
1.2.2

Should this additional dependency be added to both {learn-ocaml.opam,learn-ocaml.opam.locked} or just to learn-ocaml.opam ?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.