我想更好地理解以下代码。
代码段中包含MDouble
的实例,以演示不使用预处理器的示例。
#let numarray t = "
foreign import ccall unsafe mxIs%s :: MXArrayPtr -> IO CBooln
instance MXArrayComponent M%s wheren
isMXArray a = boolC =.< withMXArray a mxIs%sn
createMXArray s = withNDims s (uncurry $ createNumericArray (mxClassOf (undefined :: M%s)) False) >>= mkMXArrayn
mxArrayGetOffset = arrayDataGet ;
mxArraySetOffset = arrayDataSet ;
mxArrayGetOffsetList = arrayDataGetList ;
mxArraySetOffsetList = arrayDataSetList
n
instance MXArrayData MX%s M%s
", #t, #t, #t, #t, #t, #t
foreign import ccall unsafe mxIsDouble :: MXArrayPtr -> IO CBool
foreign import ccall unsafe mxCreateDoubleScalar :: MXDouble -> IO MXArrayPtr
foreign import ccall unsafe mxGetScalar :: MXArrayPtr -> IO MXDouble
instance MXArrayComponent MDouble where
isMXArray a = boolC =.< withMXArray a mxIsDouble
createMXScalar = mxCreateDoubleScalar . hs2mx >=> mkMXArray
mxScalarGet a = withMXArray a mxGetScalar
createMXArray s = withNDims s (uncurry $ createNumericArray (mxClassOf (undefined :: Double)) False) >>= mkMXArray
#arrayDataComponent
instance MXArrayData MXDouble MDouble
#numarray Single
#numarray Int8
#numarray Int16
#numarray Int32
#numarray Int64
#numarray Uint8
#numarray Uint16
#numarray Uint32
#numarray Uint64
但特别是,看起来他们正在使用某些类型,如Uint8
等,我不确定这些是在哪里定义的,或者为什么例如 不改用Word8
。另外,不确定如何使用%s
。我在 hsc2hs 文档中看到了很多对#
的引用,但到目前为止还没有关于%
的内容。
关键是链接文档中的粗体句子:
#let ⟨name⟩ ⟨parameters⟩ = "⟨definition⟩"
定义要应用于 Haskell 源的宏。参数名称以逗号分隔,不在参数内。此类宏作为其他 #-构造调用,从 #name 开始。该定义将作为 printf 的参数放在括号内的 C 程序中。要引用参数,请关闭引号,输入参数名称并再次打开引号,以使 C 字符串文本连接。或者使用 printf 的格式指令。参数的值必须作为字符串给出,除非宏使用 C 预处理器的 #parameter 语法将它们本身字符串化。
%s
printf
中指定一个字符串参数(您可以看到更完整的解释,例如 这里(.
所以不涉及Uint8
类型;它只是一个字符串,当你把它代入numarray
时,你会得到
foreign import ccall unsafe mxIsUint8 :: MXArrayPtr -> IO CBool
instance MXArrayComponent MUint8 where
...
此类型记录在此处:
type MUint8 = Word8