String ocaml解析字符串“*&引用;进入*ocaml操作符?

String ocaml解析字符串“*&引用;进入*ocaml操作符?,string,ocaml,String,Ocaml,我有一个函数 val do_math s : string -> int 被称为: do_math "3*4" 这将返回整数12 给定字符串输入,有没有办法用sub或其他什么来解析*out,这样我就可以给dou_math其他字符串,比如“3-1”,它将返回int 2 我正在努力避免写那些额外的代码 在阅读了你的答案后,我提出了类似的想法,但它表明这不是函数,也不能应用。事实上,没有使用变量op_match,但是我不知道如何从该变量获取返回值 open String let do_m

我有一个函数

 val do_math s : string -> int
被称为:

 do_math "3*4"
这将返回整数12

给定字符串输入,有没有办法用sub或其他什么来解析*out,这样我就可以给dou_math其他字符串,比如“3-1”,它将返回int 2

我正在努力避免写那些额外的代码

在阅读了你的答案后,我提出了类似的想法,但它表明这不是函数,也不能应用。事实上,没有使用变量op_match,但是我不知道如何从该变量获取返回值

open String
let do_math s =
  let num1 = int_of_string (sub s 0 1) in
  let num2 = int_of_string (sub s (length s - 1)1) in
  let op = (sub s 1 2) in
  match op with
  | "+" -> num1 + num2
  | "-" -> num1 - num2
  | "*" -> num1 * num2
  | "/" -> num1 / num2
  | _ -> num1 + num2

最好的方法是OCaml是一种编译语言,因此它没有用于解析和计算表达式的运行时工具。在解释语言中,这些通常是“免费”的,因为解释器已经在执行这些操作了

最好的办法是找到一个可以链接到的表达式求值库。如果不担心效率,可以运行命令进行计算。事实上,您甚至可以运行OCaml解释器:-)


我在使用中看到的一个这样的库是。

了解这一点的最佳方式是OCaml是一种编译语言,因此它没有用于解析和计算表达式的运行时工具。在解释语言中,这些通常是“免费”的,因为解释器已经在执行这些操作了

最好的办法是找到一个可以链接到的表达式求值库。如果不担心效率,可以运行命令进行计算。事实上,您甚至可以运行OCaml解释器:-)


我在使用中看到的一个这样的库是。

您可以使用模块为类似计算器的表达式语言编写自己的解析器。它甚至还附带了编写计算器的示例。
Genlex
模块也将在中介绍。它本身可以帮助您编写实际的解释器。
另外,我曾经编写了一个解析器和一个稍微丰富了一点的表达式语言,所以如果您觉得有用的话,可以参考或使用它

您可以使用模块为类似计算器的表达式语言编写自己的解析器。它甚至还附带了编写计算器的示例。
Genlex
模块也将在中介绍。它本身可以帮助您编写实际的解释器。
另外,我曾经编写了一个解析器和一个稍微丰富了一点的表达式语言,所以如果您觉得有用的话,可以参考或使用它

的确,在第一次学习语言时,计算表达式的代码是一个非常常见的例子。我相信OCaml中有很多这样的程序。事实上,OCaml手册中有一个计算器(不是解析器),我来看看。Thanks@JeffreyScofield,谢谢,我已经用链接更新了帖子。为了子孙后代着想)你是说流语法?我对此表示怀疑。但是通常不需要使用它,因为
Genlex
本身作为一个库是有用的。特别是对于小型计算器迷你DSL。对于其他任何东西,最好使用menhir。诚然,在第一次学习语言时,计算表达式的代码是一个非常常见的例子。我相信OCaml中有很多这样的程序。事实上,OCaml手册中有一个计算器(不是解析器),我来看看。Thanks@JeffreyScofield,谢谢,我已经用链接更新了帖子。为了子孙后代着想)你是说流语法?我对此表示怀疑。但是通常不需要使用它,因为
Genlex
本身作为一个库是有用的。特别是对于小型计算器迷你DSL。对于其他任何东西,最好使用menhir。运行ocaml解释器听起来像一个可怕的黑客lol。运行ocaml解释器听起来像一个可怕的黑客lol。将
sub
更改为
String.sub
length
更改为
String.length
。将第二次调用更改为
String.sub
以提取最后一个字符:
String.sub s(String.length s-1)1
删除
让op_匹配=
。那对我来说就行了。但这当然是非常不灵活的。我忘了包括我的公开声明。但是我改变了其他部分。它现在起作用了-我可能会添加更多的案例或其他内容。将
sub
更改为
String.sub
length
更改为
String.length
。将第二次调用更改为
String.sub
以提取最后一个字符:
String.sub s(String.length s-1)1
删除
让op_匹配=
。那对我来说就行了。但这当然是非常不灵活的。我忘了包括我的公开声明。但是我改变了其他部分,现在可以了,我可能会添加更多的案例或其他东西。