【问题标题】:bind vs bind* in Chicken scheme鸡方案中的绑定与绑定*
【发布时间】:2013-10-05 14:40:46
【问题描述】:

我有Chicken 的Scheme 代码如下sn-p:

(require-extension bind)

(bind* "double int_exp(double, int);")
(bind* "double square(double);")

(begin
    (print (int_exp 1.2 1))
    (print (square 2.0)))

int_expsquare 只是我为测试而编写的小型测试函数(用 C 编写)。此代码工作正常;但是,一旦我删除星号,编译的程序就会打印出虚假值(并且虚假值取决于我是使用 clang 还是 gcc 编译 C 代码。)绑定文档只是 says "[bind* is] 类似于绑定,但也使用foreign-declare"and"[foreign-declare包括]将给定字符串逐字写入生成文件的标题"将代码嵌入到生成的Scheme扩展中"-鉴于我是Chicken的新手(确实是Scheme。)它们实际上是什么意思,bindbind* 之间有什么区别,我应该什么时候使用?

【问题讨论】:

    标签: scheme chicken-scheme


    【解决方案1】:

    据我所知,如果你正在调用的函数已经在你之前使用过 #included 的头文件中声明过(包括 chicken.h 自动包含的任何内容,所有 Chicken程序包括)。如果您调用的函数尚未声明,那么您还需要使用bind* 来发出声明。

    所以,这会起作用(math.h 已经包含在 chicken.h 中):

    (use bind extras)
    (bind "double cbrt(double)")
    (format #t "cbrt(~a) = ~a~%" 27 (cbrt 27))
    

    【讨论】:

    • 我为我的测试函数创建了一个头文件并包含它,即使没有星号,程序也可以工作,但包含仍然必须使用 bind* 完成,即使使用包含如果我使用bind*,它仍然有效,所以我仍然不确定它们到底有什么不同。
    • @jaymmer 是的,#include 必须使用 bind* 完成,正如您从所有示例中看到的那样。这样做会导致将#include(以及函数声明,如果您使用bind* 用于那些)发送到生成的C 文件中。如果您的函数声明与头文件中的内容完全匹配,那么对它们使用bind* 是无害的。否则,您的编译器可能会阻止....
    • 您可以使用csc -t 生成C 文件而无需编译它们。然后您可以比较使用bind*bind 相比的效果。
    猜你喜欢
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多