This is the mail archive of the
guile@sourceware.cygnus.com
mailing list for the Guile project.
Re: Suggestion: new snarf macro set
Hello,
Okay, this is my third suggestion of the new snarf macro set:
SCM_SNARF_DECL (was SCM_HERE)
SCM_SNARF_INIT
SCM_SNARF_DOCS
SCM_SNARF_CAST (was SCM_FUNC_CAST_ARBITRARY_ARGS)
SCM_DEFINE_PROCEDURE
SCM_DEFINE_PROCEDURE_ALIAS
SCM_DEFINE_RELATION
SCM_DEFINE_ACCUMULATION
SCM_DEFINE_GENERIC_PROCEDURE
SCM_DEFINE_GENERIC_RELATION
SCM_DEFINE_GENERIC_ACCUMULATION
SCM_DEFINE_GENERIC_ARITHMETIC (was SCM_DEFINE_GENERIC_C_FUNCALL)
SCM_DEFINE_SYNTAX
SCM_DEFINE_MACRO (new)
SCM_DEFINE_MEMOIZING_MACRO (new)
SCM_DEFINE_VARIABLE
SCM_DEFINE_HOOK (new)
SCM_DEFINE_OBJECT
SCM_DEFINE_STATIC_OBJECT
SCM_DEFINE_SYMBOL
SCM_DEFINE_STATIC_SYMBOL
SCM_DEFINE_KEYWORD
SCM_DEFINE_STATIC_KEYWORD
Would it be better to have a C version of hook like SCM_DEFINE_C_HOOK?
And SCM_DEFINE_OBJECT could be SCM_DEFINE_C_VARIABLE or something.
I'd like to write a new guile-snarf command. Do I need to use awk?
I can write it in Perl, but I don't know how to use awk...
-- Kei
#ifndef SCM_MAGIC_SNARFER
# define SCM_SNARF_DECL(DECL) DECL
# define SCM_SNARF_INIT(CODE)
# define SCM_SNARF_DOCS(TYPE,NAME,DOCS)
#else
# define SCM_SNARF_DECL(DECL)
# define SCM_SNARF_INIT(CODE) %%% CODE %%%
# define SCM_SNARF_DOCS(TYPE,NAME,DOCS) \
$$$ NAME | TYPE | __FILE__:__LINE__ | @@@ DOCS @!!!
#endif
#if defined(__cplusplus) || defined(GUILE_CPLUSPLUS_SNARF)
#define SCM_SNARF_CAST SCM (*)(...)
#else
#define SCM_SNARF_CAST SCM (*)()
#endif
/* Define a Scheme procedure.
*/
#define SCM_DEFINE_PROCEDURE(CNAME, SNAME, REQ, OPT, VAR, ARGS, DOCS) \
SCM_SNARF_DECL( \
static const char s_ ## CNAME [] = SNAME; \
SCM CNAME ARGS \
) \
SCM_SNARF_INIT( \
scm_make_gsubr (s_ ## CNAME, REQ, OPT, VAR, (SCM_SNARF_CAST) CNAME); \
) \
SCM_SNARF_DOCS("primitive-procedure", SNAME, P #ARGS | REQ | OPT | VAR | DOCS)
/* Define an alias of a procedure.
*/
#define SCM_DEFINE_PROCEDURE_ALIAS(RANAME, SNAME, REQ, OPT, VAR, CFN, DOCS) \
SCM_SNARF_DECL( \
static const char RANAME[]=SNAME \
) \
SCM_SNARF_INIT( \
scm_make_gsubr (RANAME, REQ, OPT, VAR, (SCM_SNARF_CAST) CFN); \
) \
SCM_SNARF_DOCS("primitive-procedure", SNAME, DOCS)
/* Define a procedure of a certain type.
* This is internal use only.
*/
#define SCM_I_DEFINE_PROCEDURE(CNAME, SNAME, TYPE, ARGS, DOCS) \
SCM_SNARF_DECL( \
static const char s_ ## CNAME [] = SNAME; \
SCM CNAME ARGS \
) \
SCM_SNARF_INIT( \
scm_make_subr (s_ ## CNAME, TYPE, CNAME); \
) \
SCM_SNARF_DOCS("primitive-procedure", SNAME, 2 DOCS)
/* Define a relational predicate procedure.
*/
#define SCM_DEFINE_RELATION(CNAME, SNAME, ARGS, DOCS) \
SCM_I_DEFINE_PROCEDURE (CNAME, SNAME, scm_tc7_rpsubr, ARGS, DOCS)
/* Define an accumulative procedure.
*/
#define SCM_DEFINE_ACCUMULATION(CNAME, SNAME, ARGS, DOCS) \
SCM_I_DEFINE_PROCEDURE (CNAME, SNAME, scm_tc7_asubr, ARGS, DOCS)
/* Define a generic procedure.
*/
#define SCM_DEFINE_GENERIC_PROCEDURE(CNAME, SNAME, REQ, OPT, VAR, ARGS, DOCS) \
SCM_SNARF_DECL( \
static const char s_ ## CNAME [] = SNAME; \
static SCM g_ ## CNAME; \
SCM CNAME ARGS \
) \
SCM_SNARF_INIT( \
/* Dirk:FIXME:: Can we safely use #f instead of 0? */ \
g_ ## CNAME = SCM_PACK (0); \
scm_make_gsubr_with_generic (s_ ## CNAME, REQ, OPT, VAR, \
(SCM_SNARF_CAST) CNAME, &g_ ## CNAME); \
) \
SCM_SNARF_DOCS("primitive-procedure", SNAME, P #ARGS | REQ | OPT | VAR | DOCS)
/* Define a generic procedure of a certain type.
* This is internal use only.
*/
#define SCM_I_DEFINE_GENERIC_PROCEDURE(CNAME, SNAME, TYPE, ARGS, DOCS) \
SCM_SNARF_DECL( \
static const char s_ ## CNAME [] = SNAME; \
static SCM g_ ## CNAME; \
SCM CNAME ARGS \
) \
SCM_SNARF_INIT( \
g_ ## CNAME = SCM_PACK (0); /* FIXME: See SCM_DEFINE_GENERIC_PROCEDURE */ \
scm_make_subr_with_generic (s_ ## CNAME, TYPE, \
(SCM_SNARF_CAST) CNAME, &g_ ## CNAME); \
) \
SCM_SNARF_DOCS("primitive-procedure", SNAME, 2 DOCS)
/* Define a generic relational predicate procedure.
*/
#define SCM_DEFINE_GENERIC_RELATION(CNAME, SNAME, ARGS, DOCS) \
SCM_I_DEFINE_GENERIC_PROCEDURE (CNAME, SNAME, scm_tc7_rpsubr, ARGS, DOCS)
/* Define a generic accumulative procedure.
*/
#define SCM_DEFINE_GENERIC_ACCUMULATION(CNAME, SNAME, ARGS, DOCS) \
SCM_I_DEFINE_GENERIC_PROCEDURE (CNAME, SNAME, scm_tc7_asubr, ARGS, DOCS)
/* Define a generic arithmetical procedure.
*/
#define SCM_DEFINE_GENERIC_ARITHMETIC(CNAME, SNAME, ARGS, DOCS) \
SCM_I_DEFINE_GENERIC_PROCEDURE (CNAME, SNAME, scm_tc7_cxr, ARGS, DOCS)
/* Define a macro of a certain type.
* This is internal use only.
*/
#define SCM_I_DEFINE_MACRO(CNAME, SNAME, TYPE, ARGS, DOCS) \
SCM_SNARF_DECL( \
static const char s_ ## CNAME [] = SNAME; \
SCM CNAME ARGS \
) \
SCM_SNARF_INIT( \
scm_make_synt (s_ ## CNAME, TYPE, (SCM_SNARF_CAST) CNAME); \
) \
SCM_SNARF_DOCS("primitive-macro", SNAME, M DOCS)
/* Define a Scheme syntax.
*/
#define SCM_DEFINE_SYNTAX(CNAME, SNAME, ARGS, DOCS) \
SCM_I_DEFINE_MACRO (CNAME, SNAME, scm_makacro, ARGS, DOCS)
/* Define a Scheme macro.
*/
#define SCM_DEFINE_MACRO(CNAME, SNAME, ARGS, DOCS) \
SCM_I_DEFINE_MACRO (CNAME, SNAME, scm_makmacro, ARGS, DOCS)
/* Define a Scheme memoizing macro.
*/
#define SCM_DEFINE_MEMOIZING_MACRO(CNAME, SNAME, ARGS, DOCS) \
SCM_I_DEFINE_MACRO (CNAME, SNAME, scm_makmmacro, ARGS, DOCS)
/* Define a Scheme variable.
*/
#define SCM_DEFINE_VARIABLE(CNAME, SNAME, VALUE) \
SCM_SNARF_DECL( \
SCM CNAME \
) \
SCM_SNARF_INIT( \
CNAME = scm_permanent_object (scm_intern0 (SNAME)); \
SCM_SETCDR (CNAME, VALUE); \
) \
SCM_SNARF_DOCS("primitive-variable", SNAME, V DOCS)
/* Define a Scheme hook.
*/
#define SCM_DEFINE_HOOK(CNAME, SNAME, NARGS) \
SCM_SNARF_DECL( \
SCM CNAME \
) \
SCM_SNARF_INIT( \
CNAME = scm_create_hook (SNAME, NARGS); \
) \
SCM_SNARF_DOCS("primitive-hook", SNAME, H DOCS)
/* Create a Scheme object and define a C variable.
*/
#define SCM_DEFINE_OBJECT(CNAME, VALUE) \
SCM_SNARF_DECL(SCM CNAME) \
SCM_SNARF_INIT(CNAME = scm_permanent_object (VALUE))
/* Create a Scheme object and define a static C variable.
*/
#define SCM_DEFINE_STATIC_OBJECT(CNAME, VALUE) \
SCM_SNARF_DECL(static SCM CNAME) \
SCM_SNARF_INIT(CNAME = scm_permanent_object (VALUE))
/* Create a Scheme symbol and define a C variable.
*/
#define SCM_DEFINE_SYMBOL(CNAME, SNAME) \
SCM_DEFINE_OBJECT (CNAME, SCM_CAR (scm_intern0 (SNAME)))
/* Create a Scheme symbol and define a static C variable.
*/
#define SCM_DEFINE_STATIC_SYMBOL(CNAME, SNAME) \
SCM_DEFINE_STATIC_OBJECT (CNAME, SCM_CAR (scm_intern0 (SNAME)))
/* Create a Scheme keyword and define a C variable.
*/
#define SCM_DEFINE_KEYWORD(CNAME, SNAME) \
SCM_DEFINE_OBJECT (CNAME, SCM_CAR (scm_c_make_keyword (SNAME)))
/* Create a Scheme keyword and define a static C variable.
*/
#define SCM_DEFINE_STATIC_KEYWORD(CNAME, SNAME) \
SCM_DEFINE_STATIC_OBJECT (CNAME, SCM_CAR (scm_c_make_keyword (SNAME)))