Blog

New BoxLang Feature: Static Functional Binding to BIFs

Maria Jose Herrera July 29, 2024

Spread the word

Maria Jose Herrera

July 29, 2024

Spread the word


Share your thoughts

Elevate Your Functional Programming with BoxLang!

Functional programming and higher-order functions (that receive or return other functions) give us powerful ways to transform data on the fly with concise syntax. If I have an array of strings and want them all uppercased, I can write this:

[ "luis", "brad", "jon" ].map( name -> uCase( name ) )

In the example above, omitting the parentheses around our lambda argument name is supported by ACF, but not by Lucee. BoxLang, of course, allows this! We’re also using the lightweight lambda syntax with a “skinny arrow” (->). This has no scope binding like closures and performs faster.

Review Original Post

But wait, there’s more! You don’t have to declare a closure or lambda inline; you can reference another unary function object like this (unary means accepting a single argument):

function makeUpperCase( String arg ) {
  return uCase( arg )
}
[ "luis", "brad", "jon" ].map( makeUpperCase )

This requires even more boilerplate than the first option. Have you ever wished you could just pass in the uCase BIF (Built-In Function) directly? Introducing static functional binding to BIFs!

Try BoxLang

Static Functional Binding to BIFs

There’s already a precedent for binding to static methods on classes (whether Box Classes or Java classes) like this:

ClassName::methodName

Now, we’re introducing a variation for statically referencing a method from a global scope where we omit the class name entirely:

::methodName

This expression yields an invocable BoxLang function that can be executed just like our makeUpperCase() example above. Here’s what our final form looks like:

[ "luis", "brad", "jon" ].map( ::uCase ) // [ "LUIS", "BRAD", "JON" ]

Nice and sweet! This works for any BIF accepting a single argument in map() or each() functional constructs.

[1.2, 2.3, 3.4].map( ::ceiling );    // [ 2, 3, 4 ]

["brad","luis","jon"].map( ::hash ); // [ "884354eb56db3323cbce63a5e177ecac", "502ff82f7f1f8218dd41201fe4353687", "006cb570acdab0e0bfc8e3dcb7bb4edf" 

You can even use BIFs that accept two arguments with a higher-order function that accepts a BiConsumer. (This example reduces a query object down to an array of structs in a very small amount of code)

myQry = queryNew( "name,position", "varchar,varchar", [ ["Luis","CEO"], ["Jon","Architect"], ["Brad","Chaos Monkey"] ]);

myQry.reduce( ::arrayAppend, [] ) // Array of structs for each row...

Conclusion

We hope this new feature unlocks some exciting productivity boosts for you. It’s available right now on the bleeding edge or this Friday in the next beta release and applies to BoxLang source files. Dive in and see how static functional binding can simplify your code and enhance your development experience!

Try BoxLang

Add Your Comment

Recent Entries

Ortus Solutions Returns to CFCamp as Platinum Sponsor – Join Us to Redefine the Future with BoxLang!

Ortus Solutions Returns to CFCamp as Platinum Sponsor – Join Us to Redefine the Future with BoxLang!

We’re thrilled to announce that Ortus Solutions and BoxLang will once again join CFCamp as Platinum Sponsors for the 2025 edition. As passionate advocates of innovation in the CFML and modern JVM space, we’re proud to keep pushing boundaries—and this year is shaping up to be our biggest presence yet.

Day 1 Keynote by Luis Majano

CFCamp 2025 will kick off with a keynote delivered by none other than our CEO and BoxLang creator, Luis Majano. Join...

Cristobal Escobar
Cristobal Escobar
April 25, 2025
Must-See Into the Box 2025 Sessions for CommandBox Users!

Must-See Into the Box 2025 Sessions for CommandBox Users!

Power Up your CommandBox experience and practices at Into the Box 2025

Want to get hands-on with the new CommandBox features or learn how others are pushing it to the next level? These are the must-see sessions at ITB 2025 if you're a CommandBox user:

Maria Jose Herrera
Maria Jose Herrera
April 21, 2025
Must-See ITB 2025 Sessions for TestBox Users!

Must-See ITB 2025 Sessions for TestBox Users!

Are you a fan of TestBox or looking to level up your testing game in 2025? Whether you're just getting started with unit testing or you're already building advanced specs for ColdBox and BoxLang apps, Into the Box 2025 has an exciting lineup tailored just for you. Into the Box 2025 has an exciting lineup tailored just for you. With the recent launch of TestBox 6.3.0 we have amazing new tools, features and tips and tricks to get your testing experience to the next level, review our sessions and test like a pro efficiently and easy!

From hands-on testing strategies to BoxLang innovations, here are the sessions you won’t want to miss this May — and why they matter to you as a TestBox user.

Maria Jose Herrera
Maria Jose Herrera
April 17, 2025