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.