2 chained-callback.cc -- chained callbacks.
4 source file of the GNU LilyPond music typesetter
6 (c) 2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
10 #include "lily-guile.hh"
12 static scm_t_bits chain_tag;
15 is_callback_chain (SCM s)
17 return (SCM_NIMP (s) && SCM_CELL_TYPE (s) == chain_tag);
21 callback_chain_extract_procedures (SCM chain_smob)
23 assert (is_callback_chain (chain_smob));
24 return (SCM) SCM_CELL_WORD_1(chain_smob);
27 LY_DEFINE(ly_callback_chain_p, "ly:callback-chain?",
31 return scm_from_bool (is_callback_chain (chain));
34 LY_DEFINE(ly_make_callback_chain, "ly:make-callback-chain",
35 0, 0, 1, (SCM procedures),
36 "Make a grob callback chain. @var{procedures} should be a "
37 "list of procedures taking 2 arguments.")
41 for (SCM s = procedures;
42 scm_is_pair (s); s = scm_cdr (s))
44 SCM proc = scm_car (s);
45 if (!ly_is_procedure (proc))
47 scm_misc_error ("Must be a procedure: ~a",
48 "ly:make-callback-chain",
52 if (procedure_arity (proc) != 2)
54 scm_misc_error ("Procedure should take 2 arguments: ~a",
55 "ly:make-callback-chain",
60 SCM_NEWSMOB(z, chain_tag, procedures);
65 print_callback_chain (SCM s, SCM port, scm_print_state *)
67 scm_puts ("#<callback-chain ", port);
68 scm_display (scm_cdr (s), port);
69 scm_puts (" >", port);
74 void init_chained_callback ()
76 chain_tag = scm_make_smob_type ("callback-chain", 0);
77 scm_set_smob_mark (chain_tag, scm_markcdr);
78 scm_set_smob_print (chain_tag, print_callback_chain);
83 ADD_SCM_INIT_FUNC(chain, init_chained_callback);