Adobe have claimed that ColdFusion 2016 will be a developer-centric exercise, which makes a pleasing change from the PHB-oriented CF11 (well: that can be the only basis for <cfclient> to ever have been considered... some muppet from Adobe polling PBHs for what they want in ColdFusion).
Obviously Adobe are never directly forthcoming as to what's going to go into the next version of ColdFusion, but one can make some inferences from status changes in the bug tracker. There are currently 241 open enhancement requests specifically flagged as "language", and also flagged as "to fix". Obviously there's no promise that 100% of these will go into ColdFusion 2016, but generally stuff they can't be arsed dealing with gets closed with some variation of "nuh-uh" as the closure reason. So perhaps we can think of this list as the target for 2016. Even if they only did half of it, it'll be pretty excellent:
- (4058829) Language/Syntax Enhancement - Array/Struct Literal append/update
- This is Abram's ticket to add a +, +=, &, &= for complex objects.
- (4032723) Add
.some()
and.every()
iteration methods - As the title says:
.some()
and.every()
are handy iteration methods. - (4025814) Add object methods to File objects
- Stuff like
myFile.read()
andFile.exists(myFilePath)
and that sort of thing - (4022432) Add callback to
arraySet()
- So instead of setting the array with a static value, one can use a callback to provide dynamic values.
- (4022420) make queries implement an array interface
- This would make it possible to call any array method on a query object, eg:
myQuery.append()
etc - (4020372) Arrow functions
- This is a short-hand syntax for function expressions:
f = (x,y) => x+y;
- (4019843) File (objects) should be iterable
- Just like one can call
.map()
and.reduce()
etc on an array (etc), one could use the same mechanism for iterating over a file. - (4019842)
cfloop
over a file should take a file object as much as it should take a path - As the subject says. Currently
<cfloop>
takes a path; it should also take an already existing file object. - (4010516) Null
- We all know about this one.
- (4010512) Three-way comparison operator (
<=>
) & Comparable interface - AN operator equivalent of
compare()
, which is a tri-state function returning -1, 0 or 1 depending on whether the first operand is less than, equal to or greater than the second operand. - (4010501) Futures/Promises
- I've already discussed this one ad nauseam (the nausea coming from Acker's thread-hijacking)
- (4010446) Cannot catch throwables
- One cannot catch an java.lang.Throwable with
try
/catch
. This is kind of a bug, in a way. - (3972123) initmethod is not inherited
- Components can specify an alternative
initmethod
if one does not want to useinit()
. This is not inherited by sub-components. Also a bug, really. - (3956874) Query of queries
where in (select ...)
not working - Sub-queries for QoQ!
- (3933619)
.serializeJson()
method not implemented - As in a method on complex objects, as opposed to the procedural function of the same name.
- (3927012) Handle automatic type coercion better
- This is to add more intelligence to when using a data type in the context a different one is expected. Mostly enhancing the
.toString()
method on structs etc, and that sort of thing. - (3924625) [ANeff] ER for:
canonicalizeURL(inputString, restrictMultiple, restrictMixed[, throwOnError=false])
- This is actually a bug
canonicalize()
doesn't deal with query string params if they are similar to HTML entities. - (3917706) [ANeff] ER for: ISO 8601 support in
week()
- The
week()
function doesn't follow ISO-8601 when determining what is week 1 (or maybe week 52/53). Probably more a bug, really. - (3864595)
valueList()
Query method not implemented - Also a bug IMO. We should be able to go
myQuery.valueList("column")
. - (3863533) [ANeff] Bug for:
<cfloop>
missing themaxrows
attribute (tag-to-script conversion failure) - Also a bug, Aaron ;-)
- (3863003) Map|reduce methods on query objects
- SSIA: these weren't implemented along with the equivalents on arrays, structs, etc.
- (3861322) Improve scalar functions in query of query
- This would make QoQ more usable.
- (3853251) Array methods:
shift()
,unshift()
,push()
,pop()
,splice()
- Handy array helper functions
- (3849074)
.duplicate()
member function - The method version of the procedural function.
- (3844994) [ANeff] ER for:
RequestGetMetadata()
- Hooks into the RequestMonitor to retrieve request info.
- (3844972) Member functions can't be chained to struct/array literals
- Struct and array methods often return a pointless boolean instead of the object they just worked on, which sux a bit.
- (3842667) Allow exceptions to be nested
- Being able to catch one exception, throw another but pass the original exception as a property of the second one.
- (3831792) Equality (eq) result is incorrect for some strings with numbers and commas or hyphens
- CFML's ubiquitous/perennial struggle with being a loosely-typed language.
- (3808978) function expressions do not support annotations
- Such as giving them a hint and other meta information.
- (3808648) Internal row pointer not correctly implemented in
for(row in query)
- Sounds like a bug not a feature to me.
- (3799243)
onRestRequest()
- The REST-request equivalent of
onRequest()
. Because for some reason they don't / won't callonRequest()
. - (3799027) Allow dynamic
case
values - Lucee allows dynamic values for case values, so ColdFusion should too.
- (3787708) Add
assert
statement - As per PHP's
assert()
function - (3765535) new date/time function for returning date/time/datetime in ISO8601
- SSIA. Some more support for ISO-8601 behaviour with date/times.
- (3754577)
cfloop()
does not support most of the <cfloop> tag's functionality - I dunno why this is not a bug, TBH.
- (3754490) Add ability to treat strings like collections
- One should be able to iterate character by character over a string, using
.map()
,
.reduce()
, etc. - (3750732) Custom serialisers just not fit for purpose
- I tried to make use of these things, but they're just a bit shit, and need a rethink.
- (3749301) Built-in functions as "first class" glitch in function return values
- Sounds like a bug!
- (3737409) Member functions cannot be called on literals
- EG:
[1,2,3].each()
. I do need to do this sometimes in like unit tests and the like. - (3732993) Separate parameters from SQL in
<cfquery>
- Same as how one does with
queryExecute()
. Don't require the params to be embedded in the SQL string (which breeds poor practice IMO), but pass them as a struct or an array in the<cfquery>
tag. - (3713323) Iterator methods on query objects have not been implemented
- Erm... we already had this one.
- (3712167)
<cfprocessingdirective>
not implemented in CFScript - Well it kinda is. Kinda isn't. And this is a bug.
- (3712125) A lot of member functions cannot be chained
- This is the same as the earlier one, too.
- (3687749) Please add some additional functionality to query of queries in upcoming versions
- SSIA, and is covered in other more precise E/Rs too.
- (3684150) Add ability to
dateAdd()
with non-whole-numbers - EG: adding 1.5 days, rather than 36h.
- (3680177) Permit types to be "arrays of [things]"
- Instead of return types of "array" be able to specify "
string[]
" or "MyClass[]
" etc. - (3648785) Add closure support to blocking operations to alow them to be non-blocking operations.
- IE: adding success and failure handlers to long-running file / network operations.
- (3648781) Closures cannot be declared outside of cfscript
- The should be able to be used in tag-based code. For the sake of completeness
- (3644151) Another suggested tweak to CFScript:
thread
- As per CFML: Another suggested tweak to CFScript:
thread
. - (3616205) Redefining truthy and falsey values
- EG:
null
,[]
,{}
etc to be false. - (3614456)
==~
: regex compare operator - Operator equivalent of
reFind()
. - (3614455)
<=>
: compare operator - Oops! A duplicate
- (3576114) Make the way scopeless variables are handled configurable...
- Like Lucee does.
- (3555025) Iterators and generators
- These are increasingly common in other languages, and would be a good fit for CFML (see "PHP: generators").
- (3534476)
arraySearch()
- Just a rationalisation of the various
arrayFind()
,arrayContains()
functions - (3516706)
booleanFormat()
- An augmentation of
yesNoFormat()
- (3499033) New function request:
valueArray()
to complementvalueList()
- Same as valueList(), but returns an array.
- (3429713) [ANeff] ER for:
millisecond()
andcreateDateTime(year,month,day,hour,minute,second,millisecond)
- SSIA.
- (3429216) [ANeff] ER for:
cfloop
step precision (date range looping is sometimes imprecise) - Sounds like a bug.
- (3427695)
CFLOOP
over a list should haveincludeEmptyValues
attribute - And another bug.
- (3374275) Add granularity to
createDateTime()
- IE: one could pass a subset of the date parts: just y,m,d; or y,m,d,h etc
- (3339105)
valueList()
should take any expression that evaluates to a query column - valueList() only works with
myQuery.myColumn
as an argument, and not just an expression which resolves to a query column. Probably more a bug than anything else. - (3198706) Default local scope in variables declared within functions
- Oh yes. The way it should have always been.
- (3194043) New order attribute for query loops
- Being able to reorder a query when looping it.
- (3155857) Application.cfc organizational changes
- basically being able to specify application settings in
onApplicationStart()
not the pseudo-contrstuctor. - (3134978) ColdFusion will not support look ahead or look behind regular expressions
- I could really use look-behinds in the regex engine.
- (3043970) The
<cfthrow>
tag allows use of an attributeCollection, but the equivalent script method, throw(), throws an exception if you try to use an argumentCollection with it - This is a bug.
- (3043502) Add callback support for
CFMAIL
success or failure - Similar to the earlier one: being able to "fire and forget" a
<cfmail>
call. - (3043097) As an avid user of
<cfstoredproc>
and<cfprocparam>
I am constantly faced with the amount of effort and code needed to deal with passing NULL values - SSIA.
- (3042492) Currently, CFC metadata obtained from
getComponentMetadata
orgetMetadata
exposes all properties/etc inherited from a parent object via the"extends"
property, which can also recurse up the tree with - This is to "flatten" the metadata into one level, to make it easier to use.
- (3041787) [ANeff] ER for:
<cfloop name="" group=""Example:<cfloop query="myQuery" group="myColumn1"> <h1>#myQuery
- No idea what this one is about.
- (3041263) Function call should be allowed on any expression that yields a function:
- EG:
s[key]( args )
- (3039790) [ANeff] ER for:
<cfinsert>
&<cfupdate>
really should accept any old struct, not just FORM scope - SSIA. And yes they should.
- (3037998) Summary: upgrade CF's regex engine
- ApachORO has been dead for a decade. Move on, Adobe.
- (3037849) ER for:
arrayCollapse()
- This would take a sparse array and remove the empty elements
- (3037465) ER for: Adding '
ignoreUndefined=""';
attribute toarraySum()
- SSIA.
That's a whole lot of language enhancements! There's a mishmash of big and small there, and some stuff than I find really interesting, and some that I'm a bit "meh" about. But the interest levels will vary from dev to dev and requirement to requirement, so it's a good bunch of stuff to target for dealing with.
I do hope Adobe stays true to their (admittedly implied ~) word here.
What you should do, though, is if you like the look of any of these... go and vote for them. The issues with the most votes will be more likely to get implemented. This is a reasonable consideration when Adobe make their selections. Go and vote / comment /etc!
--
Adam