我在使用
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";;
我的沙丘配置可能做错了什么?任何帮助将不胜感激。
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