From: Mark Wooding Date: Tue, 22 Sep 2015 10:27:11 +0000 (+0100) Subject: doc/: More synopses. X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/sod/commitdiff_plain/756f4928a8846058be6b0a26475851a5d6fece84?ds=inline doc/: More synopses. --- diff --git a/doc/Makefile.am b/doc/Makefile.am index 882f01b..4e1f5f3 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -55,8 +55,8 @@ TEX_FILES += lispintro.tex TEX_FILES += misc.tex TEX_FILES += parsing.tex TEX_FILES += clang.tex -##TEX_FILES += meta.tex -##TEX_FILES += layout.tex +TEX_FILES += meta.tex +TEX_FILES += layout.tex ##TEX_FILES += module.tex ##TEX_FILES += ouptut.tex diff --git a/doc/clang.tex b/doc/clang.tex index 8f3c676..87a6b6e 100644 --- a/doc/clang.tex +++ b/doc/clang.tex @@ -716,6 +716,44 @@ function type is the type of the function's return value. \subsection{Parsing C types} \label{sec:clang.c-types.parsing} +\begin{describe}{fun} + {parse-c-type @ + @> @ @ @} +\end{describe} + +\begin{describe}{fun} + {parse-declarator @ @ \&key :kernel :abstractp + \nlret @ @ @} +\end{describe} + +\subsection{Class types} \label{sec:clang.c-types.class} + +\begin{describe}{cls} + {c-class-type (simple-c-type) \&key :class :tag :qualifiers :name} +\end{describe} + +\begin{describe*} + {\dhead{gf}{c-type-class @ @> @} + \dhead{gf}{setf (c-type-class @) @}} +\end{describe*} + +\begin{describe}{fun}{find-class-type @ @> @} +\end{describe} + +\begin{describe}{fun} + {make-class-type @ \&optional @ @> @} +\end{describe} + +\begin{describe}{fun} + {make-class-type @ \&optional @ @> @} +\end{describe} + +\begin{describe}{fun}{find-sod-class @ @> @} +\end{describe} + +\begin{describe}{fun}{record-sod-class @} +\end{describe} + %%%-------------------------------------------------------------------------- \section{Generating C code} \label{sec:clang.codegen} diff --git a/doc/layout.tex b/doc/layout.tex new file mode 100644 index 0000000..c4f095a --- /dev/null +++ b/doc/layout.tex @@ -0,0 +1,458 @@ +%%% -*-latex-*- +%%% +%%% Class layout and method combination protocols +%%% +%%% (c) 2015 Straylight/Edgeware +%%% + +%%%----- Licensing notice --------------------------------------------------- +%%% +%%% This file is part of the Sensble Object Design, an object system for C. +%%% +%%% SOD is free software; you can redistribute it and/or modify +%%% it under the terms of the GNU General Public License as published by +%%% the Free Software Foundation; either version 2 of the License, or +%%% (at your option) any later version. +%%% +%%% SOD is distributed in the hope that it will be useful, +%%% but WITHOUT ANY WARRANTY; without even the implied warranty of +%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +%%% GNU General Public License for more details. +%%% +%%% You should have received a copy of the GNU General Public License +%%% along with SOD; if not, write to the Free Software Foundation, +%%% Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +\chapter{Class layout and method combination} + +%%%-------------------------------------------------------------------------- +\section{Class layout protocol} \label{sec:layout.instance} + +\begin{describe}{fun}{islots-struct-tag @ @> @} +\end{describe} + +\begin{describe}{fun}{ichain-struct-tag @ @ @> @} +\end{describe} + +\begin{describe}{fun}{ichain-union-tag @ @ @> @} +\end{describe} + +\begin{describe}{fun}{ilayout-struct-tag @ @> @} +\end{describe} + +\begin{describe}{fun}{vtmsgs-struct-tag @ @ @> @} +\end{describe} + +\begin{describe}{fun}{vtable-union-tag @ @ @> @} +\end{describe} + +\begin{describe}{fun}{vtable-struct-tag @ @ @> @} +\end{describe} + +\begin{describe}{fun}{vtable-name @ @ @> @} +\end{describe} + +\begin{describe}{fun}{message-macro-name @ @ @> @} +\end{describe} + +\begin{describe}{cls}{effective-slot () \&key :class :slot :initializer} +\end{describe} + +\begin{describe*} + {\dhead{gf}{effective-slot-class @ @> @} + \dhead{gf}{effective-slot-direct-slot @ @> @} + \dhead{gf}{effective-slot-initializer @ @> @}} +\end{describe*} + +\begin{describe}{gf} + {find-slot-initializer @ @ @> @} +\end{describe} + +\begin{describe}{gf} + {compute-effective-slot @ @ @> @} +\end{describe} + +\begin{describe}{cls} + {sod-class-effective-slot (effective-slot) \\ \ind + \&key :class :slot :initializer-function :prepare-function} +\end{describe} + +\begin{describe*} + {\dhead{gf}{effective-slot-initializer-function @ @> @} + \dhead{gf}{effective-slot-prepare-function @ @> @}} +\end{describe*} + +\begin{describe}{cls}{islots () \&key :class :subclass :slots} +\end{describe} + +\begin{describe*} + {\dhead{gf}{islots-class @ @> @} + \dhead{gf}{islots-subclass @ @> @} + \dhead{gf}{islots-slots @ @> @}} +\end{describe*} + +\begin{describe}{gf}{compute-islots @ @ @> @} +\end{describe} + +\begin{describe}{gf}{vtable-pointer () \&key :class :chain-head :chain-tail} +\end{describe} + +\begin{describe*} + {\dhead{gf}{vtable-pointer-class @ @> @} + \dhead{gf}{vtable-pointer-chain-head @ @> @} + \dhead{gf}{vtable-pointer-chain-tail @ @> @}} +\end{describe*} + +\begin{describe}{gf}{ichain () \&key :class :chain-head :chain-tail :body} +\end{describe} + +\begin{describe*} + {\dhead{gf}{ichain-class @ @> @} + \dhead{gf}{ichain-chain-head @ @> @} + \dhead{gf}{ichain-chain-tail @ @> @} + \dhead{gf}{ichain-body @ @> @}} +\end{describe*} + +\begin{describe}{gf}{compute-ichain @ @ @> @} +\end{describe} + +\begin{describe}{gf}{ilayout () \&key :class :ichains} +\end{describe} + +\begin{describe*} + {\dhead{gf}{ilayout-class @ @> @} + \dhead{gf}{ilayout-ichains @ @> @}} +\end{describe*} + +\begin{describe}{gf}{compute-ilayout @ @> @} +\end{describe} + +\begin{describe}{cls} + {vtmsgs () \&key :class :subclass :chain-head :chain-tail :entries} +\end{describe} + +\begin{describe*} + {\dhead{gf}{vtmsgs-class @ @> @} + \dhead{gf}{vtmsgs-subclass @ @> @} + \dhead{gf}{vtmsgs-chain-head @ @> @} + \dhead{gf}{vtmsgs-chain-tail @ @> @} + \dhead{gf}{vtmsgs-entries @ @> @}} +\end{describe*} + +\begin{describe}{cls} + {class-pointer () \&key :class :chain-head :metaclass :meta-chain-head} +\end{describe} + +\begin{describe*} + {\dhead{gf}{class-pointer-class @ @> @} + \dhead{gf}{class-pointer-chain-head @ @> @} + \dhead{gf}{class-pointer-metaclass @ @> @} + \dhead{gf}{class-pointer-meta-chain-head @ @> @}} +\end{describe*} + +\begin{describe}{fun} + {make-class-pointer @ @ + @ @ + @> @} +\end{describe} + +\begin{describe}{cls}{base-offset () \&key :class :chain-head} +\end{describe} + +\begin{describe*} + {\dhead{gf}{base-offset-class @ @> @} + \dhead{gf}{base-offset-chain-head @ @> @}} +\end{describe*} + +\begin{describe}{fun} + {make-base-offset @ @ @> @} +\end{describe} + +\begin{describe}{cls}{chain-offset () \&key :class :chain-head :target-head} +\end{describe} + +\begin{describe*} + {\dhead{gf}{chain-offset-class @ @> @} + \dhead{gf}{chain-offset-chain-head @ @> @} + \dhead{gf}{chain-offset-target-head @ @> @}} +\end{describe*} + +\begin{describe}{fun} + {make-chain-offset @ @ @ + @> @} +\end{describe} + +\begin{describe}{gf}{vtable () \&key :class :chain-head :chain-tail :body} +\end{describe} + +\begin{describe*} + {\dhead{gf}{vtable-class @ @> @} + \dhead{gf}{vtable-chain-head @ @> @} + \dhead{gf}{vtable-chain-tail @ @> @} + \dhead{gf}{vtable-body @ @> @}} +\end{describe*} + +\begin{describe}{gf} + {compute-vtable-items @ @ + @ @ + @} +\end{describe} + +\begin{describe}{gf}{compute-vtable @ @ @> @} +\end{describe} + +\begin{describe}{gf}{compute-vtables @ @> @} +\end{describe} + +%%%-------------------------------------------------------------------------- +\section{Method combination} \label{sec:layout.methods} + +\begin{describe}{cls}{effective-method () \&key :message :class} +\end{describe} + +\begin{describe*} + {\dhead{gf}{effective-method-message @ @> @} + \dhead{gf}{effective-method-class @ @> @}} +\end{describe*} + +\begin{describe}{gf}{message-effective-method-class @ @> @} +\end{describe} + +\begin{describe}{gf}{primary-method-class @ @> @} +\end{describe} + +\begin{describe}{gf} + {compute-sod-effective-method @ @ @> @} +\end{describe} + +\begin{describe}{gf}{compute-effective-methods @ @> @} +\end{describe} + +\begin{describe}{cls} + {method-entry () \&key :method :chain-head :chain-tail :role} +\end{describe} + +\begin{describe*} + {\dhead{gf}{method-entry-effective-method @ @> @} + \dhead{gf}{method-entry-chain-head @ @> @} + \dhead{gf}{method-entry-chain-tail @ @> @} + \dhead{gf}{method-entry-role @ @> @}} +\end{describe*} + +\begin{describe}{gf} + {make-method-entries @ @ @ + @> @} +\end{describe} + + +\begin{describe}{gf}{sod-message-argument-tail @ @> @} +\end{describe} + +\begin{describe}{gf}{sod-message-no-varargs-tail @ @> @} +\end{describe} + +\begin{describe}{gf}{sod-method-function-type @ @> @} +\end{describe} + +\begin{describe}{gf}{sod-method-next-method-type @ @> @} +\end{describe} + +\begin{describe}{gf}{sod-method-function-name @ @> @} +\end{describe} + +\begin{describe}{fun}{varargs-message-p @ @> @} +\end{describe} + +\begin{describe}{gf}{method-entry-function-type @ @> @} +\end{describe} + +\begin{describe}{gf}{method-entry-slot-name @ @> @} +\end{describe} + +\begin{describe}{gf} + {method-entry-slot-name-by-role @ @ @ @> @} +\end{describe} + +\begin{describe}{gf} + {effective-method-basic-argument-names @ @> @} +\end{describe} + + + +\begin{describe}{cls} + {method-codegen (codegen) \\ \ind + \&key :vars :insts :temp-index + :message :class :method :target} +\end{describe} + +\begin{describe*} + {\dhead{gf}{codegen-message @ @> @} + \dhead{gf}{codegen-class @ @> @} + \dhead{gf}{codegen-method @ @> @} + \dhead{gf}{codegen-target @ @> @}} +\end{describe*} + +\begin{describe*} + {\dhead{cls}{convert-to-ilayout-inst (inst)} + \dhead{fun} + {make-convert-to-ilayout-inst @ @ @}} + \begin{prog} + SOD_ILAYOUT(@, @, @) + \end{prog} +\end{describe*} + + +\begin{describe}{gf} + {compute-effective-method-body @ @ @} +\end{describe} + +\begin{describe}{gf}{simple-method-body @ @ @} +\end{describe} + +\begin{describe}{fun} + {invoke-method @ @ @ @} +\end{describe} + +\begin{describe}{fun}{ensure-ilayout-var @ @} +\end{describe} + +\begin{describe}{fun}{make-trampoline @ @ @} +\end{describe} + +\begin{describe}{gf}{effective-method-function-name @ @> @} +\end{describe} + +\begin{describe}{gf} + {method-entry-function-name @ @ @ @> @} +\end{describe} + +\begin{describe}{gf}{compute-method-entry-functions @ @> @} +\end{describe} + +\begin{describe}{fun} + {invoke-delegation-chain @ @ @ + @ @} +\end{describe} + +\begin{describe}{cls} + {basic-message (sod-message) \&key :name :location :class :type} +\end{describe} + +\begin{describe}{cls} + {simple-message (basic-message) \&key :name :location :class :type} +\end{describe} + +\begin{describe}{cls} + {basic-direct-method (sod-method) + \&key :message :location :class :type :body :role} +\end{describe} + +\begin{describe}{gf}{sod-method-role @ @> @} +\end{describe} + +\begin{describe}{cls} + {daemon-direct-method (basic-direct-method) \\ \ind + \&key :message :location :class :type :body :role} +\end{describe} + +\begin{describe}{cls} + {delegating-direct-method (basic-direct-method) \\ \ind + \&key :message :location :class :type :body :role} +\end{describe} + +\begin{describe}{cls} + {basic-effective-method (effective-method) \\ \ind + \&key :message :class :around-methods :before-methods :after-methods} +\end{describe} + +\begin{describe*} + {\dhead{gf} + {effective-method-around-methods @ @> @} + \dhead{gf} + {effective-method-before-methods @ @> @} + \dhead{gf} + {effective-method-after-methods @ @> @} + \dhead{gf}{effective-method-functions @ @> @}} +\end{describe*} + +\begin{describe}{cls} + {simple-effective-method (basic-effective-method) \\ \ind + \&key :message :class + :around-methods :before-methods :after-methods :primary-methods} +\end{describe} + +\begin{describe}{fun} + {basic-effective-method-body @ @ @ @} +\end{describe} + +\begin{describe}{cls} + {standard-message (simple-message) \&key :name :location :class :type} +\end{describe} + +\begin{describe}{cls} + {standard-effective-method (simple-effective-method) \\ \ind + \&key :message :class + :around-methods :before-methods :after-methods :primary-methods} +\end{describe} + +\begin{describe}{cls} + {aggregating-message (simple-message) + \&key :name :location :class :type :combination} +\end{describe} + +\begin{describe}{gf} + {aggregating-message-properties @ @ @> @} +\end{describe} + +\begin{describe}{gf} + {compute-aggregating-message-kernel + \=@ @ @ \+ \\ + @ @ \&key} +\end{describe} + +\begin{describe}{gf} + {check-aggregating-message-type @ @ @} +\end{describe} + +\begin{describe}{cls} + {aggregating-effective-method (simple-effective-method) \\ \ind + \&key :message :class + :around-methods :before-methods :after-methods :primary-methods} +\end{describe} + +\begin{describe}{mac} + {define-aggregating-method-combination @ \\ \ind\ind + ((@^*) + @[[ :codegen @ @! + :methods @ @]]) \- \\ + @[[ \=:properties (@{ (@{ @ @! (@[@@] @) @} + @ + @[@ + @[@@]@]) @}^*) @! \+ \\ + :return-type @ @! \\ + :around @ @! + :first-method @ @! + :method @ @]]} +\end{describe} + +%%% the method combination story +%% compute-effective-methods --> compute-sod-effective-method + +%% hook-output (basic-effective-method :c) +%% basic-effective-method.functions +%% compute-method-entry-functions +%% compute-effective-method-body +%% +%% compute-effective-method-body (simple-effective-method) +%% basic-effective-method-body +%% simple-method-body (standard-effective-method) +%% simple-method-body (aggregating-effective-method) +%% message-kernel-function + +%%%----- That's all, folks -------------------------------------------------- + +%%% Local variables: +%%% mode: LaTeX +%%% TeX-master: "sod.tex" +%%% TeX-PDF-mode: t +%%% End: diff --git a/doc/meta.tex b/doc/meta.tex new file mode 100644 index 0000000..7114312 --- /dev/null +++ b/doc/meta.tex @@ -0,0 +1,288 @@ +%%% -*-latex-*- +%%% +%%% Translation-time metaobjects +%%% +%%% (c) 2015 Straylight/Edgeware +%%% + +%%%----- Licensing notice --------------------------------------------------- +%%% +%%% This file is part of the Sensble Object Design, an object system for C. +%%% +%%% SOD is free software; you can redistribute it and/or modify +%%% it under the terms of the GNU General Public License as published by +%%% the Free Software Foundation; either version 2 of the License, or +%%% (at your option) any later version. +%%% +%%% SOD is distributed in the hope that it will be useful, +%%% but WITHOUT ANY WARRANTY; without even the implied warranty of +%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +%%% GNU General Public License for more details. +%%% +%%% You should have received a copy of the GNU General Public License +%%% along with SOD; if not, write to the Free Software Foundation, +%%% Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +\chapter{Translation-time metaobjects} \label{ch:meta} + +%%%-------------------------------------------------------------------------- +\section{Base metaobject classes} \label{sec:meta.classes} + +\begin{describe}{cls} + {sod-class () \\ \ind + \&key \=:name :nick :location :pset \+ \\ + :superclasses :link :metaclass \\ + :slots :instance-initializers :class-initializers \\ + :messages :methods} +\end{describe} + +\begin{describe*} + {\dhead{gf}{sod-class-name @ @> @} + \dhead{gf}{sod-class-nickname @ @> @} + \dhead{gf}{sod-class-direct-superclasses @ @> @} + \dhead{gf}{sod-class-chain-link @ @> @} + \dhead{gf}{sod-class-metaclass @ @> @} + \dhead{gf}{sod-class-slots @ @> @} + \dhead{gf}{setf (sod-class-slots @) @} + \dhead{gf}{sod-class-instance-initializers @ @> @} + \dhead{gf}{setf (sod-class-instance-initializers @) @} + \dhead{gf}{sod-class-class-initializers @ @> @} + \dhead{gf}{setf (sod-class-class-initializers @) @} + \dhead{gf}{sod-class-messages @ @> @} + \dhead{gf}{setf (sod-class-messages @) @} + \dhead{gf}{sod-class-methods @ @> @} + \dhead{gf}{setf (sod-class-methods @) @}} +\end{describe*} + +%% layout protocol +\begin{describe*} + {\dhead{gf}{sod-class-ilayout @> @} + \dhead{gf}{sod-class-effective-methods @ @> @} + \dhead{gf}{sod-class-vtables @ @> @}} +\end{describe*} + +\begin{describe}{gf}{guess-metaclass @ @> @} +\end{describe} + +\begin{describe}{fun} + {make-sod-class @ @ @ \&optional @ + @> @} +\end{describe} + +\begin{describe}{mac} + {define-sod-class @ (@^*) \\ \ind + @{ @ @ @}^* \\ + @^* \\ + @
^*} +\end{describe} + +\begin{describe*} + {\dhead{lmac}{slot @ @ @{ @ @ @}^*} + \dhead{lmac}{instance-initializer @ @ + @ @ + @{ @ @ @}^*} + \dhead{lmac}{class-initializer @ @ + @ @ + @{ @ @ @}^*} + \dhead{lmac}{message @ @ @{ @ @ @}^*} + \dhead{lmac}{method @ @ @ @ + @{ @ @ @}^*}} +\end{describe*} + +\begin{describe}{fun} + {find-superclass-by-nick @ @ @> @} +\end{describe} + +\begin{describe}{fun} + {sod-subclass-p @ @ @> @} +\end{describe} + +\begin{describe}{fun}{valid-name-p @ @> @} +\end{describe} + +\begin{describe}{fun}{find-root-superclass @ @> @} +\end{describe} + +\begin{describe}{fun}{find-root-metaclass @ @> @} +\end{describe} + +\begin{describe}{cls}{sod-slot () \&key :name :location :pset :class :type} +\end{describe} + +\begin{describe*} + {\dhead{gf}{sod-slot-name @ @> @} + \dhead{gf}{sod-slot-class @ @> @} + \dhead{gf}{sod-slot-type @ @> @}} +\end{describe*} + +\begin{describe}{gf} + {make-sod-slot @ @ @ @ \&optional @ + @> @} +\end{describe} + +\begin{describe*} + {\dhead{fun} + {find-instance-slot-by-name @ @ @ + @> @} + \dhead{fun} + {find-class-slot-by-name @ @ @ + @> @}} +\end{describe*} + +\begin{describe}{fun} + {find-instance-slot-by-name @ @ @ + @> @} +\end{describe} + +\begin{describe}{cls} + {sod-class-slot (sod-slot) \\ \ind + \&key :name :location :pset :class :type + :initializer-function :prepare-function} +\end{describe} + +\begin{describe*} + {\dhead{gf}{sod-slot-initializer-function @ @> @} + \dhead{gf}{sod-slot-prepare-function @ @> @}} +\end{describe*} + +\begin{describe*} + {\dhead{cls}{sod-initializer () + \&key :slot :location :class :value-kind :value-form} + \dhead{cls}{sod-instance-initializer (sod-initializer) + \&key :slot :location :class :value-kind :value-form} + \dhead{cls}{sod-class-initializer (sod-initializer) + \&key :slot :location :class :value-kind :value-form}} +\end{describe*} + +\begin{describe*} + {\dhead{gf}{sod-initializer-slot @ @> @} + \dhead{gf}{sod-initializer-value-kind @ @> @} + \dhead{gf}{sod-initializer-value-form @ @> @}} +\end{describe*} + +\begin{describe*} + {\dhead{gf} + {make-slot-instance-initializer \=@ @ @ + @ @ \+ \\ + @ \&optional @ \- + \nlret @} + \dhead{gf} + {make-slot-class-initializer \=@ @ @ + @ @ \+ \\ + @ \&optional @ \- + \nlret @}} +\end{describe*} + +\begin{describe}{gf} + {make-sod-initializer-using-slot \=@ @ @ + @ @ \+ \\ + @ \&optional @ \- + \nlret @} +\end{describe} + +\begin{describe}{cls}{sod-message () \&key :name :location :class :type} +\end{describe} + +\begin{describe*} + {\dhead{gf}{sod-message-name @ @> @} + \dhead{gf}{sod-message-class @ @> @} + \dhead{gf}{sod-message-type @ @> @}} +\end{describe*} + +\begin{describe}{gf} + {make-sod-message @ @ @ @ \&optional @ + @> @} +\end{describe} + +\begin{describe}{gf}{check-message-type @ @} +\end{describe} + +\begin{describe}{fun} + {find-message-by-name @ @ @ + @> @} +\end{describe} + +\begin{describe}{cls} + {sod-method () \&key :message :location :class :type :body} +\end{describe} + +\begin{describe*} + {\dhead{gf}{sod-method-message @ @> @} + \dhead{gf}{sod-method-class @ @> @} + \dhead{gf}{sod-method-type @ @> @} + \dhead{gf}{sod-method-body @ @> @}} +\end{describe*} + +\begin{describe}{gf} + {make-sod-method \=@ @ @ @ @ \+ \\ + @ \&optional @ \- + \nlret @} +\end{describe} + +\begin{describe}{gf} + {make-sod-method-using-message \=@ @ + @ @ \+ \\ + @ \&optional @ \- + \nlret @} +\end{describe} + +\begin{describe}{gf} + {sod-message-method-class @ @ @ @> @} +\end{describe} + +\begin{describe}{gf}{check-method-type @ @ @} +\end{describe} + +\begin{describe}{fun} + {argument-lists-compatible-p @ @ + @> @} +\end{describe} + +%%%-------------------------------------------------------------------------- +\section{Class finalization protocol} \label{sec:meta.finalization} + +\begin{describe*} + {\dhead{gf}{sod-class-precedence-list @> @} + \dhead{gf}{sod-class-type @ @> @} + \dhead{gf}{sod-class-chain-head @ @> @} + \dhead{gf}{sod-class-chain @ @> @} + \dhead{gf}{sod-class-chains @ @> @} + \dhead{gf}{sod-class-state @ @> @}} +\end{describe*} + +\begin{describe}{gf}{compute-cpl @ @> @} +\end{describe} + +\begin{describe}{gf}{compute-chains @ @> @} +\end{describe} + +\begin{describe}{gf}{check-sod-class @} +\end{describe} + +\begin{describe}{gf}{finalize-sod-class @} +\end{describe} + +\begin{describe}{fun}{clos-cpl @ @> @} +\end{describe} + +\begin{describe}{fun}{dylan-cpl @ @> @} +\end{describe} + +\begin{describe}{fun}{c3-cpl @ @> @} +\end{describe} + +\begin{describe}{fun}{flavors-cpl @ @> @} +\end{describe} + +\begin{describe}{fun}{python-cpl @ @> @} +\end{describe} + +\begin{describe}{fun}{l*loops-cpl @ @> @} +\end{describe} +%%%----- That's all, folks -------------------------------------------------- + +%%% Local variables: +%%% mode: LaTeX +%%% TeX-master: "sod.tex" +%%% TeX-PDF-mode: t +%%% End: