相关疑难解决方法(0)

OCaml内部:例外

我很想知道如何在OCaml运行时处理异常以使它们如此轻量级.他们使用setjmp/longjmp还是在每个函数中返回一个特殊值,然后传播它?

在我看来,longjmp会给系统带来一点压力,但只有当引发异常时,检查每个函数的返回值才需要在调用函数后检查每个值和每个值,这在我看来会很多检查和跳跃,似乎表现最差.

通过查看OCaml如何与C接口(http://caml.inria.fr/pub/docs/manual-ocaml/manual032.html#toc142),并查看callback.h,似乎通过使用标记异常对象的内存对齐(#define Is_exception_result(v)(((v)&3)== 2)).这似乎表明它的实现不使用longjmp并在每次函数调用后检查每个函数结果.是吗?或者C函数已经尝试捕获任何异常,然后将其转换为这种格式?

谢谢!

compiler-construction ocaml exception internals longjmp

21
推荐指数
1
解决办法
1952
查看次数

F#:有些,无,或异常?

我最近一直在教自己F#,我来自命令式(C++/C#)背景.作为一个练习,我一直在研究可以用矩阵做东西的函数,比如添加,乘法,得到决定因素等等.在这方面一切都很顺利,但我发现在涉及处理时我可能没有做出最好的决定输入无效,例如:

// I want to multiply two matrices
let mult m1 m2 =
  let sizeOK = validateDims m1 m2

  // Here is where I am running to conceptual trouble:
  // In a C# world, I would throw an exception.
  if !sizeOK then
    raise (InvalidOperationException("bad dimensions!")
  else
    doWork m1 m2  
Run Code Online (Sandbox Code Playgroud)

因此,虽然这在技术上有效,但这适用于功能语言吗?它是否符合函数式编程的精神?或者将它重写为更有意义:

let mult m1 m2 =
  let sizeOK = validateDims m1 m2

  if !sizeOK then
    None
  else
    Some doWork m1 m2  
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我返回一个选项,它在矩阵周围添加了一个额外的层,但我也可以使用函数的结果,即使在程序中的某个稍后点的故障情况(无)和模式匹配等.那么这些类型的场景是否有最佳实践?功能程序员会做什么?

f# c#-to-f# f#-3.0

13
推荐指数
2
解决办法
1421
查看次数