Urs Liska <u...@openlilylib.org> writes: > It seems I'm now at a similar point in C++ Guile (scm_whatsoever) as I > was with Guile Scheme at an earlier stage :-( > > SCM subdivide_details = > scm_assq_ref (beam_settings_, ly_symbol2scm ("subdivide-details")); > > seems to fetch the right thing, namely something like > '((beam-count . metric)) > > But then I start to get lost. > I would expect > > SCM beam_count_prop = > scm_assq_ref (subdivide_details, ly_symbol2scm ("beam-count")); > > to assign beam_count_prop a symbol "metric" - as I get when I do the > same thing in Scheme.
It does. > However, from there I don't get any further, and it seems I totally > don't understand how the Scheme types are matched in C++. > Any attempt to compare the content of beam_count_prop with a set of > predefined values seems to fail, and even > > if (scm_equal_p (ly_symbol2scm ("one"), ly_symbol2scm ("two"))) > > returns true (using scm_equal_p equally as for the eq and eqv > versions. It does not return true but SCM_BOOL_F. Which you then convert to a true C++ boolean since it is non-zero. You want if (scm_is_eq (... )) instead: predicates with name xxx_is_yyy return a C (or C++) boolean. Predicates with name xxx_p return an SCM boolean which you need to convert to a C++ boolean using, for example, scm_is_true. > I would have expected that > > beaming_options_.subdivided_beam_count_ = > (scm_eqv_p (ly_symbol2scm("one"), ly_symbol2scm("one"))) > ? ONE > : (scm_eqv_p (subdiv_beam_count_prop, > ly_symbol2scm("base-moment"))) > ? BASE_MOMENT > : METRIC; > > would assing the (new) member subdivided_beam_count one out of the three > constants, depending on the value of the property: This isn't Emacs Lisp (which has a clever definition of nil, which in Lisp serves both the functions of #f and '()). SCM_BOOL_F as a C condition is _true_ rather than false. -- David Kastrup _______________________________________________ lilypond-user mailing list lilypond-user@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-user