On 12/10/2011 15:52, Lars Hellström wrote: > Last week, I was reading up a bit on lambda calculus (a subject with > which I suspect there are list members far more familiar than I am). One > thing that caught my eye was the definitions of True and False, using > the so-called Church booleans > > True = \lambda xy . x > False = \lambda xy . y > > These may look strange, but turn out to be two objects that are very > familiar to us: \use_i:nn and \use_ii:nn respectively (or \@firstoftwo > and \@secondoftwo, for those who still think in 2e terms (like me)). > Indeed, putting my mind in LaTeX mode made the lambda calculus concepts > much easier to digest. > > But with such thinking comes also the converse association: might LaTeX > programming benefit from borrowing concepts from lambda calculus? In > particular: might the Church booleans be useful as general-purpose > booleans in LaTeX3?!? > > (A rather early thought then was that Frank's generation probably knows > all about lambda calculus and therefore must have thought about this > already. But I don't recall having seen it discussed anywhere.) > > One thing that is really nice about the Church booleans is how they > support the logical operations. One can define > > \cs_new:Npn \and:nnTF #1 #2 { #1 {#2} {\use_ii:nn} } > \cs_new:Npn \or:nnTF #1 #2 { #1 {\use_i:nn} {#2} } > \cs_new:Npn \not:nTF #1 { #1 {\use_ii:nn} {\use_i:nn} } > > and go > > \cs_set_eq:NN \foo_a_bool \use_i:nn > \cs_set_eq:NN \foo_b_bool \use_ii:nn > \or:nnTF { > \and:nnTF { \foo_a_bool } { \foo_b_bool } > } { > \not:nTF { \foo_b_bool } > } {True} {False} > > to get the correct result True. These \and:, \or:, and \not: can even > operate on general \...:TF constructions, and they work correctly > regardless of whether the \...:TF is expandable or needs to be executed! > (Like e.g. \regex_match:nnTF.) This is already much nicer than what one > can easily get from the primitive \if... \fi conditionals. Using this > for LaTeX3 booleans would also have the interesting property that > "predicates" and TF forms become the exact same thing! > > I can imagine that a downside of using this would be that it suggests a > coding style that could be considered "too exotic". It sometimes seems > that l3 tries to make things look very much like they would in a > traditional imperative programming language, even though what goes on > under the hood can be quite different. A concept like Church booleans > rather furthers functional idioms of programming, where a lot of the > "data" you pass around is also "functions" (or partially applied > functions), that can be applied with little or no syntactic framing in > the source code. > > Now I wonder: Would it be useful? (I think it would.) Would there still > be time to change? Does it seem worth it? One obvious question is how easy would it be to support predicate decision making in such as scheme: \bool_if:nTF { \l_my_first_bool && ( \l_my_second_bool && !\l_my_third_bool ) } which is one of the reasons for the approach currently taken. -- Joseph Wright