【问题标题】:What does "let name(param1, param2) = .." mean in ocaml (as opposed to just let name = ...)?“let name(param1, param2) = ..”在 ocaml 中是什么意思(而不是 let name = ...)?
【发布时间】:2021-12-30 19:40:10
【问题描述】:

我正在查看为 C 的极其精简版本编写的编译器。我是 ocaml 的新手,对这种结构特别困惑

let check (globals, functions) =
(* A bunch of stuff abstracted out *)
  let check_function ...
   .... (*A b bunch of stuff abstracted out*)
in (globals, List.map check_function functions)

其中 globals 是 (var_type, var_name) 的列表,functions 是函数记录。我没有发布整个文件(它很长),我的问题只是关于最外面的 let 语句。

我一直只看到简单的 let 语句,你可能有类似的东西

let name = expr1 in expr2

那么当你有的时候是什么意思

let name(param1, param2) = expr1 in (param1, expr1 param2) 

和我这里的有点相似?

【问题讨论】:

  • 您误解了代码,因为您已经删除了大部分代码。 in 很可能附加到 check_function,而不是 check。所以它只是一个函数,取一个元组并返回一个元组。你有没有考虑过查看一些你正在尝试阅读的语言的文档?即使只是像this这样的备忘单?

标签: compiler-construction ocaml ocamlbuild ocamlyacc


【解决方案1】:
let name(param1, param2) = expr1 in (param1, expr1 param2)

可能会更清楚地写成:

let name (param1, param2) = 
  expr1 
in 
  (param1, expr1 param2)

额外的空间使name 是一个接受一个参数的函数更加明显。该参数是两个值 param1param2 的元组。它仅对不使用此name 函数的表达式(param1, expr1 param2) 进行本地绑定。

param1param2 名称未在表达式 expr1 中使用(它们也可能是 (_, _) 当我们到达表达式 @ 时它们超出了范围987654332@ 因此,如果这是有效代码,它们指的是您向我们展示的代码之前的绑定。

实际上name 什么都不做。

【讨论】:

    猜你喜欢
    • 2011-11-23
    • 1970-01-01
    • 2015-03-17
    • 2017-08-25
    • 2010-11-16
    • 2016-04-08
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    相关资源
    最近更新 更多