If the visibility of PredSpec is not declared, it is set to local.
If necessary, an underscore is prepended to CName to get its form as used by the C compiler.
If a call to PredSpec has already been compiled as a deterministic external call, error 62 is raised (``inconsistent procedure redefinition''). This can be prevented by defining the external before compiling any call to it or by using the declaration predicate b_external/1.
% file to create an external predicate.
% cat sin.c
% external.h contains the macros for the external interface.
#include "external.h"
#include <math.h>
p_sines(vel, tel, vlist, tlist)
value vel, vlist;
type tel, tlist;
{
pword *p;
Error_If_Ref(tlist);
if (IsNil(tlist))
{
Fail;
}
Check_List(tlist);
p = vlist.ptr + 1;
Dereference(p);
Remember(2, p->val, p->tag);
Dereference(vlist.ptr);
Check_Float(vlist.ptr->tag);
Return_Unify_Float(vel, tel,
(float)sin(((vlist.ptr->val.real)*3.1415926535)/180.0));
}
% compile with ECLiPSe include files.
% cc -c -I/usr/local/ECLIPSE/include sin.c
% eclipse
% load the .o file dynamically into the system with math option.
[eclipse]: load('sin.o',"-lm").
yes.
% link the object file with a predicate definition.
[eclipse]: b_external(sines/2,p_sines).
yes.
% check on existence and flags of sines/2.
[eclipse]: get_flag(sines/2, type, T),
get_flag(sines/2, call_type, C_type),
get_flag(sines/2, visibility, Vis).
T = user
C_type = b_external
Vis = local More? (;)
yes.
% use sines/2.
[eclipse]: sines(E,[0.0,45.0,90.0,270.0]).
E = 0.0 More? (;)
E = 0.707107 More? (;)
E = 1.0 More? (;)
E = -1.0 More? (;)
no (more) solution.
Error:
b_external(p/0, S). (Error 4).
b_external(PredSpec, p_pred). (Error 4).
b_external("p/0", p_p0). (Error 5).
b_external(p/0, 123). (Error 5).
[eclipse]: [user].
:- external(a/0, c_a). % should use b_external/1.
p :- a.
user compiled 60 bytes in 0.00 seconds
yes.
[eclipse]: b_external(a/0, c_a). (Error 62).
b_external(mess/1,"p_messg"). (Error 211).
% call load/1,2 first.