2013-06-20 2 views
2

일반적인 lisp에서는 외국 형식의 경우권장 이름이 있습니까? (및 일반적으로 유형)? 예를 들어이 예에서는 defcstruct Pointcffi/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)) 

는 C에 대응/C++ 형 struct Point{int32 x, y;};, glyph-index-ttypedef uint32 GlyphIndex;에 대응 font-ptr-tstruct Font*이다.

나는 (내가 glyph-index-t했던 것처럼) 단순히 모든 것을 -t 접미사를 추가할지 여부를 확실 해요, 아마 나쁜 인 ++ 인터프리터는 대소 문자를 구분합니다 (그래서 C에서 같은 유형을 표시하기 위해 대문자를 사용할 수 있도록 아이디어), 또는 그것을 할 수있는 다른 전통적인 방법이 있는지의 여부. 어떤 충고?

+0

해석기 (및 컴파일러)는 항상 대소 문자를 구분합니다. 기본적으로 upcasing하는 _reader_입니다. '| MixedCaseSymbol |'이나'us \ o \ fa'와 같이 대문자와 소문자가 혼재하는 경우, 디폴트의 readtable와 함께 사용할 수 있습니다. –

+0

@JoshuaTaylor : 그래, 알아.하지만 AFAIK, 대소 문자를 구별하는 lisp은 매우 비표준적이고 "비정상적인"코딩 스타일이다. 다른 한편으로는, 나는 나 자신을 위해 프로그래밍하고 있기 때문에, 이것은 문제가되어서는 안된다 ... – SigTerm

답변

1

일부 테스트를 마친 후 cffi typemames가 CLOS 클래스와 충돌하지 않는다는 것을 알게되었습니다. 따라서 고유 한 유형 이름은 필요하지 않습니다.

일반적으로 "형식 이름에 대한 표준"과 관련하여 lisp에는 함수와 형식에 대한 별도의 "네임 스페이스"가 있습니다. (정확히 말해, 내가 말할 수있는 한, 동일한 기호가 함수 이름과 형식 이름으로 사용될 수 있습니다.)

결론 : cffi 유형에 대한 고유 한 이름 지정 체계가 필요없는 것처럼 보입니다.

+0

네임 스페이스에 대한 질문이 있었습니까? 명명 규칙은 충돌을 피하기 위해 사용할 수 있지만 그 유일한 목적은 아닙니다. 외국 도서관과 작업 할 때, 이름 짓기 관습은 적어도 번역 문제 (예 :'NtCreateThread'와'nt-create-thread' 사이, 또는'isSerializable'과'serializable-p' 사이에서 확실하게 변환 할 수있는 것)만큼 중요합니다. 그들은 네임 스페이스 충돌을위한 것입니다. –

+0

@ JoshuaTaylor : 함수 이름이 아닌 * 유형 * 이름에 대해 이야기하고있었습니다. 내가 말할 수있는 한 (defctype'd 타입은 __lisp 타입과 충돌하지 않는다 (defstruct' /'defclass'). 내가 말할 수있는 것부터, 그 cffi를 사용하는 숨겨진 내부 메커니즘이있다. 기호로 typenames, 그리고 그게 - 그것도 리스프 형식으로 보이지 않습니다.내가 물어 본 이유는 내가 아는 다른 언어가 이런 방식으로 작동하지 않기 때문이다. 모든 것에 대해 고유 한 식별자가 필요하기 때문이다. 그래서 나는 무엇인가 놓치고 있냐? – SigTerm

+0

당신은 아무것도 놓치지 않았습니다. 개념적으로 다른 네임 스페이스입니다. CL은 이것을 쉽게 만듭니다. 숨겨진 테이블을 사용하거나 [symbol 's plist] (http://clhs.lisp.se/Body/f_symb_4.htm)에 무언가를 추가 할 수 있습니다. 내 부분에 대한 혼란은 네임 스페이스 충돌을 피하기 위해 네임팅에 관해 언급하지 않았다는 것입니다. 명명 규칙은 네임 스페이스를 시뮬레이트하는 것 이상을 수행 할 수 있으며, 프로그래머 (및 환경)가 이름을 찾고 인식하는 데 도움이됩니다. 예 : Scheme에서 술어는'? '로 끝납니다; Common Lisp에서는'p' 또는'-p'를 사용합니다. 'defstruct'는 이것을 사용하여 자동으로 _generate_ 술어 이름을 생성합니다. –

2

CFFI는 이름 변환과 관련하여 number of functions입니다. 링크 된 문서는 포함 : 아마 이러한 기능을 잘 상호 작용하는 이름을 사용하려고하는 의미를

. 예를 들어, translate-name-from-foreign 페이지에서 예 (I 기능 명명에 관한 인식하지만, 이름을 입력하지 않음)있다 :

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

나는 또한 바인딩을 생성하는 CFFI을 사용하는 일부 라이브러리를 찾는 찾고 좋을 것 그들이하는 일에.