2013-06-20 21 views
2

在通常的lisp中,是否有推薦針對外國類型的命名約定? (和一般類型)?例如:cffi/foreign類型的推薦命名約定

(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用大寫來表示類型,如++,這可能是一個壞的想法),還是有其他傳統方式來做到這一點。有什麼建議?

+0

只是一個挑剔的解釋器(和編譯器)總是區分大小寫;這是_reader_默認提升。您仍然可以使用混合大小寫符號名稱與默認的可讀取形式,例如'| MixedCaseSymbol |'或'us \ o \ fa'。 –

+0

@JoshuaTaylor:是的,我知道,但AFAIK,區分大小寫的lisp是一種非常不規範/「非常規」的編碼風格。另一方面,我爲自己編程,所以這不應該是一個問題... – SigTerm

回答

1

經過一些測試後,我發現cffi類型名稱不會與CLOS類相沖突並被阻止。所以不同的類型名稱是沒有必要的。

關於「標準的類型名稱」一般來說,lisp爲函數和類型分開了「名稱空間」。 (準確地說,就我所知,可以使用相同的符號作爲函數名稱和類型名稱)。

結論:它看起來像cffi類型不同的命名方案是不必要的。

+0

是否有關於命名空間的問題?命名約定可以用來避免衝突,但這並不是他們唯一的目的。在使用外部庫時,命名約定對於翻譯問題至少同樣重要(例如,能夠在'NtCreateThread'和'nt-create-thread'之間,或者'isSerializable'和'serializable-p'之間可靠地轉換)作爲它們用於名稱空間衝突。 –

+0

@JoshuaTaylor:我正在談論* type *名稱,而不是函數名稱。據我所知,'(defctype''d類型不會與lisp類型('defstruct' /'defclass')衝突,根據我所知,有一種隱藏的內部機制使用這些cffi typenames作爲符號,就是這樣 - 它們甚至不是lisp類型。我之所以問這個問題,是因爲我認識的其他語言不以這種方式工作 - 他們需要唯一標識符。所以我錯過了什麼? – SigTerm

+0

你不會錯過任何東西;它們在概念上是不同的名稱空間。 CL使這很簡單;你可以使用一個隱藏的表格,或者只是給[symbol's plist]添加一些東西(http://clhs.lisp.se/Body/f_symb_4.htm)。我的困惑是,這個問題沒有提及命名_to以避免命名空間collision_的任何事情。命名約定不僅可以模擬命名空間,還可以幫助程序員(和環境)查找和識別名稱。例如,。在Scheme中,謂詞以'?'結尾;在Common Lisp中,它們在'p'或'-p'中。 'defstruct'使用它來自動_generate_謂詞名稱。 –

2

CFFI有一個number of functions與名稱的翻譯有關。該鏈接文件包括:

它可能是有意義的嘗試使用這些功能的互動很好的名字。舉例來說,有個translate-name-from-foreign頁面上的例子(我知道的是有關函數的命名,而不是類型的命名,雖然):

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

我也建議尋找一些使用CFFI生成綁定庫,並期待他們在做什麼。