```lilypond
custom_bookpart = #(lambda args #{ \bookpart {...} #})
\book {
#(custom_bookpart "horn" \hn_movt_one)
}
```
I guess I was under the impression that anything you can create in lilypond syntax can be created (also in some cases mutated?) in corresponding scheme code, but I'm having a hard time figuring out how to inspect the objects that result from various expressions (lilypond or scheme). E.g.,
```
custom_bookpart = #(lambda _ #{ \bookpart { ... } #})
#(display (custom_bookpart))
```
displays: #<Book>
Where do I find documentation about what a #<Book> is, and/or how do I inspect its properties, etc.? Can I mutate this (i.e., add/remove bookparts)? Why don't I get a #<BookPart> instead? It also seems like I should be able to use this function as an _expression_ in my book definition, but it doesn't work.
2. Applying variadic arguments (i.e., "splat"). E.g., in Clojure, you can do something like this:
```clojure
(defmacro foo [& body]
`(+ 1 ~@body))
(macroexpand '(foo 2 3 4))
=> (+ 1 2 3 4)
```
I tried using `custom_bookpart = #(lambda args ...)` like:
```lilypond
custom_bookpart = #(lambda args
#{
\bookpart {
\header { instrument = #(car args) }
#(cdr args)
}
#})
```
but you can't just throw a list in right there, right? It would need to be expanded, in the `apply` sense. I assume Guile has macros, like Clojure, but I don't know how to use them yet. Would that path lead me to success here, though?
Thanks
Tom