【问题标题】:recommended naming convention for cffi/foreign typescffi/外部类型的推荐命名约定
【发布时间】:2013-06-20 11:07:23
【问题描述】:

在 common lisp 中,是否有 推荐 外来类型的命名约定? (和一般类型)?例如:

(cffi:defctype glyph-index-t :uint32)
(cffi:defcstruct Point
    (x :int32)
    (y :int32))

(cffi:define-foreign-library fontlib (t (:default "font")))
(cffi:use-foreign-library fontlib)

(cffi:defctype font-ptr-t :pointer)
(cffi:defcfun "hasKerning" :boolean (fontptr font-ptr-t))
(cffi:defcfun "getKerning" Point 
     (fontptr font-ptr-t) 
     (glyph1 glyph-index-t) 
     (glyph2 glyph-index-t))

在此示例中,defcstruct Point 对应于 C/C++ 类型 struct Point{int32 x, y;};glyph-index-t 对应于 typedef uint32 GlyphIndex;font-ptr-tstruct Font*

我不确定我是否应该简单地将-t 后缀添加到所有内容(就像我对glyph-index-t 所做的那样),使解释器区分大小写(所以我可以使用大写来指示类型,就像在 C++ 中一样,即可能是个坏主意),或者是否有其他传统方法可以做到这一点。有什么建议吗?

【问题讨论】:

  • 只是吹毛求疵——解释器(和编译器)总是区分大小写的;默认情况下,reader 会进行向上转换。您仍然可以通过相应的转义将混合大小写的符号名称与默认的 readtable 一起使用,例如 |MixedCaseSymbol|us\o\fa
  • @JoshuaTaylor:是的,我知道,但是 AFAIK,区分大小写的 lisp 是一种非常非标准/“不寻常”的编码风格。另一方面,我正在为自己编程,所以这应该不是问题......

标签: common-lisp ccl cffi


【解决方案1】:

CFFI 有一个与名称翻译相关的number of functions。该链接文档包括:

尝试使用与这些函数交互良好的名称可能是有意义的。例如,translate-name-from-foreign 页面上有一个示例(我意识到这是关于函数命名,而不是类型命名):

CFFI> (defcfun "someXmlFunction" ...)
=> SOME-XML-FUNCTION

我还建议找到一些使用 CFFI 生成绑定的库,并查看它们的作用。

【讨论】:

    【解决方案2】:

    经过一些测试,我发现 cffi 类型名不会与 CLOS 类和 defstructs 冲突。所以不需要不同的类型名称。

    关于一般的“类型名称标准”,lisp 对函数和类型有单独的“命名空间”。 (准确地说,同一个符号可以用作函数名和类型名,据我所知)。

    结论:cffi 类型的不同命名方案似乎是不必要的。

    【讨论】:

    • 有关于命名空间的问题吗?命名约定可用于避免冲突,但这并不是它们的唯一目的。在使用外部库时,命名约定对于翻译问题(例如,能够在NtCreateThreadnt-create-thread 之间或isSerializableserializable-p 之间可靠地转换)至少与命名空间冲突一样重要。
    • @JoshuaTaylor:我说的是 type 名称,而不是函数名称。据我所知,(defctype'd 类型根本不会与 lisp 类型(defstruct/defclass)发生冲突。据我所知,有某种隐藏的内部机制使用这些 cffi 类型名作为符号,仅此而已 - 它们甚至看起来都不是 lisp 类型。我问的原因是因为我知道的其他语言不是这样工作的——它们需要所有东西的唯一标识符。所以我错过了什么?
    • 你没有错过任何东西;它们在概念上是不同的命名空间。 CL 让这一切变得简单;您可以使用隐藏表,或者只是在symbol's plist 中添加一些内容。我的困惑是,这个问题没有提到任何关于命名以避免命名空间冲突的内容。命名约定不仅可以模拟命名空间,还可以帮助程序员(和环境)查找和识别名称。例如,。在 Scheme 中,谓词以? 结尾;在 Common Lisp 中,它们位于 p-pdefstruct 使用它来自动生成谓词名称。
    • 类似地,进行外部接口的库可以使用命名约定来帮助查找或生成相应的外部名称。例如,可以根据命名约定自动将nt-create-thread 转换为NtCreateThread,并且约定(在这种情况下)与避免命名空间冲突没有任何关系。
    • @JoshuaTaylor:“我的困惑是问题没有提到任何关于命名以避免命名空间冲突的内容”。我不认为我问这个问题是因为我想避免碰撞(不确定)。你看,我习惯于 C++ 思维(任何东西都是标识符,它们可能会发生冲突),当我问这个问题时,我忘记了 lisp 对类型的处理方式不同(它们不与函数冲突),并且你可以使用“符号”。所以我有点假设 cffi 声明了 lisp 类型,并且需要避免冲突,结果证明这是不正确的。 (续...)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多