【问题标题】:Confusion with package prefixes using CFFI in Clozure Common Lisp在 Clozure Common Lisp 中使用 CFFI 混淆包前缀
【发布时间】:2011-02-25 15:05:49
【问题描述】:

在 Clozure Common Lisp 1.6 上使用 (ql:quickload "cffi") 成功加载 CFFI 后,我在 *features* 中有 CFFI-FEATURES:X86 CFFI-FEATURES:UNIX :CFFI。但是我很好奇为什么 CFFI 的某些功能在 cffi-sys: 前缀下可见:

? (documentation 'cffi:null-pointer 'function)
"Construct and return a null pointer."

? (documentation 'cffi-sys:%foreign-funcall 'function)
"Perform a foreign function call, document it more later."

而其他一些人也可以使用cffi:

? (documentation 'cffi:null-pointer 'function)
"Construct and return a null pointer."

? (documentation 'cffi:%foreign-funcall 'function)
> Error: Reader error: No external symbol named "%FOREIGN-FUNCALL" in package #<Package "CFFI">.
> While executing: CCL::%PARSE-TOKEN, in process listener(1).
> Type :GO to continue, :POP to abort, :R for a list of available restarts.
> If continued: Use the internal symbol CFFI-SYS:%FOREIGN-FUNCALL
> Type :? for other options.

查看cffi_0.10.6/src/cffi-openmcl.lisp 我可以看到(defpackage #:cffi-sys ...,那么cffi:null-pointer 是如何工作的?

【问题讨论】:

    标签: common-lisp


    【解决方案1】:

    在 Lisp 中有一些命名约定。有些被广泛使用,有些则没有。

    命名一个包something-SYS暗示它可能捆绑了一些内部机制。

    命名符号 %SOMETHING 暗示它是内部或特定于实现的功能,不打算直接在用户代码中使用。

    所以从命名上我猜 cffi-sys:%foreign-funcall 是一个由 CFFI 内部使用的函数,但不打算由用户使用。因此,该符号也不会从主包 CFFI 中导出。可能从 CFFI 包中导出了另一个符号,它以更便携或更方便的方式提供了功能。

    【讨论】:

    • 好的,有道理。简而言之,我的代码应该坚持使用cffi:
    猜你喜欢
    • 2013-08-08
    • 2019-09-28
    • 2017-04-25
    • 1970-01-01
    • 2012-12-16
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多