排查 OCaml 中 lwt_ppx 的编译错误:无法编译文件

问题描述 投票:0回答:1

我在使用

lwt_ppx
let%lwt
语法时遇到问题,如 CS3110 教科书的 Promise 部分中所述 (https://cs3110.github.io/textbook/chapters/ds/promises.html) .

在提供的代码片段中:

open Lwt_io

let p =
  let%lwt s1 = read_line stdin in
  let%lwt s2 = read_line stdin in
  Lwt_io.printf "%s\n" (s1^s2)

let _ = Lwt_main.run p

我正在尝试使用沙丘编译代码。我的沙丘文件如下所示:

(executable
 (name main)
 (libraries lwt.unix lwt_ppx))

但是,当我运行命令

dune exec ./main.exe
时,我收到错误消息“未解释的扩展名‘lwt’。”

我已经验证我已经使用

lwt_ppx
安装了
opam list
软件包,有趣的是,当我运行时,代码按
utop
中的预期工作:

#require "lwt_ppx";;
#require "lwt.unix";;
#use "main.ml";;

我的沙丘配置可能做错了什么?任何帮助将不胜感激。

ocaml ocaml-dune ocaml-lwt
1个回答
3
投票

lwt_ppx
是一个预处理器,因此也需要添加到
preprocess
节中:

(executable
 (name main)
 (libraries lwt.unix lwt_ppx)
 (preprocess (pps lwt_ppx)))

但还要注意,从 4.08 开始,您可以使用

let
运算符来实现几乎相同的目的,而无需任何预处理器。例如,您可以将
Lwt.bind
绑定到
let*
,那么您的示例可以写为:

open Lwt_io

let (let*) = Lwt.bind

let p =
  let* s1 = read_line stdin in
  let* s2 = read_line stdin in
  printf "%s\n" (s1^s2)

let _ = Lwt_main.run p
© www.soinside.com 2019 - 2025. All rights reserved.