1
0
Fork 0
cl-sites/guile.html_node/Accessing-Modules-from-C.html
2024-12-17 12:49:28 +01:00

246 lines
21 KiB
HTML

<!DOCTYPE html>
<html>
<!-- Created by GNU Texinfo 7.1, https://www.gnu.org/software/texinfo/ -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<!-- This manual documents Guile version 3.0.10.
Copyright (C) 1996-1997, 2000-2005, 2009-2023 Free Software Foundation,
Inc.
Copyright (C) 2021 Maxime Devos
Copyright (C) 2024 Tomas Volf
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no
Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A
copy of the license is included in the section entitled "GNU Free
Documentation License." -->
<title>Accessing Modules from C (Guile Reference Manual)</title>
<meta name="description" content="Accessing Modules from C (Guile Reference Manual)">
<meta name="keywords" content="Accessing Modules from C (Guile Reference Manual)">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content=".texi2any-real">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link href="index.html" rel="start" title="Top">
<link href="Concept-Index.html" rel="index" title="Concept Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Modules.html" rel="up" title="Modules">
<link href="provide-and-require.html" rel="next" title="provide and require">
<link href="Declarative-Modules.html" rel="prev" title="Declarative Modules">
<style type="text/css">
<!--
a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
div.example {margin-left: 3.2em}
span:hover a.copiable-link {visibility: visible}
strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
-->
</style>
<link rel="stylesheet" type="text/css" href="https://www.gnu.org/software/gnulib/manual.css">
</head>
<body lang="en">
<div class="subsection-level-extent" id="Accessing-Modules-from-C">
<div class="nav-panel">
<p>
Next: <a href="provide-and-require.html" accesskey="n" rel="next">provide and require</a>, Previous: <a href="Declarative-Modules.html" accesskey="p" rel="prev">Declarative Modules</a>, Up: <a href="Modules.html" accesskey="u" rel="up">Modules</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<h4 class="subsection" id="Accessing-Modules-from-C-1"><span>6.18.10 Accessing Modules from C<a class="copiable-link" href="#Accessing-Modules-from-C-1"> &para;</a></span></h4>
<p>The last sections have described how modules are used in Scheme code,
which is the recommended way of creating and accessing modules. You
can also work with modules from C, but it is more cumbersome.
</p>
<p>The following procedures are available.
</p>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-scm_005fc_005fcall_005fwith_005fcurrent_005fmodule"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_c_call_with_current_module</strong> <code class="def-code-arguments">(SCM <var class="var">module</var>, SCM (*<var class="var">func</var>)(void *), void *<var class="var">data</var>)</code><a class="copiable-link" href="#index-scm_005fc_005fcall_005fwith_005fcurrent_005fmodule"> &para;</a></span></dt>
<dd><p>Call <var class="var">func</var> and make <var class="var">module</var> the current module during the
call. The argument <var class="var">data</var> is passed to <var class="var">func</var>. The return
value of <code class="code">scm_c_call_with_current_module</code> is the return value of
<var class="var">func</var>.
</p></dd></dl>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-scm_005fpublic_005fvariable"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_public_variable</strong> <code class="def-code-arguments">(SCM <var class="var">module_name</var>, SCM <var class="var">name</var>)</code><a class="copiable-link" href="#index-scm_005fpublic_005fvariable"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005fc_005fpublic_005fvariable"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_c_public_variable</strong> <code class="def-code-arguments">(const char *<var class="var">module_name</var>, const char *<var class="var">name</var>)</code><a class="copiable-link" href="#index-scm_005fc_005fpublic_005fvariable"> &para;</a></span></dt>
<dd><p>Find a the variable bound to the symbol <var class="var">name</var> in the public
interface of the module named <var class="var">module_name</var>.
</p>
<p><var class="var">module_name</var> should be a list of symbols, when represented as a
Scheme object, or a space-separated string, in the <code class="code">const char *</code>
case. See <code class="code">scm_c_define_module</code> below, for more examples.
</p>
<p>Signals an error if no module was found with the given name. If
<var class="var">name</var> is not bound in the module, just returns <code class="code">#f</code>.
</p></dd></dl>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-scm_005fprivate_005fvariable"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_private_variable</strong> <code class="def-code-arguments">(SCM <var class="var">module_name</var>, SCM <var class="var">name</var>)</code><a class="copiable-link" href="#index-scm_005fprivate_005fvariable"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005fc_005fprivate_005fvariable"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_c_private_variable</strong> <code class="def-code-arguments">(const char *<var class="var">module_name</var>, const char *<var class="var">name</var>)</code><a class="copiable-link" href="#index-scm_005fc_005fprivate_005fvariable"> &para;</a></span></dt>
<dd><p>Like <code class="code">scm_public_variable</code>, but looks in the internals of the
module named <var class="var">module_name</var> instead of the public interface.
Logically, these procedures should only be called on modules you write.
</p></dd></dl>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-scm_005fpublic_005flookup"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_public_lookup</strong> <code class="def-code-arguments">(SCM <var class="var">module_name</var>, SCM <var class="var">name</var>)</code><a class="copiable-link" href="#index-scm_005fpublic_005flookup"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005fc_005fpublic_005flookup"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_c_public_lookup</strong> <code class="def-code-arguments">(const char *<var class="var">module_name</var>, const char *<var class="var">name</var>)</code><a class="copiable-link" href="#index-scm_005fc_005fpublic_005flookup"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005fprivate_005flookup"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_private_lookup</strong> <code class="def-code-arguments">(SCM <var class="var">module_name</var>, SCM <var class="var">name</var>)</code><a class="copiable-link" href="#index-scm_005fprivate_005flookup"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005fc_005fprivate_005flookup"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_c_private_lookup</strong> <code class="def-code-arguments">(const char *<var class="var">module_name</var>, const char *<var class="var">name</var>)</code><a class="copiable-link" href="#index-scm_005fc_005fprivate_005flookup"> &para;</a></span></dt>
<dd><p>Like <code class="code">scm_public_variable</code> or <code class="code">scm_private_variable</code>, but if
the <var class="var">name</var> is not bound in the module, signals an error. Returns a
variable, always.
</p>
<div class="example">
<pre class="example-preformatted">static SCM eval_string_var;
/* NOTE: It is important that the call to 'my_init'
happens-before all calls to 'my_eval_string'. */
void my_init (void)
{
eval_string_var = scm_c_public_lookup (&quot;ice-9 eval-string&quot;,
&quot;eval-string&quot;);
}
SCM my_eval_string (SCM str)
{
return scm_call_1 (scm_variable_ref (eval_string_var), str);
}
</pre></div>
</dd></dl>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-scm_005fpublic_005fref"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_public_ref</strong> <code class="def-code-arguments">(SCM <var class="var">module_name</var>, SCM <var class="var">name</var>)</code><a class="copiable-link" href="#index-scm_005fpublic_005fref"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005fc_005fpublic_005fref"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_c_public_ref</strong> <code class="def-code-arguments">(const char *<var class="var">module_name</var>, const char *<var class="var">name</var>)</code><a class="copiable-link" href="#index-scm_005fc_005fpublic_005fref"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005fprivate_005fref"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_private_ref</strong> <code class="def-code-arguments">(SCM <var class="var">module_name</var>, SCM <var class="var">name</var>)</code><a class="copiable-link" href="#index-scm_005fprivate_005fref"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005fc_005fprivate_005fref"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_c_private_ref</strong> <code class="def-code-arguments">(const char *<var class="var">module_name</var>, const char *<var class="var">name</var>)</code><a class="copiable-link" href="#index-scm_005fc_005fprivate_005fref"> &para;</a></span></dt>
<dd><p>Like <code class="code">scm_public_lookup</code> or <code class="code">scm_private_lookup</code>, but
additionally dereferences the variable. If the variable object is
unbound, signals an error. Returns the value bound to <var class="var">name</var> in
<var class="var">module_name</var>.
</p></dd></dl>
<p>In addition, there are a number of other lookup-related procedures. We
suggest that you use the <code class="code">scm_public_</code> and <code class="code">scm_private_</code>
family of procedures instead, if possible.
</p>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-scm_005fc_005flookup"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_c_lookup</strong> <code class="def-code-arguments">(const char *<var class="var">name</var>)</code><a class="copiable-link" href="#index-scm_005fc_005flookup"> &para;</a></span></dt>
<dd><p>Return the variable bound to the symbol indicated by <var class="var">name</var> in the
current module. If there is no such binding or the symbol is not
bound to a variable, signal an error.
</p></dd></dl>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-scm_005flookup"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_lookup</strong> <code class="def-code-arguments">(SCM <var class="var">name</var>)</code><a class="copiable-link" href="#index-scm_005flookup"> &para;</a></span></dt>
<dd><p>Like <code class="code">scm_c_lookup</code>, but the symbol is specified directly.
</p></dd></dl>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-scm_005fc_005fmodule_005flookup"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_c_module_lookup</strong> <code class="def-code-arguments">(SCM <var class="var">module</var>, const char *<var class="var">name</var>)</code><a class="copiable-link" href="#index-scm_005fc_005fmodule_005flookup"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005fmodule_005flookup"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_module_lookup</strong> <code class="def-code-arguments">(SCM <var class="var">module</var>, SCM <var class="var">name</var>)</code><a class="copiable-link" href="#index-scm_005fmodule_005flookup"> &para;</a></span></dt>
<dd><p>Like <code class="code">scm_c_lookup</code> and <code class="code">scm_lookup</code>, but the specified
module is used instead of the current one.
</p></dd></dl>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-scm_005fmodule_005fvariable"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_module_variable</strong> <code class="def-code-arguments">(SCM <var class="var">module</var>, SCM <var class="var">name</var>)</code><a class="copiable-link" href="#index-scm_005fmodule_005fvariable"> &para;</a></span></dt>
<dd><p>Like <code class="code">scm_module_lookup</code>, but if the binding does not exist, just
returns <code class="code">#f</code> instead of raising an error.
</p></dd></dl>
<p>To define a value, use <code class="code">scm_define</code>:
</p>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-scm_005fc_005fdefine-1"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_c_define</strong> <code class="def-code-arguments">(const char *<var class="var">name</var>, SCM <var class="var">val</var>)</code><a class="copiable-link" href="#index-scm_005fc_005fdefine-1"> &para;</a></span></dt>
<dd><p>Bind the symbol indicated by <var class="var">name</var> to a variable in the current
module and set that variable to <var class="var">val</var>. When <var class="var">name</var> is already
bound to a variable, use that. Else create a new variable.
</p></dd></dl>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-scm_005fdefine-1"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_define</strong> <code class="def-code-arguments">(SCM <var class="var">name</var>, SCM <var class="var">val</var>)</code><a class="copiable-link" href="#index-scm_005fdefine-1"> &para;</a></span></dt>
<dd><p>Like <code class="code">scm_c_define</code>, but the symbol is specified directly.
</p></dd></dl>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-scm_005fc_005fmodule_005fdefine"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_c_module_define</strong> <code class="def-code-arguments">(SCM <var class="var">module</var>, const char *<var class="var">name</var>, SCM <var class="var">val</var>)</code><a class="copiable-link" href="#index-scm_005fc_005fmodule_005fdefine"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005fmodule_005fdefine"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_module_define</strong> <code class="def-code-arguments">(SCM <var class="var">module</var>, SCM <var class="var">name</var>, SCM <var class="var">val</var>)</code><a class="copiable-link" href="#index-scm_005fmodule_005fdefine"> &para;</a></span></dt>
<dd><p>Like <code class="code">scm_c_define</code> and <code class="code">scm_define</code>, but the specified
module is used instead of the current one.
</p></dd></dl>
<p>In some rare cases, you may need to access the variable that
<code class="code">scm_module_define</code> would have accessed, without changing the
binding of the existing variable, if one is present. In that case, use
<code class="code">scm_module_ensure_local_variable</code>:
</p>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-scm_005fmodule_005fensure_005flocal_005fvariable"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_module_ensure_local_variable</strong> <code class="def-code-arguments">(SCM <var class="var">module</var>, SCM <var class="var">sym</var>)</code><a class="copiable-link" href="#index-scm_005fmodule_005fensure_005flocal_005fvariable"> &para;</a></span></dt>
<dd><p>Like <code class="code">scm_module_define</code>, but if the <var class="var">sym</var> is already locally
bound in that module, the variable&rsquo;s existing binding is not reset.
Returns a variable.
</p></dd></dl>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-scm_005fmodule_005freverse_005flookup"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_module_reverse_lookup</strong> <code class="def-code-arguments">(SCM <var class="var">module</var>, SCM <var class="var">variable</var>)</code><a class="copiable-link" href="#index-scm_005fmodule_005freverse_005flookup"> &para;</a></span></dt>
<dd><p>Find the symbol that is bound to <var class="var">variable</var> in <var class="var">module</var>. When no such binding is found, return <code class="code">#f</code>.
</p></dd></dl>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-scm_005fc_005fdefine_005fmodule"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_c_define_module</strong> <code class="def-code-arguments">(const char *<var class="var">name</var>, void (*<var class="var">init</var>)(void *), void *<var class="var">data</var>)</code><a class="copiable-link" href="#index-scm_005fc_005fdefine_005fmodule"> &para;</a></span></dt>
<dd><p>Define a new module named <var class="var">name</var> and make it current while
<var class="var">init</var> is called, passing it <var class="var">data</var>. Return the module.
</p>
<p>The parameter <var class="var">name</var> is a string with the symbols that make up
the module name, separated by spaces. For example, &lsquo;<samp class="samp">&quot;foo bar&quot;</samp>&rsquo; names
the module &lsquo;<samp class="samp">(foo bar)</samp>&rsquo;.
</p>
<p>When there already exists a module named <var class="var">name</var>, it is used
unchanged, otherwise, an empty module is created.
</p></dd></dl>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-scm_005fc_005fresolve_005fmodule"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_c_resolve_module</strong> <code class="def-code-arguments">(const char *<var class="var">name</var>)</code><a class="copiable-link" href="#index-scm_005fc_005fresolve_005fmodule"> &para;</a></span></dt>
<dd><p>Find the module name <var class="var">name</var> and return it. When it has not
already been defined, try to auto-load it. When it can&rsquo;t be found
that way either, create an empty module. The name is interpreted as
for <code class="code">scm_c_define_module</code>.
</p></dd></dl>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-scm_005fc_005fuse_005fmodule"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_c_use_module</strong> <code class="def-code-arguments">(const char *<var class="var">name</var>)</code><a class="copiable-link" href="#index-scm_005fc_005fuse_005fmodule"> &para;</a></span></dt>
<dd><p>Add the module named <var class="var">name</var> to the uses list of the current
module, as with <code class="code">(use-modules <var class="var">name</var>)</code>. The name is
interpreted as for <code class="code">scm_c_define_module</code>.
</p></dd></dl>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-scm_005fc_005fexport"><span class="category-def">C Function: </span><span><code class="def-type">void</code> <strong class="def-name">scm_c_export</strong> <code class="def-code-arguments">(const char *<var class="var">name</var>, ...)</code><a class="copiable-link" href="#index-scm_005fc_005fexport"> &para;</a></span></dt>
<dd><p>Add the bindings designated by <var class="var">name</var>, ... to the public interface
of the current module. The list of names is terminated by
<code class="code">NULL</code>.
</p></dd></dl>
</div>
<hr>
<div class="nav-panel">
<p>
Next: <a href="provide-and-require.html">provide and require</a>, Previous: <a href="Declarative-Modules.html">Declarative Modules</a>, Up: <a href="Modules.html">Modules</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html" title="Index" rel="index">Index</a>]</p>
</div>
</body>
</html>