I'm just re-stating this to make sure I'm getting it right: Definitions are lazy, and the expression in front of # is lazy too, so it gets a chance to see the definition once it's done? Am I right?
That's good to know! On Sat, Oct 2, 2021 at 4:00 PM David Kastrup <d...@gnu.org> wrote: > "Omid Mo'menzadeh" <omid.mnza...@gmail.com> writes: > > > Of course!I just attached two files that demonstrate the difference. > > > > On Sat, Oct 2, 2021 at 3:30 PM David Kastrup <d...@gnu.org> wrote: > > > >> "Omid Mo'menzadeh" <omid.mnza...@gmail.com> writes: > >> > >> > I didn't know about $ at all! Where in the documentation can I find > more > >> > about it? It was hard to search for! > >> > > >> > I tried it, but it doesn't seem to find my variable "vocal" defined in > >> the > >> > same .ily file. I tried using #(top-repl) and $(top-repl) too, in the > # > >> > version it knows what \vocal is, but in the $ version it doesn't. > >> > >> How about a minimal example exhibiting the problem? > >> > >> -- > >> David Kastrup > >> > > > > \version "2.22.1" > > > > vocal = \relative c'' { > > a4 b c d | > > } > > > > $(if (not (defined? 'is-loaded-file)) #{ \score { \vocal } #}) > > Well, that one's a timing problem. You couldn't write > > vocal = \relative c'' { > a4 b c d | > } > > \vocal > > either. The reason is that the assignment is not complete before > LilyPond has a chance to check whether something like \addlyrics { Ah } > follows, and so when it looks at the next thing that comes up to make > that decision, \vocal is not yet defined. So there really needs to be > anything after that assignment that does not immediately reference > \vocal . > > With #, LilyPond does not allow different syntactic functionality, so > when it sees # it does not bother evaluating it until after it has > completed the assignment, being sure that it won't have to add something > like \addlyrics ... to the expression to be assigned. > > This is one case where minimal examples tend to fail more often than > actual use of assigned variables in practice, because usually when you > employ variables seriously, you don't reference them immediately right > afterwards. > > -- > David Kastrup >