Fixing the Array/Struct BIFs That Return ‘True’ for no reason
We’ve got an exciting update for you! In our upcoming beta release, we’re tackling an issue with certain Built-In Functions (BIFs) that return true
instead of the original data structure. This change will make chaining operations easier and more intuitive.
What’s Changing?
Some of the BIFs in CFML return a boolean, which can be confusing and limit their usability. For instance:
myArr.append("foo") // returns myArr
arrayAppend(myArr) // returns true??
In BoxLang, we’re updating these functions so they return the modified data structure instead. Here’s the list of BIFs that will now return the original data structure:
arrayAppend()
arrayClear()
arrayDeleteAt()
arrayInsertAt()
arrayResize()
arraySet()
arraySwap()
StructClear()
StructKeyTranslate()
StructInsert()
structAppend()
QuerySetRow()
QueryDeleteRow()
QuerySort()
ArrayPrepend()
arrayDelete()
structDelete()
Legacy CF Code Compatibility
Running legacy CF code on BoxLang? No worries! Our transpiler has been updated to handle this. If the return value of a BIF is being used, the transpiler will automatically wrap it in an Immediately Invoked Function Expression (IIFE) that returns true
for CF compatibility—except for arrayDelete()
and structDelete()
, which will maintain their ability to return true
or false
as originally intended.
Examples
With the update, you can now chain BIFs more naturally. For example:
Before:
array = [1, 2, 3];
result = arrayAppend(array, 4); // returns true, not the array
After:
array = [1, 2, 3];
result = arrayAppend(array, 4).arrayInsertAt(1, 0).arrayResize(10);
// Returns the modified array, making chaining possible
BIFs That Stay the Same
Some BIFs will remain unchanged because they return something other than the original data structure for a good reason:
queryAddColumn()
– returns the index of the column removedqueryAddRow()
– returns the row number added
For QueryDeleteColumn()
, we’ll follow Adobe’s behavior and return the query, matching Adobe’s approach rather than Lucee’s array of removed data.
Conditional Return Values
These BIFs have the ability to return true
or false
, and we’ll preserve their original behavior:
arrayDelete()
– returnstrue
if the array size decreases after the delete operationstructDelete()
– returnstrue
ifindicateNotExisting
is set totrue
and the key existed before deletion
Visualizing the Changes
Here’s how the transpiler works: If you have CF code like this:
result = arrayPrepend(arr, "foo")
It transpiles to BoxLang code:
result = (arg1, arg2) -> {
arrayPrepend(arg1, arg2);
return true;
}(arr, "foo");
However, if the result is not assigned to a variable, used as an argument, or included in a flow control statement, it remains unchanged.
More Information
We’re excited about these improvements and hope they make your BoxLang experience smoother and more powerful. Stay tuned for the beta release and enjoy the enhanced functionality!
For further details, check out the ticket
Add Your Comment