在F *中使用元编程对函数参数进行语法检查

时间:2019-02-05 19:19:21

标签: fstar

我想写一个函数来强制其参数在语法上是一个常量字符串。这是我尝试过的:

module Test

module R = FStar.Reflection

let is_literal (t: R.term) =
  match R.inspect_ln t with
  | R.Tv_Const (R.C_String _) -> true
  | _ -> false

let check_literal (s: string { normalize (is_literal (`s)) }) =
  ()

let test () =
  check_literal ""; // should work
  let s = "" in
  check_literal s // should not work

但是,我非常确定静态引号(带有`)不是我想要的,而是带有quote的动态引号。但这将使我成为Tac效应的先决条件。在当前状态下,有什么方法可以做我想做的事?

1 个答案:

答案 0 :(得分:0)

我不知道您是否最终找到了解决方案,但是隐式元参数呢?

它们以某种方式允许在函数调用时运行to代码,从而使Tac可用。

稍微修改一下代码似乎可行:

quote