Code Monkey home page Code Monkey logo

ocamlverse.github.io's Introduction

Welcome!

OCamlverse is an effort to document everything worth knowing about OCaml, an industrial-strength functional programming language.

About OCamlverse

OCamlverse is intended to be a fast-moving web site that's easy to contribute to. We maintain the site on GitHub and treat it almost like a Wiki.

Contributing

We depend on the OCaml community's help to make OCamlverse better. Please contribute! You can:

Note: It is important to read our Contribution Guidelines. They explain the rules for contributing to OCamlverse and how to be a good contributor.

(We use the terrific ahrefs service to crawl and check our site.)

Running OCamlverse Locally

OCamlverse is built with Jekyll, a popular static site generator that originally powered GitHub Pages.

If you want to run OCamlverse (e.g. to preview some changes you've made) all you need to do is:

  • Install Ruby (Jekyll is written in Ruby)
  • Run the following shell commands in OCamlverse's source folder:
$ bundle
$ bundle exec jekyll serve

At this point you can point your browser to http://127.0.0.1:4000 and view the locally running site.

Note: If you are using Ruby version 3 or above, you will need to add the webrick gem to the Gemfile prior to running bundle install.

License

All content here is licensed under the CC0 ("No Rights Reserved") license.

ocamlverse.github.io's People

Contributors

antoniskalou avatar anuragsoni avatar bbatsov avatar bluddy avatar bobbypriam avatar c-cube avatar charlesaverill avatar darrenldl avatar dvisztempacct avatar fccm avatar glennsl avatar ivg avatar jonahbeckford avatar khady avatar kirisky avatar loxs avatar mars0i avatar mooreryan avatar mseri avatar nguermond avatar nsmmrs avatar omasanori avatar pmetzger avatar psafont avatar sanette avatar shonfeder avatar tmcgilchrist avatar unixjunkie avatar verbosemode avatar vphantom 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  avatar  avatar

ocamlverse.github.io's Issues

Add page for windows support

There is currently no information about getting started on windows or about the status of windows support in general.

I've added an empty page for the time being with PR #8 so as the link of the main readme isn't broken.

Linking to awesome-ocaml for the ecosystem

I spoke with some users on IRC and the opinion is that we've already duplicated awesome-ocaml and it would be better, rather than fragmenting that resource to just link to it and submit PR's for updating content.

Lots of people look for awesome lists when starting with a language anyway and it might be a better way to maintain these resources in one place.

What's your opinion?

consider encouraging tutorials to be hosted within library source code

The existence of a tutorial is better than no tutorial, even if it's a little out of date.... We might be able to prevent a tutorial from getting out of date by having ocamlverse link out to tutorials, that are hosted as ocaml applications that reside under "tutorials" directory of the library being used, with inline comments providing the narrative. Then the library author can help ensure it is maintained by checking that it compiles with each CI build. The library author can also decide to not accept a tutorial PR if they don't feel they will have the ability to keep maintaining the tutorial.

Bad formatting for Libraries header

In the Quickstart, there's a substantial section called "Libraries". It seems to be as important as the other sections such as "EXPANDING OUR DUMMY APPLICATION", "USING GIT", etc.

But the way it appears topographically is in a smaller type size which makes it look like a subsection of the second "OPAM SWITCH" heading. I discussed that heading in another issue; I believe it shouldn't be there at all and is a mistake due to the text being garbled in an editing process. And I believe the "Libraries" subsection should be its own "LIBRARIES" section, equal to the other main sections.

Outdated information in the "Future of OCaml" page

A Google search for "future of ocaml" led me to the "Future of OCaml" page on OCamlverse. While I know nothing about the development of OCaml, it seems that much of the information therein is outdated. For instance:

I believe that somebody knowledgeable in the status of OCaml development should filter the information on that page, remove what has become outdated and add the true future development directions.

Figure out a good way to rate packages

I'd like to have some scale to measure the quality of packages.

  1. how well maintained they are:

a. Well maintained
b. Average maintenance (issues pile up, but it's ok)
c. Not maintained, issues pile up, bugs appear over time.

  1. How mature the library is. Can it carry out its purpose, or does it have many holes.

a. Mature (lacking support for needed features, serious bugs etc)
b. Immature (lacking some features, buggy)
c. Unusuable (too many bugs, lacking too many features)

  1. How up to date the library is with modern standards and needs. A mature library may be good enough for what it does, but it may not support the current needs of users in the domain, or may not use good paradigms. As an easy example, the Arg module of the stdlib is mature, but it uses outdated paradigms, including global references.

a. Modern (using all modern standards and maybe even pushing the envelope)
b. Somewhat outdated (doesn't fully keep up with standards)
c. Antiquated (too outdated to be of use in a modern context)

What do you guys think? Can we summarize these 3 axes in some convenient way? Unfortunately each of these starts with M (maintenance/maturity/modernity), but maybe we can express these with other words.

Add section pointing out examples of ocaml/rescript documentation and marketing site generation?

In the documentation page, consider adding a section pointing to real world usage of static site generation for ocaml tutorial documentation, ocaml projects/organizations and blog sites. Here are some examples that I can think of:

  • real world ocaml site
  • this website
  • ocaml-explore website
  • a ReScript developer's blog using 11ty and ReScript
  • ReScript lang website
  • reason react website
  • reason conference websites
  • redex website
  • blog using finch

OCaml Quick Reference

Suggested short project: short summary of the language and tools, intended for beginners (or non-beginners) who are having trouble remembering one small thing (say, "what was the syntax of GADTs again" or "what's the difference between all the .c?? file types again?)

This should not present any of the language grammar as the grammar is too intricate to follow in most cases.

If this got good enough, it could become part of the official OCaml docs.

Improve "quickstart dune project" page

Update it to use the new dune init.

Also (from discord):

  • how to init a new project (this seems to be dune init proj , for example.. But should I first create an opam switch ? )
  • how to add a dependency, have it fetched and be able to use it within e.g. files in lib//bin/ in case of a dune project (is adding it to dune-project enough ? how is it fetched? as part of dune-build? No? Then what?)
  • what to version, what to ignore (e.g. add _opam to .gitignore, it's generated from using ocaml swich)
  • how OTHERS can clone and setup their dev environment from my existing project.

Import all good content to ocamlverse

What we're already beginning to see is that linking to outside content such as tutorials and such is not great. Since we don't have control over the content, we can't modify it, fix it or update it. An ecosystem evolves, and so should its documentation.

Therefore, I think we have to gradually move almost all content to OCamlverse itself. Linking should be seen as a temporary measure, either until we ask the author's permission, or until we recreate the content here. We could leave the link to the original content at the end of the article as a way to give credit, and we should definitely give credit to people when we import their content.

Migrate to the OCamlverse organization

It turns out that with github's admin rules, I cannot give anyone else real admin access. That's unacceptable, and looking into the problem, I found out our only solution is to create a github organization.

I created the ocamlverse organization for this purpose. You might think we should try get under the ocaml organization, but a) we don't run that and b) we can't possibly make everyone members of that organization, and our policy is explicitly that everyone can get write access by default. So this is what makes the most sense (I think).

Unfortunately, I can't do much more than creating the org right now. I don't have outside ssh access at work, so I can't clone and create an ocamlverse repo. We don't want to fork -- that creates a 'forked from' link that remains unless we get github to help us.

I'll work some more on this tonight. If one of the original 'admins' wants to help with this, let me know here and I'll give you admin access in the new org. EDIT: scratch the following, it's actually really easy to migrate. (In any case, migrating earlier rather than later makes sense -- there are many things that will need to be replicated like issues and labels, and the longer we wait, the harder it'll be.)

Issue for contribution ideas and questions

Some suggestions for content don't seem to justify an entire issue.

Feel free to add a small comment to this issue for something you came across that could be useful in OCamlverse. Don't worry about judgement by anyone, and feel free to ask questions as well.

Quickstart says to create the lib directory when it already exists

In the Libraries section of the Quickstart, after the sentence "Let’s create a library directory called lib that will be the place to put our library code" is

mkdir lib

However, if the reader has been following the steps laid out so far in the tutorial, that directory already exists.

Running jekyll server locally

To run the jekyll server locally with Ruby v3, I needed to add gem 'webrick', '~> 1.7' to the Gemfile.

Note: If you are using Ruby 3.0 and Jekyll 4.2.x or older, you will need to add the webrick gem to your project's Gemfile prior to running bundle install. (source)

Adding this to the Gemfile lets you run the jekyll server locally both on v2 and v3 (I tested on Ruby versions 2.7.2 and 3.1.2).

If you would like, I could open a pull request for this.

There are two places where the quickstart says it is creating the switch

After the line, "Do not update project_name.opam manually! Let dune do it for you" there is a heading, "OPAM SWITCH" where it shows the reader how to create a local switch. This section is well-written and does indeed show the reader how to create the local switch.

But then, after that, the following sections appear: "LOCKING DEPENDENCIES", "USING GIT", and "EXPANDING OUR DUMMY APPLICATION". And they are followed by another section called "OPAM SWITCH" which begins, "Next up, we are going to create an opam switch."

This is confusing because we already created the switch several sections earlier. And it's even more confusing because after a brief introductory paragraph, nothing more is said in that section about switches. Instead, it talks about how to use libraries.

I suspect that at some point in the evolution of the quickstart, things were reordered and mixed up and that the second "OPAM SWITCH" heading, and the paragraph that follows it, should have been deleted.

Project license

Should this project have a license? I suppose if we were on a Wiki we wouldn't need one, but since we're on github I feel like it should be there.

I'd be privy to go with something liberal like MIT or BSD.

Add some automated content popularity computation

Either plausible analytics, or inspecting duckduckgo or google link results, to determine what blog articles are popular and adding a "most popular" box on the homepage, similar to new york times "most read stories"

Add TryOCaml

Hi,

I think TryOCaml could be a nice addition to the quickstart list.

If you agree, I can do a PR.

Cheers !

EDIT: I made the PR directly so you can merge it directly if you agree it's a good idea

Add new user quick setup templates/instructions

  1. It's worth having a page or two with specific instructions about how to start an OCaml project. It will specify a project configuration including a combination of choices that work together and that are among those configurations that are common. That way, if for example you don't want to understand Dune configuration, and just want to build some code and see how it works, you can.

e.g.:

Create a "src" directory and put a jbuild file there that contains .... Put your first source file foo.ml there. (If you want a .mli file, see such and such page. If you don't know whether you want one, it can wait until you now why you want it.)

That's probably not the best format, but I wanted to convey the idea.

There should be links to explanations of the choices, or brief explanations on the template page, if it's not too much of distraction. ("Create a src directory, or use the name of your choice, as long as it's not "_build". Dune will find the jbuild files anywhere under your project directory.) The idea is to provide a path to a working setup for those who don't want to understand all of the details yet, but make information available for those that do want to understand what they're doing.

  1. It might turn out that it's worth having two or three variants for different quick setups.

... For a traditional OCaml setup, do this. If you are reading Real World OCaml and want to work with Base/Core_kernel/Core do this. If you want an extended library with good API docs and aren't reading RWO, do blah blah. If you want to do web programming with js_of_ocaml, do that. If you want to do web programming with bucklescript, go to this page and use one of the bsb template scripts there. Etc.

All of this is just meant to be a suggestive starting point for thinking about what to include and how to write it and format it. (And I truly mean no insult to Core or JS. In the long run I expect that Core and friends will be much easier for newbies than they are now. But at present it's worth letting new users know that there's a tradeoff. No reason to turn off someone who's not reading RWO. They can get into Core later, and they very possibly will at some point.)

  1. In the long run, it might be worth creating template-creation scripts that do all of the steps for the user. However, in that case it would be good to maintain the links to information about what the script is doing. This should stay in Ocamlverse, rather than being moved to the script itself, so that links are easier to maintain.

  2. The main page or pages for these setup instructions should be under Beginners under Learning.

Question: If there are already good instructions for part of the process in a location that is likely to be maintained, should the quick setup pages simply refer to them? For example, ocaml.org is always likely to have a "How to install OCaml" page, and a page on installing packages with opam.

Add introduction to opam release process

This is kind of like #27, but I don' think people who are just starting out should worry about how to set up a package to go into opam.

What I have in mind is a guide that tells you how to release a package in simple cases, but notes likely potential gotchas, and has links to further info for more complex cases and for understaning the process under the hood.

This is something I'm trying to figure out how to do now. My impression is that Dune allows you to avoid many of the steps in the opam docs (in which case they should be left out of the initial presentation in the Ocamlverse guide), but I'm not sure, and in any event after reading relevant pages in the Dune docs, I have questions that neither set of docs answers.

They guide could be linked to from both Learning and Ecosystem.

Add search

We may be able to add a search bar on github.io with this.

Add content about GSoC (google summer of code)

One of the very big things OCaml is constantly missing out on is google summer of code participants. In order to get the ball rolling, we need a place to organize a list of projects or ideas that could be contributed to. We also need to have a template ready for our GSoC application.

There was some work done in the past on the ocaml.org wiki. It should be imported and embellished.

The part about ideas for projects could also be generalized -- it doesn't just need to be for GSoC.

Make ocamlverse look good on mobile

I'm pretty happy with the current spartan design, but it doesn't look good on mobile.

We take away the sidebar for small screens, but it's not enough:

  • The content section doesn't fit the screen well, and can't even scroll horizontally.
  • The edit buttons mess up the heading.
  • I'd like a hamburger to bring back the sidebar.

Page for info that search engines can't easily find?

I'm wondering whether it would be worth having a page--maybe under Learning, or under a top level link--just for links to information that's difficult to search for, usually because it involves non-alphabetic symbols used in unusual ways. I'm not sure. Just a thought.

Two examples:

In type +'a = ..., + has a special meaning. I've found information on it it--searching on "type +" did work--but if one doesn't think of searching for "type +", there's no way it can be found.

I just came across open! in a code example--rather than open. Still trying to find this one.

Maybe the internal search for ocamlverse would do better, but only if these things exist in the site.

Add a page for example projects

It would be nice to have a page where some example projects of various types are displayed. For example, it would be handy to have examples for web apps, CLI utils, etc.

I usually find this quite useful when I'm learning a new language observing "well designed" projects to see how they're implemented.

dune-workspace: keep the notion and eliminate the dune-workspace file?

I understand the difference between a dune workspace and a dune project.
workspace: the workspace is the subtree starting from the root. It can contain any number of projects that will be built simultaneously by dune
project: a project is a source tree, maybe containing one or more packages.
See https://jbuilder.readthedocs.io/en/latest/terminology.html

Suggestion of improvement for the definition of project: a project is located in a dune workspace. If there is only one dune project defined with a dune-project file, the workspace is implicitly defined by this dune project.

Suggestion of improvement about dune workspace: wouldn't it be simple and useful to enforce the definition of a workspace with a dune-workspace file? Or much better: simply keep the notion of dune workspace but eliminate the dune-workspace file, so that the root will be flexibly defined by the higher dune-file when projects are modified?

See https://jbuilder.readthedocs.io/en/latest/usage.html#dune-workspace

Adding a dedicated domain

I think it'd be nice if the site adopted a dedicated domain like ocamlverse.net/org/whatever. Domains are dirt-cheap (usually around $10/year) and this helps with the discovery/remembering and makes the site hosting-agnostic. If you want I can even buy the domain and just send you the necessary config for GitHub Pages to use it.

Optimization and Iterators

Hi !

It seems that this article about iterators gives wrong information : https://ocamlverse.github.io/content/iterators.html

In particular :

The classic example is something like

let l1 = [1; 2; 3]
 |> List.map (fun x -> x + 1)
 |> List.map (fun x -> x * 3)

In this example, each stage of the computation needs to be materialized, causing allocation. Instead, we can do

let l1 = List.to_seq [1; 2; 3]
 |> Seq.map (fun x -> x + 1)
 |> Seq.map (fun x -> x * 3)
 |> List.of_seq

This version will not allocate the intermediate steps.

Not only is it allocating intermediate steps, but it also seems to be using 3 to 4 times the memory 😅
See discussion here : https://discuss.ocaml.org/t/seq-vs-list-optimization/6885/15

I wanted to open a PR, but I don't know what should be written there instead.
Libraries like Iter also warn in the documentation that Iter.to_list consumes 2*n memory...

Fix incorrect links

Will fix the following incorrect links

Result URL
404 Not found
Removed since 4.12.0
https://caml.inria.fr/pub/docs/manual-ocaml/libref/Spacetime.html
OutboundRedirectedLinked from: https://ocamlverse.github.io/content/optimizing_performance.html
404 Not found http://erratique.ch/software/topkg/doc/Topkg.html
OutboundRedirectedLinked from: https://ocamlverse.github.io/content/documentation_guidelines.html
404 Not found http://erratique.ch/software/bos/doc/Bos.OS.Arg.html
OutboundRedirectedLinked from: https://ocamlverse.github.io/content/command_line.html
404 Not found http://ocaml.org/learn/tutorials/ocamlbuild/
OutboundRedirectedLinked from: https://ocamlverse.github.io/content/build_systems.html
404 Not found http://llvm.org/docs/tutorial/OCamlLangImpl1.html
OutboundRedirectedLinked from: https://ocamlverse.github.io/content/compilers.html
Timeout http://openmirage.org/blog/modular-foreign-function-bindings
OutboundLinked from: https://ocamlverse.github.io/content/ffi.html
503 Service unavailable https://blog.danny-willems.be/en/ocaml-cordova-secured-typed-hybrid-mobile-applications/
OutboundLinked from: https://ocamlverse.github.io/content/mobile.html
404 Not found https://caml.inria.fr/pub/docs/manual-ocaml-4.08/manual046.html
OutboundRedirectedLinked from: https://ocamlverse.github.io/content/monads.html
404 Not found http://philtomson.github.io/blog/2014/07/09/core-dot-async-example/
OutboundRedirectedLinked from: https://ocamlverse.github.io/content/parallelism.html
404 Not found https://ocaml.xyz/book
OutboundLinked from: https://ocamlverse.github.io/content/scientific.html
404 Not found https://ocaml.xyz/package/index.html
OutboundLinked from: https://ocamlverse.github.io/content/scientific.html
404 Not found https://ocaml.xyz/book/
OutboundLinked from: https://ocamlverse.github.io/content/scientific.html and https://ocamlverse.github.io/content/learning.html
403 Forbidden http://sklml.inria.fr/
OutboundLinked from: https://ocamlverse.github.io/content/parallelism.html
Host not found http://thinkinginmeta.com/Fan
OutboundLinked from: https://ocamlverse.github.io/content/metaprogramming.html
404 Not found http://freux.fr/oss/obandit.html
OutboundRedirectedLinked from: https://ocamlverse.github.io/content/scientific.html
404 Not found http://ocsigen.org/tuto/6.4/manual/application.html
OutboundLinked from: https://ocamlverse.github.io/content/web_networking.html
404 Not found https://ocaml.org/learn/tutorials/filenames.html
OutboundLinked from: https://ocamlverse.github.io/content/learning.html
404 Not found https://logarion.orbitalfox.eu/start-your-own-logarion-archive.html
OutboundLinked from: https://ocamlverse.github.io/content/web_networking.html
502 Bad gateway https://prose.yaxm.org/pads/foo-ocaml
OutboundLinked from: https://ocamlverse.github.io/content/web_networking.html
Timeout http://www.ffconsultancy.com/products/ocaml_for_scientists/
OutboundLinked from: https://ocamlverse.github.io/content/learning.html
404 Not found https://www.charlesetc.com/feather/feather/Feather/index.html
OutboundRedirectedLinked from: https://ocamlverse.github.io/content/process_management.html
404 Not found https://caml.inria.fr/pub/docs/manual-ocaml/spacetime.html
OutboundRedirectedLinked from: https://ocamlverse.github.io/content/profiling.html

Dune (the article and dune behaviour)

I report here errors in this article as well as my discovery of dune's behaviour. And open a discussion about dune. I apologize for the EDIT due to confusion (I'm learning dune).

1/ Consistency regarding jbuilder/dune
What about modifying the text of the following command
$ opam install merlin ocp-indent dune utop
accordingly to the text that follows:

  • dune, the installable library of Dune. At the point of this writing, Dune’s latest version is 1.0.1.

In the original article we can see (today):
$ opam install merlin ocp-indent dune utop

2/ Is putting .ml files in a /bin directory a practice enforced by dune and recommended for OCaml coding?

To keep things tidy, let’s move the program to a subdirectory. We will name the directory bin, a convention I use as a place to put entry point modules for executables:

I don't believe main.ml is executable code. Sure that it's can be interpreted, but it looks like source (and dune file is configuration code).
Is it a convention to put source files in bin/ when using dune?
What about using a more natural and meaningful src/ directory?

3/ dune exec is doing more that I believed: first it builds then it executes.
The following instructions work:

$ dune clean
$ dune exec bin/main.exe
Hello, world!

But it reveals that dune exec includes dune build.
That should certainly be a command like dune build bin/main.exe ; dune exec bin/main.exe
While in the (nicely presented) dune documentation we can find the following ambiguous assertion:

The executable can ran with: $ dune exec ./hello_world.exe

It doesn't say that it doesn't build but it lets think that it only runs the .exe file.
https://jbuilder.readthedocs.io/en/latest/quick-start.html#building-a-hello-world-program

We also can see the same in the Libraries paragraph:

Now, open up bin/main.ml and replace the contents with the following:

$ dune exec bin/main.exe
5
2

It works but we see also that dune exec ... does compile AND exec.
Additional test: just add an error somewhere in main.ml (Xopen instead of open) => main.exe is no more executable, so it has been modified.

4/ Librarie, paths, etc.
EDIT : For mental sanity of readers (especially beginners to whom I dedicate this post), why the original author and the Ocamlverse author are using here "lib" for the name of the library declared to dune AND for the name of the directory in which is located all the library stuff?? This is highly confusing when we should learn the language AND the toolings.

So I was first confused by that and believed that
DELETED :
(* "we can create a lib library by putting some .ml files in a directory if we declare that "lib" library in the dune file":

$ cat lib/dune
(library
  (name lib))

So far, I've been using modules for that with nested modules inside. When I handle a .ml module file it has no adherence with the name of the place where I put it!
Is it specific to dune?
For me, this is not enforcing a "first-class modules policy" claimed in RWO or in other places. *)

Here is how it seems to me more simple and consistent to use modules declared to dune (in a lib/dune file) as a library that gathers, then made available for my main.ml program:
" To constitute a dune library with a set of .ml modules, I put them in a directory with a dune file where is declared the library name, then used for compilation and linking. " (this is a basic rule)

$ cat bin/dune
(executable
(name main)
(libraries foo))

$ cat lib/dune
(library
(name foo))

$ cat lib/math.ml
let add x y = x + y
let sub x y = x - y

$ cat lib/math2.ml
let mul x y = x * y

Then I can use in my main.ml program the functions offered by the Math and Math2 modules seen as modules nested in what appears as "Foo module" (in main.ml I use Foo.Math and Foo.Math2).
And this "Foo module" is declared to dune as a "Foo library".

$ cat bin/main.ml
open Foo.Math
open Foo.Math2
let () =
let result = add 2 3 in
print_endline (string_of_int result);
let result = sub 3 1 in
print_endline (string_of_int result);
let result = mul 2 3 in
print_endline (string_of_int result)

At last, regarding the naming and usage of directories (bin/ and lib/), which is one of my/our questions, I'll do as recommended by the dune team.

In this post, there are suggested corrections for improving the article, as well as key questions regarding dune which is becoming THE build system for OCaml.
I think that the dune team should (must!) expose clearly the complete and consistent rules that an OCaml coder must respect when using dune.

EDIT (I deleted what resulted from the lib directory/lib library confusion)
In fact I mean that writing dune files by hand is error prone (i tried to write opam files by hand and went into trouble because of package incompatibilities).
Is there a way for us and for dune to define the dependencies of a project with real-time consistency check, instead of letting people stuck with defining ocamlfind "library files" (META), "opam package files" (opam) and dune build files (dune) all over a tree of the file system?
Okay, you can say that I don't get the "whole story" about dune and ocamlfind and opam. Maybe, pls tell me.

And you can say that I should have read all the dune doc.
You are right (I will!), but the (recurrent) issue is that we find too many articles and event official (dune, OCaml) documentation (see dune Quick start) with incomplete or inconsistent information which result in confusion when trying to learn from it.
How do you want beginners to handle that? (fully beginners in coding, or coming from other programming languages).

This is the paradox I see with the Ocaml tooling/ecosystem: type safe "industrial strenght" language, but unsafe or poor documentation for tools.
But this is improving.

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.