首页 > 其他分享 >使用 Dune 编译和调试 OCaml 代码

使用 Dune 编译和调试 OCaml 代码

时间:2024-10-06 21:33:25浏览次数:9  
标签:QCheck name OCaml dune project 编译 let Dune year

下载 Dune

opam install dune

创建项目

dune init project <project-name>

如果创建成功,有

Success: initialized project component named <project-name>

得到如下的一个文件结构

project_name/
├── dune-project
├── test
│   ├── dune
│   └── test_project_name.ml
├── lib
│   └── dune
├── bin
│   ├── dune
│   └── main.ml
└── project_name.opam
/lib

lib 里存放编写的库 library(可以看作是一组模块 module 的集合),比如我有如下的一个 module MyModule

(* MyModule.ml *)
type t = int list

let init n = List.init n (fun i -> i)

let print l = List.iter print_int l

把它放在 lib 下后修改 /lib/dune 文件如下:

(library
 (name my_project)
 (modules MyModule))

/bin/main.ml 下可以这么调用:

let lst = My_project.MyModule.init 10

let () = My_project.MyModule.print lst

library 描述文件 stanza 的格式如下:

(library
 (name <library-name>)
 <optional-fields>)

<library-name> 指库 library 的名字,在上面的例子中,<library-name>my_project,那么在 /bin/main.ml 中就是用 My_project 去调用它内部的模块。

<optional-fields> 有很多可选项,包括:

  • (modules <modules>) 规定哪些模块 module 被包括在这个库 library 之中,使用 Ordered Set Language 来描述

  • (libraries <libraries-dependencies>) 决定了库 library 的依赖

/bin

/bin 存放可运行的 .ml 代码文件,关于 module 的调用方式见上文,使用 dune exec <project_name> 在终端中执行代码,上面的例子的运行结果如下:

dune exec my_project                                                                                                        ─╯
Hello, World!
0123456789

如果想要引入外部库,可以修改 /bin/dune,以使用 lwt 库为例:

(executable
 (public_name myproject)
 (name main)
 (libraries myproject lwt.unix))
(* main.ml *)

let lst = Myproject.MyModule.init 10

let () = Myproject.MyModule.print lst;

Lwt_main.run (Lwt_io.printf "Hello, world!\n")

再次调用 dune exec 可以发现其正常工作

dune-project

dune-project 是描述工程 project 的元数据文件,以我刚刚建立的工程为例:

(lang dune 3.6) ; dune 的版本

(name my_project) ; 工程名

(generate_opam_files true)

(source
 (github username/reponame))

(authors "Author Name") ; 作者

(maintainers "Maintainer Name") ; 拥有者

(license LICENSE) 

(documentation https://url/to/documentation)

(package
 (name my_project)
 (synopsis "A short synopsis")
 (description "A longer description")
 (depends ocaml dune)
 (tags
  (topics "to describe" your project)))

; See the complete stanza docs at https://dune.readthedocs.io/en/stable/dune-files.html#dune-project

构建测试

根据 github 更新时间来看,推荐使用 QCheck 或者 ppx_inline_test

使用 QCheck 构建随机单元测试

Cornell cs3110 的课程中使用的是 QCheck,在我的 docker 容器上不是很能正确安装

一直报错 Curl failed

原因是 seq 这个依赖对应的地址没能被正确 dns 解析,把 dns 服务器地址改为 8.8.8.8 之后问题被修复( 有点难绷

QCheck 文档

使用 QCheck 的例子如下:

#require "qcheck"

(* [rev] is a function that reverses a list. For example, [rev [1;2;3]] is [3;2;1]. *)
let rev lst = List.rev lst

(* QCheck *)
let test =
  QCheck.Test.make ~count:1000 ~name:"test_rev"
   QCheck.(list small_nat)
   (fun l -> rev l = l);;

(* we can check right now the property... *)
QCheck_runner.run_tests [test];;
#require "qcheck"

let leap_year year =
  if year mod 400 = 0 then true
  else if year mod 100 = 0 then false
  else year mod 4 = 0

let test =
  QCheck.Test.make ~count:1000 ~name:"test_leap_year_and_mod_4"
    QCheck.(small_nat)
    (fun year -> leap_year year = (year mod 4 = 0));;

QCheck_runner.run_tests [test]

集成到 Dune 中:

(executable
 (public_name myproject)
 (name main)
 (libraries myproject lwt.unix qcheck))

使用 OUnit2 测试套件

(施工中)

标签:QCheck,name,OCaml,dune,project,编译,let,Dune,year
From: https://www.cnblogs.com/sysss-blogs/p/18449116

相关文章

  • 高版本gcc编译低版本内核
    Ubuntu18.04安装arm-linux-gnueabi-gcc,版本为7.5.0,编译4.0.0Linux内核时出现linux/compiler-gcc7.h:Nosuchfileordirectory临时解决方法:find"linux/compiler-gcc*.h"inyourproject,"*"maybe3or5orotherscp"linux/compiler-gcc*.h""......
  • 在Windows平台使用源码编译和安装PyTorch3D指定版本
    最近在部署SyncTalk虚拟数字人项目时,需要安装很多依赖项,在执行到pipinstall--no-index--no-cache-dirpytorch3d-fhttps://dl.fbaipublicfiles.com/pytorch3d/packaging/wheels/py38_cu113_pyt1121/download.html这一句命令时,安装PyTorch3D失败,输出如下信息:(synctalk)C......
  • dremio 25.1 版本开始支持sql 预编译处理了
    dremio从25.1版本开始,支持sql预编译了,可以更好的提升系统的安全性参考使用传统jdbc模式Connectionconn=DriverManager.getConnection("jdbc:dremio:direct=localhost:31010;schema=sys","admin","admin123");Stringsql="select*frompg.public.senso......
  • android 反编译
    https://juejin.cn/post/6844903821257211911?searchId=202410031145152AA4BB76BB0670AB5957android:screenOrientation="landscape"apktoolempty-framework-dir--force//APKTool反编译apktoold-f1.apk//apktool编译:编译修改后的代码生成新的apkapktoolb1-onew.a......
  • 从 JavaScript 到 OCaml:浅浅浅总结一下函数式编程
    背景这几天突击了一下Cornell的cs3110;抽了两个下午刷完了Chapter3,4,5的课后习题,很有感触。结合自己浅薄的函数式编程理解和贫瘠的JavaScript/TypeScript开发经历,总结一下自己第一阶段的函数式编程学习经历。......
  • win11,vc22源码编译opencv410
    1.安装cmake 2.配代理,否则无法下载依赖包3.自行编译OpenCV源码步骤4.注意配置系统变量,重启机器https://blog.csdn.net/weixin_50648158/article/details/139742826亲测可用OpenCV4.10.0在Windows10,64位,vs2022下的编译及配置方法https://blog.csdn.net/yxfamyself/article......
  • flink 1.18.1编译问题处理
    编译命令:mvncleaninstall-DskipTests-Dspotless.check.skip=true-Drat.skip=true-Preleaseflink-runtime-web编译报错无法下载node、npm问题:[ERROR]Failedtoexecutegoalcom.github.eirslett:frontend-maven-plugin:1.11.0:install-node-and-npm(installnodea......
  • Linux交叉编译工具链toolchain 查看配置明细
    前言全局说明Linux交叉编译工具链toolchain查看配置明细一、说明环境:Ubuntu18.04.6LTS(Linuxqt-vm5.4.0-150-generic#167~18.04.1-UbuntuSMPWedMay2400:51:42UTC2023x86_64x86_64x86_64GNU/Linux)pythonPython2.7.17(default,Mar82023,18:40:28)......
  • 【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
    文章目录C++模板进阶编程前言第一章:非类型模板参数1.1什么是非类型模板参数?1.1.1非类型模板参数的定义1.2非类型模板参数的注意事项1.3非类型模板参数的使用场景示例:静态数组的实现第二章:模板的特化2.1什么是模板特化?2.1.1模板特化的分类2.2函数模板特化......
  • PICO 2 RP2350使用官方推荐RISC-V编译器在O3优化下的coremark跑分,与Hazard3库宣传跑分
    编译环境:WSLUbuntu22.04GCC13.2.0 Hazard3存储库https://github.com/Wren6991/Hazard3/RP2350默认频率150MHz,编译内核为其RISC-V架构内核,在此频率下实测O3等级跑分453左右,O2等级跑分429左右。在测试时,当我打开第二个核心后,并且第二个核心只用来控制led灯,此时coremark跑......