That might be a mismatch between ocaml (latest version is ocaml 5) and tge libraries which are currently built with ocaml4. If you try the same with ocaml@4, does it work?
Le 30 décembre 2024 18:53:06 GMT+01:00, Zelphir Kaltstahl <[email protected]> a écrit : >On 30.12.24 18:50, Zelphir Kaltstahl wrote: >> >> Hello Guix users, >> >> I am facing a problem trying to use Guix to install Ocaml packages. >> >> I was implementing a simple recursive factorial function, as part of >> learning the language, and tested what would happen, if I calculated >> factorial of 100 ... Result: 0. "Ah!" I thought, "all I need to do is get >> that Zarith package I have been reading about before, and import that in my >> code!". So I added it to my manifest.scm file, which I use for a `guix >> shell`, and expected the Ocaml compiler to naturally pick up packages >> installed via guix, since the Ocaml compiler ocamlc is also installed using >> guix. However, it seems this is dysfunctional currently and ocamlc does not >> realize that the library is in fact installed. I am not sure where it is >> looking for libraries. >> >> Here is how to reproduce: >> >> ~~~~guix-env/channels.scm~~~~ >> (list (channel >> (name 'guix) >> (url"https://git.savannah.gnu.org/git/guix.git") >> (branch "master") >> (commit >> "4473f8ae902c2192cab6919363a9101ce9861e45") >> (introduction >> (make-channel-introduction >> "9edb3f66fd807b096b48283debdcddccfea34bad" >> (openpgp-fingerprint >> "BBB0 2DDF 2CEA F6A8 0D1D E643 A2A0 6DF2 A33A 54FA"))))) >> ~~~~ >> >> ~~~~guix-env/manifest.scm~~~~ >> (specifications->manifest >> '("ocaml" >> "ocaml-utop" >> "dune" >> ;; "opam" ; using guix to install packages, should not need opam >> "bash" >> "ocaml-zarith")) >> ~~~~ >> >> ~~~~main.ml~~~~ >> open Z >> >> let factorial n = >> let rec iter n = >> if n < (of_int 2) >> then of_int 1 >> else mul n (iter (sub n (of_int 1))) >> in >> iter (of_int n) >> >> >> let _ = 5 |> factorial |> to_string |> print_endline >> let _ = 100 |> factorial |> to_string |> print_endline >> ~~~~ >> >> ~~~~command~~~~ >> guix time-machine --channels=guix-env/channels.scm -- shell --check >> --manifest=guix-env/manifest.scm -- bash -c 'ocamlc -c main.ml -o main.byte' >> >> guix shell: checking the environment variables visible from shell >> '/bin/bash'... >> guix shell: All is good! The shell gets correct environment variables. >> File "main.ml", line 1, characters 5-6: >> 1 | open Z >> ^ >> Error: Unbound module Z >> ~~~~ > >I would also like to add, that utop _does_ pick up the library and that in >utop I can: > >~~~~in utop~~~~ >#require "zarith";; >~~~~ > >And work with its functions. > >So this really seems to be about ocamlc. >
