mirror of
https://gitlab.com/embeddable-common-lisp/ecl.git
synced 2026-01-12 20:31:55 -08:00
166 lines
8.8 KiB
XML
166 lines
8.8 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!DOCTYPE book [
|
|
<!ENTITY % eclent SYSTEM "ecl.ent">
|
|
%eclent;
|
|
]>
|
|
<book xmlns="http://docbook.org/ns/docbook" version="5.0" xml:lang="en">
|
|
<chapter xml:id="ansi.overview">
|
|
<title>Overview</title>
|
|
|
|
<section>
|
|
<title>Reading this manual</title>
|
|
|
|
<section>
|
|
<title>Common Lisp users</title>
|
|
|
|
<para>&ECL; supports all Common-Lisp data types exactly as defined
|
|
in the &ANSI;. All functions and macros are expected to behave as
|
|
described in that document and in the HyperSpec &HyperSpec; which
|
|
is the online version of &ANSI;. In other words, the Standard is
|
|
the basic reference for Common Lisp and also for &ECL;, and this
|
|
first part of the book just complements it, describing
|
|
implementation-specific features such as
|
|
<itemizedlist>
|
|
<listitem><para>Platform dependent limits.</para></listitem>
|
|
<listitem><para>Behavior which is marked as <quote>implementation specific</quote> in the standard.</para></listitem>
|
|
<listitem><para>Some corner cases which are not described in &ANSI;.</para></listitem>
|
|
<listitem><para>The philosophy behind certain implementation choices, etc.</para></listitem>
|
|
</itemizedlist>
|
|
</para>
|
|
|
|
<para>In order to aid in locating these differences, this first
|
|
part of the manual copies the structure of the &ANSI; standard,
|
|
having the same number of chapters, each one with a set of sections
|
|
documenting the implementation-specific details.</para>
|
|
|
|
</section>
|
|
|
|
<section>
|
|
<title>C/C++ programmers</title>
|
|
|
|
<para>The second goal of this document is to provide a reference
|
|
for C programmers that want to create, manipulate and operate with
|
|
Common Lisp programs at a lower level, or simply embedding &ECL; as
|
|
a library.</para>
|
|
|
|
<para>The C/C++ reference evolves in parallel with the Common Lisp
|
|
one, in the form of one section with the name "C Reference" for
|
|
each chapter of the &ANSI; standard. Much of what is presented in
|
|
those sections is redundant with the Common Lisp specification. In
|
|
particular, there is a one-to-one mapping between types and
|
|
functions which should be obvious given the rules explained in
|
|
<xref linkend="ansi.overview.c-dict"/>.</para>
|
|
|
|
<para>We must remark that the reference in this part of the manual
|
|
is not enough to know how to embed &ECL; in a program. In practice
|
|
the user or developer will also have to learn how to <link
|
|
linkend="ext.asdf">build programs</link>, <link
|
|
linkend="ext.ffi">interface with foreign libraries</link>, <link
|
|
linkend="ext.memory">manage memory</link>, etc. These concepts are
|
|
explained in a different part of the book.</para>
|
|
</section>
|
|
</section>
|
|
|
|
<section xml:id="ansi.overview.c-dict">
|
|
<title>C Reference</title>
|
|
|
|
<section xml:id="cl_object">
|
|
<title>One type for everything: <type>cl_object</type></title>
|
|
|
|
<para>&ECL; is designed around the basic principle that Common Lisp
|
|
already provides everything that a programmer could need, orienting
|
|
itself around the creation and manipulation of Common Lisp objects:
|
|
conses, arrays, strings, characters, ... When embedding &ECL; there
|
|
should be no need to use other C/C++ types, except when interfacing
|
|
data to and from those other languages.</para>
|
|
|
|
<para>All Common Lisp objects are represented internally through
|
|
the same C type, <type>cl_object</type>, which is either a pointer
|
|
to a union type or an integer, depending on the situation. While
|
|
the inner guts of this type are exposed through various headers,
|
|
the user should never rely on these details but rather use the
|
|
macros and functions that are listed in this manual</para>
|
|
|
|
<para>There are two types of Common Lisp objects: immediate and
|
|
memory allocated ones. Immediate types fit in the bits of the
|
|
<type>cl_object</type> word, and do not require the garbage
|
|
collector to be created. The list of such types may depend on the
|
|
platform, but it includes at least the <type>fixnum</type> and
|
|
<type>character</type> types.</para>
|
|
|
|
<para>Memory allocated types on the other hand require the use of
|
|
the garbage collector to be created. &ECL; abstracts this from the
|
|
user providing enough constructors, either in the form of Common
|
|
Lisp functions (<function>cl_make_array()</function>,
|
|
<function>cl_complex()</function>,...), or in the form of C/C++
|
|
constructors (<function>ecl_make_symbol()</function>, etc).</para>
|
|
|
|
<para>Memory allocated types must always be kept alive so that the
|
|
garbage collector does not reclaim them. This involves referencing
|
|
the object from one of the places that the collector scans:
|
|
<itemizedlist>
|
|
<listitem><para>The fields of an object (array, structure, etc) whic is itself alive.</para></listitem>
|
|
<listitem><para>A special variable or a constant.</para></listitem>
|
|
<listitem><para>The C stack (i.e. automatic variables in a function).</para></listitem>
|
|
<listitem><para>Global variables or pointers that have been registered with the garbage collector.</para></listitem>
|
|
</itemizedlist>
|
|
Further details will be provided in the section on <link linkend="ext.memory">Memory Management</link>.</para>
|
|
</section>
|
|
|
|
<section>
|
|
<title>Naming conventions</title>
|
|
|
|
<para>As explained in the introduction, each of the chapters in the
|
|
Common Lisp standard can also be implemented using C functions and
|
|
types. The mapping between both languages is done using a small set
|
|
of rules described below.</para>
|
|
<itemizedlist>
|
|
<listitem><para>Functions in the Common Lisp ("CL") package are prefixed with the characters "cl_", functions in the System ("SI") package are prefix with "si_", etc, etc.</para></listitem>
|
|
<listitem><para>If a function takes only a fixed number of arguments, it is mapped to a C function with also a fixed number of arguments. For instance, <symbol>COS</symbol> maps to <code>cl_object cl_cos(cl_object)</code>, which takes a single Lisp object and returns a Lisp object of type <type>FLOAT</type>.</para></listitem>
|
|
<listitem><para>If the function takes a variable number of arguments, its signature consists on an integer with the number of arguments and zero or more of required arguments and then a C vararg. This is the case of <code>cl_object cl_list(cl_narg narg, ...)</code>, which can be invoked without arguments, as in <code>cl_list(0)</code>, with one, <code>cl_list(1, a)</code>, etc.</para></listitem>
|
|
<listitem><para>Functions return at least one value, which is either the first value output by the function, or <symbol>NIL</symbol>. The extra values may be retrieved immediately after the function call using the function <link linkend="ecl_nth_value"><function>ecl_nth_value</function></link>.</para></listitem>
|
|
</itemizedlist>
|
|
<para>In addition to the Common Lisp core functions (cl_*), there exist functions which are devoted only to C/C++ programming, with tasks such as coercion of objects to and from C types, optimized functions, inlined macroexpansions, etc. These functions and macros typically carry the prefix "ecl_" or "ECL_" and only return one value, if any.</para>
|
|
</section>
|
|
|
|
<section xml:id="ansi.OCL">
|
|
<title>Only in Common Lisp</title>
|
|
|
|
<para>Some parts of the language are not available as C functions,
|
|
even though they can be used in Common Lisp programs. These parts
|
|
are either marked in the "ANSI Dictionary" sections using the tag
|
|
&OCL;, or they are simply not mentioned (macros and special
|
|
constructs). This typically happens with non-translatable
|
|
constructs such as</para>
|
|
<itemizedlist>
|
|
<listitem><para>Common Lisp macros such as <symbol>with-open-files</symbol>.</para></listitem>
|
|
<listitem><para>Common Lisp special forms, such as <symbol>cond</symbol></para></listitem>
|
|
<listitem><para>Common Lisp generic functions, which cannot be written in C because of their dynamical dispatch and automatic redefinition properties.</para></listitem>
|
|
</itemizedlist>
|
|
|
|
<para>In most of those cases there exist straightforward alternatives using the constructs and functions in &ECL;. For example, <symbol>unwind-protect</symbol> can be implemented using a C macro which is provided by &ECL;</para>
|
|
<programlisting>
|
|
cl_env_ptr env = ecl_process_env();
|
|
CL_UNWIND_PROTECT_BEGIN(env) {
|
|
/* protected code goes here */
|
|
} CL_UNWIND_PROTECT_EXIT {
|
|
/* exit code goes here */
|
|
} CL_UNWIND_PROTECT_END;
|
|
</programlisting>
|
|
|
|
<para>Common Lisp generic functions can be directly accessed using
|
|
<symbol>funcall</symbol> or <symbol>apply</symbol> and the function
|
|
name, as shown in the code below</para>
|
|
<programlisting>
|
|
cl_object name = ecl_make_symbol("MY-GENERIC-FUNCTION","CL-USER");
|
|
cl_object output = cl_funcall(2, name, argument);
|
|
</programlisting>
|
|
|
|
<para>Identifying these alternatives requires some knowledge of
|
|
Common Lisp, which is why it is recommended to approach the
|
|
embeddable components in &ECL; only when there is some familiarity
|
|
with the language.</para>
|
|
</section>
|
|
</section>
|
|
</chapter>
|
|
</book>
|