+unsigned int ly_scm_hash (SCM s);
+
+SCM index_get_cell (SCM cell, Direction d);
+SCM index_set_cell (SCM cell, Direction d, SCM val);
+
+
+
+SCM ly_snoc (SCM s, SCM list);
+SCM ly_split_list (SCM s, SCM list);
+SCM ly_unique (SCM list);
+/*
+ snarfing.
+ */
+void add_scm_init_func (void (*) ());
+
+
+typedef SCM (*Scheme_function_unknown) ();
+
+#if __GNUC__ > 2 || __GNUC_MINOR__ >= 96
+typedef SCM (*Scheme_function_0) ();
+typedef SCM (*Scheme_function_1) (SCM);
+typedef SCM (*Scheme_function_2) (SCM,SCM);
+typedef SCM (*Scheme_function_3) (SCM,SCM, SCM);
+#else
+typedef SCM (*Scheme_function_0) (...);
+typedef SCM (*Scheme_function_1) (...);
+typedef SCM (*Scheme_function_2) (...);
+typedef SCM (*Scheme_function_3) (...);
+#endif
+
+#define DECLARE_SCHEME_CALLBACK(NAME,ARGS) \
+ static SCM NAME ARGS; \
+ static SCM NAME ## _proc
+
+#define MAKE_SCHEME_CALLBACK(TYPE, FUNC, ARGCOUNT) \
+SCM TYPE :: FUNC ## _proc;\
+void \
+TYPE ## _ ## FUNC ## _init_functions () \
+{ \
+ TYPE :: FUNC ## _proc = gh_new_procedure ## ARGCOUNT ## _0 (#TYPE "::" #FUNC, \
+ ((Scheme_function_ ## ARGCOUNT)TYPE :: FUNC)); \
+} \
+ \
+ADD_SCM_INIT_FUNC (TYPE ## _ ## FUNC ## _callback, TYPE ## _ ## FUNC ## _init_functions); \
+
+
+void ly_add_function_documentation (char const * fname,
+ char const * varlist,
+ char const * doc);
+
+#define ADD_SCM_INIT_FUNC(name, func)\
+class name ## _scm_initter { \
+public:\
+ name ## _scm_initter () \
+ { \
+ add_scm_init_func (func); \
+ } \
+} _ ## name ## _scm_initter; \
+/* end define */
+
+#define LY_DEFINE(FNAME, PRIMNAME, REQ, OPT, VAR, ARGLIST, DOCSTRING) \
+SCM FNAME ARGLIST ; \
+SCM FNAME ## _proc;\
+void \
+FNAME ## init ()\
+{\
+ FNAME ## _proc \
+ = scm_c_define_gsubr (PRIMNAME,REQ, OPT, VAR, (Scheme_function_unknown) FNAME);\
+ ly_add_function_documentation (PRIMNAME, #ARGLIST, DOCSTRING);\
+}\
+ADD_SCM_INIT_FUNC (FNAME ## init_unique_prefix, FNAME ## init);\
+SCM \
+FNAME ARGLIST\
+
+
+