This is the mail archive of the guile@sourceware.cygnus.com mailing list for the Guile project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

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)))

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]