- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写我的第一个 ppx 扩展。这个想法是支持多态 print
功能,类似于show
在 Haskell 中。
(我知道还有其他更强大的解决方案,但我希望了解更多有关其工作原理的信息。)
我采用的方法与描述的方法非常相似 here : 我有一个寻找 %[print <expr>]
的映射器标签,然后将它们替换为 <expr>
的字符串表示形式.例如,
[%print 1] ==> string_of_int 1
[%print "aksljd"] ==> "aksljd"
这适用于常量表达式,但我想支持任意表达式来代替 <expr>
.它应该只是用最终类型的打印机包装它们。
我目前的做法是使用 Typecore.type_expression
转Parsetree.expression
进入 Typedtree.expression
, 然后匹配exp_type
Typedtree.expression
的领域并确定用什么替换整个表达式。例如,对于类型 type test = A of int | B of string
, 我会替换 [%print A 1]
与 show_test (A 1)
那里(show_test
必须按照约定出现)。
这不起作用,因为 Typecore.type_expression
将类型环境作为参数,在重写时我无法获得“当前类型环境”,因为那时甚至还没有执行类型检查... [%print 1 + 1]
与 Typecore.type_expression Env.empty
原因Unbound value +
,这是应该的。
有人有办法解决这个问题吗?如果我完全朝着错误的方向前进,请随时指出这一点。 :p
最佳答案
评论中的讨论摘要:show
在 Haskell 中不是这样工作的(也不能)。 Show a =>
在 Haskell 中将被转换为 OCaml 中的显式模块参数。该模块将有一个带有签名的值,如 print : a -> string
。 Haskell 通过为您(或库)声明的 a
找到 Show
的实例来推断此模块参数,但在 OCaml 中,您必须手动传递该模块。在 Haskell 中声明 Show
实例类似于在 OCaml 中实例化仿函数。
在 Haskell 和 OCaml 中,问题中的预处理表达式在以下情况下具有可疑的含义:
let f x = [%print x]
如果 f : 'a -> string
(即没有可用的 Haskell 类型类实例,也没有传递 OCaml 模块)。
为了使其更加完整,许多其他分析类型的 ppx 重写器从类型定义或声明而不是表达式生成代码。
关于ocaml - 基本类型驱动的 ppx 重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32173627/
在许多使用 ReasonML 的项目中,缩写词 PPX 经常被使用,但很少解释。 什么是 PPX? 为什么 ReasonML 需要它们? 最佳答案 PPX(预处理器扩展)是一种抽象语法树 (AST)
在许多使用 ReasonML 的项目中,缩写词 PPX 经常被使用,但很少解释。 什么是 PPX? 为什么 ReasonML 需要它们? 最佳答案 PPX(预处理器扩展)是一种抽象语法树 (AST)
我需要生成一个与我传递的类型不同的值。这是我第一次写类似 ocaml 的东西,例如,在熟悉的 me haskell 中我会使用 Data.Generics。我是如何理解我需要使用装饰器和 ppx 的。
我正在编写我的第一个 ppx 扩展。这个想法是支持多态 print功能,类似于show在 Haskell 中。 (我知道还有其他更强大的解决方案,但我希望了解更多有关其工作原理的信息。) 我采用的方法
我正在编写 PPX 重写器来简化 Lenses 的定义.让我为普通读者记忆一下镜头是什么。 关于镜头 与记录字段相关联的镜头是允许提取记录并对其进行更新的一对函数。这是一个例子: module Len
有来自 Alain Frisch of Lexifi over a year ago for an alternative to camlp4 for writing sytnax extension
我如何推导 to_string使用带有 jbuilder 的 ppx 的数据类型的方法? 例如,我正在尝试使用 @@deriving show 导出 show_*数据类型的方法。我有一个简单的 mai
我正在将我的应用程序从 OCaml 4.02.3 移植到 4.03.0。 假设您在 lexer.ml 中有以下内容: type t = T [@@deriving sexp] let () = s
我正在尝试使用 ppx 派生在 OCaml 中漂亮地打印包含哈希表(使用基础标准库)的自定义记录类型,但我需要实现 Hashtbl.pp 才能使其工作。 我试过在网上查看例子,我发现最好的例子是 ht
安装后npm和 node , 用 js_of_ocaml 编译 OCaml 文件给出了错误,因此我做了 opam switch reinstall system : :testweb $ opam s
我是一名优秀的程序员,十分优秀!