2013-10-05 47 views
1

綁定*我的方案代碼雞下面的代碼片段:綁定VS雞方案

(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]類似於綁定,而且在生成的Scheme擴展中嵌入代碼foreign-declareand」[foreign-declare] [foreign-declare includes] verbatim給出生成的文件的頭文件中的字符串「 - 既然我是雞新手(實際上是Scheme),它們都不是特別有用。它們是什麼實際上,bindbind*之間有什麼區別,我應該什麼時候使用?

回答

3

從我可以告訴你使用bind,如果你調用該函數已經在頭文件中聲明你以前#include d(包括任何由chicken.h,所有雞方案包括自動在內)所。如果您正在調用的函數尚未聲明,那麼您還需要使用bind*發出聲明。

那麼,這會工作(math.h已經被chicken.h包括):

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

我創建了一個頭文件爲我的測試功能,包括它,並用該程序確實沒有星號,甚至工作,但包括仍然必須使用'bind *'來完成,即使使用include,它仍然可以工作,如果我使用'bind *',所以我仍然不確定它們究竟有什麼不同。 – jaymmer

+1

@jaymmer是的,'#include'必須使用'bind *'完成,正如您從所有示例中所看到的那樣。這樣做會導致'#include'(以及函數聲明,如果你使用'bind *'作爲這些聲明的話)被髮送到生成的C文件中。如果函數聲明與頭文件_exactly_中的內容匹配,那麼使用'bind *'替代它們是無害的。否則,你的編譯器可能會阻止...... –

+2

你可以使用'csc -t'生成C文件而不編譯它們。然後,您可以比較使用'bind *'與'bind'進行比較的效果。 –