From: Yaroslav K. <kav...@je...> - 2006-04-06 07:16:15
|
SBCL 0.9.11.8, mingw (declaim (inline my-func)) (defun my-func () (alien-funcall (extern-alien "my_c_function" (function utf8-string int)) (my-param))) CL-USER> (describe 'my-func) MY-FUNC is an internal symbol in #<PACKAGE "MY-PKG">. Function: #<FUNCTION MY-PKG::MY-FUNC> Its associated name (as in FUNCTION-LAMBDA-EXPRESSION) is MY-PKG::MY-FUNC. There are no arguments. Its defined argument types are: NIL Its result type is: (VALUES T &OPTIONAL) It is currently declared inline; expansion is available. On Thu, Apr 6, 2006 09:40:46 AM [-2] it was compiled from: my-package.lisp Created: Thursday, April 6, 2006 09:38:24 AM [-2] Why result type is not string (or compatible type)? If define as `(define-alien-routine... result type is (VALUES (OR (SIMPLE-ARRAY CHARACTER (*)) (SIMPLE-ARRAY NIL (*)) SIMPLE-BASE-STRING NULL (ALIEN (* (SIGNED 8)))) &OPTIONAL) If declare type of function: (declaim (inline my-func) (ftype (function () string) my-func)) I get warning: ; in: DEFUN MY-FUNC ; (ALIEN-FUNCALL ; (EXTERN-ALIEN "my_c_function" ; (FUNCTION UTF8-STRING INT)) ; (MY-PKG::MY-PARAM)) ; --> SB-ALIEN-INTERNALS:NATURALIZE IF ; ==> ; NIL ; ; caught WARNING: ; This is not a (VALUES STRING &REST T): ; NIL ; See also: ; The SBCL Manual, Node "Handling of Types" I should use SB-ALIEN:CAST or COERCE? Thanks! -- WBR, Yaroslav Kavenchuk. |
From: Yaroslav K. <kav...@je...> - 2006-04-07 06:09:41
|
SBCL 0.9.11.8, mingw (declaim (inline my-func)) (defun my-func () (alien-funcall (extern-alien "my_c_function" (function utf8-string int)) (my-param))) CL-USER> (describe 'my-func) MY-FUNC is an internal symbol in #<PACKAGE "MY-PKG">. Function: #<FUNCTION MY-PKG::MY-FUNC> Its associated name (as in FUNCTION-LAMBDA-EXPRESSION) is MY-PKG::MY-FUNC. There are no arguments. Its defined argument types are: NIL Its result type is: (VALUES T &OPTIONAL) It is currently declared inline; expansion is available. On Thu, Apr 6, 2006 09:40:46 AM [-2] it was compiled from: my-package.lisp Created: Thursday, April 6, 2006 09:38:24 AM [-2] Why result type is not string (or compatible type)? If define as `(define-alien-routine... result type is (VALUES (OR (SIMPLE-ARRAY CHARACTER (*)) (SIMPLE-ARRAY NIL (*)) SIMPLE-BASE-STRING NULL (ALIEN (* (SIGNED 8)))) &OPTIONAL) If declare type of function: (declaim (inline my-func) (ftype (function () string) my-func)) I get warning: ; in: DEFUN MY-FUNC ; (ALIEN-FUNCALL ; (EXTERN-ALIEN "my_c_function" ; (FUNCTION UTF8-STRING INT)) ; (MY-PKG::MY-PARAM)) ; --> SB-ALIEN-INTERNALS:NATURALIZE IF ; ==> ; NIL ; ; caught WARNING: ; This is not a (VALUES STRING &REST T): ; NIL ; See also: ; The SBCL Manual, Node "Handling of Types" I should use SB-ALIEN:CAST or COERCE? Thanks! -- WBR, Yaroslav Kavenchuk. |
From: Juho S. <js...@ik...> - 2006-04-07 10:06:28
|
<kav...@je...> wrote: > SBCL 0.9.11.8, mingw > > (declaim (inline my-func)) > (defun my-func () > (alien-funcall > (extern-alien "my_c_function" > (function utf8-string int)) > (my-param))) [...] > Why result type is not string (or compatible type)? If my_c_function returns a null pointer, my-func function will return NIL. (The code responsible for this is the UTF8-STRING :NATURALIZE-GEN alien type method in code/host-c-call.lisp). -- Juho Snellman |