内联-c:编写Haskell源文件,包括内联C代码。无需外国金融机构。

[飞行情报员,图书馆,麻省理工学院][建议标签]

旗帜

自动标记
姓名描述违约
gsl示例

构建GSL示例

残疾人

使用-f<标志>启用标志,或-f-<标志>禁用该标志。更多信息

下载

维修人员角落

包装维护人员

对于包维护者和黑客托管者

候选人

  • 没有候选人
版本[RSS(RSS)] 0.5.0.0,0.5.0.1,0.5.2.0,0.5.2.1,0.5.3.0,0.5.3.1,0.5.3.2,0.5.3.3,0.5.3.4,0.5.4.0,0.5.4.1,0.5.4.2,0.5.4.3,0.5.5.0,0.5.5.1,0.5.5.2,0.5.5.3,0.5.5.4,0.5.5.5,0.5.5.6,0.5.5.7,0.5.5.8,0.5.5.9,0.5.6.0,0.5.6.1,0.6.0.0,0.6.0.1,0.6.0.2,0.6.0.3,0.6.0.4,0.6.0.5,0.6.0.6,0.6.1.0,0.7.0.0,0.7.0.1,0.8,0.8.0.1,0.9.0.0,0.9.1.0,0.9.1.1,0.9.1.2,0.9.1.3,0.9.1.4,0.9.1.5,0.9.1.6,0.9.1.7,0.9.1.8,0.9.1.9,0.9.1.10
更改日志 changelog.md
依赖关系 基础(>=4.7 && <5),字节删除,集装箱,可散列的,内联-c,mtl公司,解析(>=3),解析器,漂亮的打印机(>=1.7),template-haskell模板(>=2.12.0.0),变压器(>=0.1.3.0),无序控制器,矢量[细节]
许可证 麻省理工学院
版权 (c) 2015-2016 FP Complete公司,(c)2017-2019 Francesco Mazzoli
作者 弗朗西斯科·马佐利(Francesco Mazzoli)、马修·博斯普弗鲁格(Mathieu Boespflug)
维护人员 邮箱:mazzo.li
类别 外国金融机构
源回购 头部:git克隆https://github.com/fpco/inline-c
已上传 通过桥本俊吉2023-09-29T21:34:42Z
分配 Debian公司:0.9.1.0,LTSHaskell公司:0.9.1.10,NixOS:0.9.1.10,堆叠:0.9.1.10
反向依赖关系 45直接,52间接[细节]
可执行程序 gsl码
下载 总计36532(过去30天内105)
额定值 2.5(票数:5)[估算人贝叶斯平均]
您的评分
  • λ
  • λ
  • λ
状态 可用文档[生成日志]
上次成功报告时间:2023-09-29[所有1个报告]

内联-c-0.9.1.10自述文件

[返回包描述]

内联-c

内联-c可以无缝调用C库并嵌入Haskell模块中的高性能内联C代码。哈斯克尔和C罐在同一源文件中自由混合,数据传递到和以最小的开销从任何一种语言的代码中获取。无需外国金融机构。

内联-c哈斯克尔的逃生舱口(或其中之一)是遗留代码和高性能数值和系统库。还有其他用途:你也可以想到内联-c至于哈斯克尔内联汇编对C来说是什么?这是一种方便的方法,可以稍微弥补一下在C仍然优于C的罕见情况下有点额外的性能哈斯克尔。

GHCi支持目前仅限于使用-fobject-code(对象代码),请参阅这个最后一节了解更多信息。

入门

假设我们想用C计算一个数字的余弦哈斯克尔。内联-c允许您内联编写此函数调用,而无需需要绑定到外部函数:

{-#LANGUAGE准引号#-}{-#LANGUAGE模板Haskell#-}导入限定语言。C.内联为CC.include“<math.h>”主::IO()main=做x<-[C.exp|double{cos(1)}|]打印x

内联-c利用准报价GHC中实现的语言扩展。模板Haskell也是必需的。导入语言。C.内联模块引入了最需要的范围Haskell定义。C.include“<math.h>”外国职能cos()我们想打电话给他。最后,在主要的功能,[C.exp|double{cos(1)}|]表示内联C表达式类型为双重的.欧洲化学工程师协会代表“C表达式”。这是一种习惯准引用由提供内联-c.

A类C.exp公司准引号始终包含内联C表达式。此注释确定Haskell中的准引用。开箱即用,内联-c知道如何绘制地图从许多常见的C类型到Haskell类型。在这种情况下,

[C.exp|double{cos(1)}|]::IO双精度

对于像这样的纯C表达式,我们还提供C.纯,有效完全相同,但没有IO(输入输出):

[C.pure |双{cos(1)}|]::C双

显然,使用时必须格外小心C.纯:嵌入式C代码必须是引用透明的。

多个语句

内联-c允许在中嵌入任意C代码,而不仅仅是表达式语句序列的形式,使用c(c)准引用:

{-#LANGUAGE准引号#-}{-#LANGUAGE模板Haskell#-}导入限定语言。C.内联为CC.include“<stdio.h>”主::IO()main=做x<-[C.块|int{//读取5个整数并求和整数i,总和=0,tmp;对于(i=0;i<5;i++){scanf(“%d”,/tmp);总和+=tmp;}收益总额;} |]打印x

正如C.exp公司,我们需要对整个C块进行类型注释。注释指定返回类型。也就是说任何返回语句中的表达式。

捕获Haskell变量--参数声明

内联-c允许在C表达式中引用Haskell变量和代码块。我们通过“反引用”来做到这一点。

假设我们想参数化上面编写的函数我们应该读多少数字。我们可以通过定义Haskell来实现我们可以从C中引用其参数的函数:

{-#LANGUAGE准引号#-}{-#LANGUAGE模板Haskell#-}导入限定语言。C.内联为C进口国外产品。C.类型C.包括“<stdio.h>”--|@readAndSum n@从标准输入中读取@n@数字并返回--他们的总和。读取和总和::CInt->IO CIntreadAndSum n=[C.block|int{//读取n个整数并求和整数i,总和=0,tmp;对于(i=0;i<$(int n));i++){扫描(“%d”,&tmp);总和+=tmp;}收益总额;}|]主::IO()main=做x<-读取和求和5打印x

这里是Haskell变量n个就在我们需要的地方使用$(整数n).标准反报价(我们将讨论附加报价稍后)由$后面是括号中的C声明。注意,在反引号时可以使用任何有效的Haskell标识符,包括构造函数、限定名、包含unicode等。

对于每个反引号,在Haskell环境。在这种情况下内联-c需要一个变量命名n个类型为CInt公司,情况就是这样。

可以捕获和返回什么?

所有C类型只对应一个Haskell类型。基本类型(整数,长的,双重的,浮动等)转换为他们的Haskell等价物CInt公司,CLong公司,C双倍,C浮标.指针和数组转换为Ptr公司。函数指针被转换为FunPtr(功能点).

内联-c也可以处理用户定义的结构和枚举,前提是它们是可存储你告诉我的内联-c关于他们使用上下文.

上下文

提供的基本功能之外的一切内联-c在我们称之为“上下文“。来自用户透视图,如果我们想使用默认上下文以外的任何内容(C.baseCtx公司),我们必须设置C.背景显式使用C.上下文功能。接下来的两部分包括几个示例。

这个C.背景允许扩展内联-c以支持

C.背景s可以使用它们的单体例如。

理想情况下C.背景将为每个应该与一起使用内联-c。然后用户可以组合多个上下文如果要在同一程序中使用多个库,请将它们放在一起。请参见这个内联-c-nag包裹对于使用C.背景为图书馆量身定制。

有关如何定义的信息C.背景s、 请参阅Haddock生成的API文档语言。C.内联。上下文.

更多反引用

除了基本的anti-quoter,它可以捕获当前的变量,一些更多的反引用提供了额外的功能。作为如前所述,内联-c可以通过定义反引用轻松扩展由用户使用上下文.

矢量

这个vec-len公司vec-ptr反引用C.vecCtx公司上下文让我们易于使用哈斯克尔矢量继续“求和”主题,我们可以编写求和的代码C中的Haskell向量:

{-#LANGUAGE准引号#-}{-#LANGUAGE模板Haskell#-}导入限定语言。C.内联为C导入合格数据。矢量。可存储为V导入合格数据。矢量。可储存。可变为VM导入数据。单体((<>))进口国外产品。C.类型--要使用矢量反引用,我们需要“C.vecCtx”和--“C.baseCtx”。上下文(C.baseCtx<>C.vecCtx)sumVec::虚拟机。IOVector CDouble->IO CDoublesumVec-vec=[C.block|double{双和=0;整数i;对于(i=0;i<$vec-len:vec;i++){总和+=$vec-ptr:(双*vec)[i];}收益总额;} |]主::IO()main=做x<-sumVec=<<V.sawe(V.fromList[1,2,3])打印x

这个向量长度anti-quoter只需指定向量we想要得到的长度(在我们的例子中,血管内皮细胞). 要使用vec-ptranti-quoter还需要指定所需的指针类型。血管内皮细胞是的向量C双倍s、 我们想要一个指向双重的第条。

字节字符串

这个bs-len(英国标准)bs-ptr型反引用C.bsCtx公司上下文工作vec-len公司vec-ptr副本,但具有严格的字节字符串s.唯一的区别是没有必要指定C中指针的类型--它总是字符*:

{-#LANGUAGE模板Haskell#-}{-#语言四引号#-}导入合格数据。字节字符串作为BS导入数据。单体((<>))进口国外产品。C.类型导入限定语言。C.内联为C上下文(C.baseCtx<>C.bsCtx)--|统计“BS.ByteString”中的设置位数。countSetBits::BS.ByteString->IO CIntcountSetBits bs=[C.块|整数{int i,位=0;for(i=0;i<$bs len:bs;i++){char ch=$bs-ptr:bs[i];位+=(ch*01001001001ULL&042104210421ULL)%017;}返回位;}|]

函数指针

使用乐趣anti-quoter,存在于C.funCtx公司上下文,我们可以轻松地将Haskell函数转换为函数指针。

{-#LANGUAGE准引号#-}{-#LANGUAGE模板Haskell#-}导入限定语言。C.内联为C--要使用函数指针anti-quoter,我们需要“C.funCtx”以及--“C.baseCtx”。上下文(C.baseCtx<>C.funCtx)阿克曼::CLong->CLong->CLong阿克曼|m==0=n+1|m>0&&n==0=ackermann(m-1)1|否则=阿克曼(m-1)(阿克曼m(n-1))主::IO()main=做让ackermannIO m n=返回$ackermann m n设x=3设y=4z<-[C.exp|long{$fun:(long(*ackermannIO)(long,long))($(long x),$(long y))} |]打印z

在这个示例中,我们捕获了一个类型为CLong->CLong->IO CLong,阿克曼IO,指向C中的函数指针,使用乐趣反引用。请注意,当我们捕获阿克曼IO,使用标准的C声明语法。阿尔索注意乐趣anti-quoter与IO(输入输出)函数,所以我们需要修改阿克曼使其具有正确的类型。

通常,在反引号时,如果可以推断类型(如案例vec-len公司),只显示Haskell标识符。如果不能,目标C类型和Haskell标识符使用C声明语法。

解释方式

目前内联-c无法在解释模式下工作。然而,GHCi仍然可以使用-fobject-code(对象代码)标志。为了速度,我们推荐通过-对象代码-O0例如

堆栈ghci--ghci-options='-fobject-code-O0'

cabal repl--ghc-options='-fobject-code-O0'