Additions and modifications as of Apr 5, 2023 (versions 6.10.7 / 7.10.7)
Two surface fluxes can now be defined, for instance to implement both NCX and PMCA Ca2+ extrusion processes. See manual for details.
Significantly improved the Makefile, defining an additional compilation target for systems that do not have the GLUT/freeglut library installed. In this case, compile using make noGraphs. The makefile version Makefile.no_glut is now obsolete and has been removed from the package
Additions and modifications as of Feb 15, 2023 (versions 6.10.6 / 7.10.6)
Cleaned up code to replace unsafe sprintf with snprintf. Code now compliles without any warnings.
Removed a bug in seeding the random number genertor used for naming temporary binary plot files, produced during instability recovery. This avoids unexpected interactions between threads when running many scripts in parallel within the same folder.
Additions and modifications as of Jan 15, 2023 (versions 6.10.5 / 7.10.5)
Executables now automatically attempt to load a default script named DefaultScript.txt before asking for the script name, unless script name is passed as command-line parameter.
A mark-down version of README is now added to the distribution
Additions and modifications as of Nov 15, 2022 (versions 6.10.4 / 7.10.4)
Minor cleanup and bug fixes in the graphics (fplot) library.
Additions and modifications as of Oct 14, 2022 (versions 6.10.2 / 7.10.2)
Logarithmic plots now work with the plot.method gl mode.
Minor bug fixes.
Additions and modifications as of Oct 11, 2022 (versions 6.10.1 / 7.10.1)
Cross-platform graphics for plots has been implemented through the use of the freeglut OpenGL / GLUT library.
Conditional compilation flags introduced, to allow compilation on any platform with the same source files. All platform-specific definitions are now contained in the compact PlatformSpecific.h header source file.
Precompiled header linker option is now turned off in the MSDN project file, to ensure cross-platform compatibility of source files (stdafx.h and stdafx.cpp no longer needed, and removed).
Some code clean-up, several minor bugs fixed.
Additions and modifications as of Jan 15, 2021 (versions 6.9.7 / 7.9.7)
Command membrane.definition concentration allows the total membrane-bound buffer concentration to be defined in usual micromolar units, instead of molecules per μm2
Membrane bound buffer could be targetted to a surface of a specific enclosure or obstacles by specifying extra arguments in the buffer ID membrane command.
Additions and modifications as of Aug 22, 2019 (versions 6.9.6 / 7.9.6)
Cleaned up code syntax to eliminate warnings when compiling with stricter compilation flags.
Additions and modifications as of May 20, 2019 (versions 6.9.5 / 7.9.5)
GNU General Public License version 3.0 information clearly displayed in all source files, allowing to package CalC for re-distribution with other software bundles.
NOTE: missing license files added Aug 18, 2019
Additions and modifications as of Aug 9, 2018 (versions 6.9.4 / 7.9.4)
Solved segmentation fault problem when narrow source is placed slightly off the boundary in polar coordinate systems
Additions and modifications as of June 27, 2018 (versions 6.9.3 / 7.9.3)
Removed segmentation fault and suppression of syntax error diagnostic text: memory destructor no longer called in case of syntax error in constructor
Relaxes NaN checking in expression evaluation: warning is produced instead of an error, and zero value returned
Additions and modifications as of June 7, 2018 (versions 6.9.2 / 7.9.2)
Fixed a bug in mute 1D plot, causing corruption of the output data file during recovery from numerical instability. Thanks to Morten Gram Pedersen for reporting!
Additions and modifications as of Apr 29, 2018 (versions 6.9.1 / 7.9.1)
Fixed a serious bug present in CalC versions 6.8.0-6.8.9 and 7.8.0-7.8.9, affecting some scripts defining more than one Ca2+ channel/source. The bug led to reduced amplitude of 2nd and each consecutive Ca2+ current. Thanks to Christian Stricker for reporting.
Equilibrate command was broken in earlier versions, and now is fixed.
Exception checking of floating point division in user-defined expressions was further relaxed to ensure backward compatibility with earlier scripts.
Additions and modifications as of Apr 9, 2018 (versions 6.8.9 / 7.8.8)
Fixed a bug affecting simple-buffer code only (6.x.x): adaptive time step was not checked against dtMax, which in some scripts could result in very large time steps in the absence of calcium influx. Thanks to Christian Stricker for reporting.
Floating point exceptions were not properly thrown (reported) in user-defined formulas.
Loose floating point exceptions now implemented for user-defined formulas: zero times infinity is zero; zero divided by zero is one. The reason is convenience, namely removing initialization problems of facilitation variables and other variable ratios.
Negative currents are now allowed, in order to implement local absorption by calcium sensors.
Additions and modifications as of May 19, 2016 (versions 6.8.6 / 7.8.6)
Fixed the extra "n" character bug in 1D concentration file plots
In dump and binary plots, the file name no longer pre-appends the field name, allowing to save plots into any folder/directory
Additions and modifications as of Jan 29, 2016 (versions 6.8.5 / 7.8.5)
Significant increase in the maximal allowable script size.
Additions and modifications as of Jan 13, 2016 (versions 6.8.4 / 7.8.4)
Adaptive time-step control completely re-written and optimized for improved efficiency and accuracy
Additions and modifications as of Aug 31, 2015 (versions 6.8.1 / 7.8.1)
Fixed a bug whereby multiple boundary condition definitions of Dirichlet type (bc.define bcName Value) caused a segmentation fault unless verbose parameter was set to zero.
Additions and modifications as of Jul 13, 2015 (versions 6.8.0 / 7.8.0)
Completely eliminated charge leaks, especially with curvilinear boundaries. Boundaries are now positioned at mid-point between last/first node and the corresponding ghost node, instead of placing them exactly on the last/first node, so that the trivial volume integration matrix commutes with the finite difference scheme, in any geometry.
Volume and obstacle data types have been greatly simplified and generalized to include cylinders, disks and arbitrary analytically defined enclosures.
Boundary initialization is now more robust with curved objects, removing all slit-gaps and other sources of charge leak.
Pseudo-surface 2D plots are now implemented when piping the output to xmgrace!
Adaptive time-step method is greatly improved by a better stability norm measure that detects local high-frequency modes
Adaptive time-step method recovers from instabilities in the ODE integration as it did with PDE integration.
Fixed the bug of pump boundary conditions on some boundaries in curvilinear coordinates: non-trivial scale factors were not taken into account in the "nabla" operator routines.
Resolved the problem of Ca2+ currents' spatial overlap with volume boundaries. A correction factor multiplies the current amplitude to correct for any overlap / current leak.
Fixed a bug when extended Ca2+ current sources not centered at the origin overlapped the origin in radial direction in polar coordinate systems, resulting in very large currents at the origin after volume element normalization.
Fixed a bug in region size determination when both spherical and rectangular enclosures are present
File point plots and file 1D plots no longer use inefficient and unsafe temporary file writing during instability recovery back-stepping.
Improved runStatusString monitoring routines.
Grid stretching and interpolation routines have been improved and re-written for the new ghost point placement
Additions and modifications as of Mar 17, 2014 (versions 6.7.4 / 7.7.4)
Corrected the parsing of the non-ASCII "long minus" sign that appears on some European character set keyboards (character code = -106)
The non-cooperative buffer versions of CalC (6.x.x) now terminate if a cooperative buffer is declared
Additions and modifications as of Mar 10, 2014 (version 7.7.3)
Fixed a bug in math expression optimizer: time-depdendent expressions involving successive division by two constants (without brackets) VAR / B / C were interpreted as VAR / (B / C) instead of VAR / (B * C) , where VAR denotes a time-dependent variable, and A and B are constants.
Additions and modifications as of Jan 11, 2014 (version 7.7.2)
Fixed a round-off error bug causing some scripts to terminate and report an error in the localization of a Ca2+ current source located at the far boundary of a diffusion domain.
Fixed a bug causing an extended, square-shaped Ca2+ source to have uneven distrubution over the last two grid points in a given direction. Only affects scripts with a square-shaped spatially-extended Ca2+ current source that overlaps the far boundary of the diffusion domain.
Additions and modifications as of Jan 7, 2014 (version 7.7.1)
Implemented space-dependent Ca2+ uptake
Additions and modifications as of Aug 22, 2013 (version 7.7)
Spherical enclosures and obstacles implemented
Program doesn't autoterminate when verbosity level is 4 and above (e.g. use verbose = 4): this allows to trouble-shoot scripts and monitor program output when launching the program outside a system shell.
Fixed file initialization in 1D file plots
Additions and modifications as of July 25, 2013 (version 7.6.1)
Fixed a bug in the initialization of 1D plots, introduced in version 7.6.
Additions and modifications as of June 24, 2013 (version 7.6)
Boundary conditions are generalized, allowing to define non-linear membrane Ca2+ pumps.
Significant simplification of boundary condition definition syntax: normalization of fluxes by diffusion coefficient no longer needed; proper flux signs are automatically set.
Minor bug found and fixed in script processor, which on rare occasions prevented proper processing of negative constants in short in-line parameter lists.
Minor bug in Makefile introduced in version 7.4 and preventing proper compilation on some platforms has been fixed.
Additions and modifications as of April 18, 2013 (version 7.4)
Introduced binary plots to save the entire 3D concentration field as a function of time to a file.
Corrected naming and removal of temporary plot files produced during instability recovery back-stepping.
Removed all legacy graphics code for the obsolete IRIS gl graphics library, and shortened the makefiles
Changed the naming of plot step control parameters to plot.steps.point, plot.steps.1D, plot.steps.binary and update.accuracy; documented all four parameters in the manual.
Fixed a segmentation fault memory bug affecting buffer-less simulations in 2D (thanks to Bas Schotten for reporting the bug)
Additions and modifications as of December 14, 2012 (version 7.3)
Improved error tolerance check in adaptive cooperative buffer iteration.
Additions and modifications as of September 24, 2012 (version 7.2)
The numerical engine parameter Number_Of_Iterations_Per_PDE_Step can now be changed in each iteration of the for loop.
Fixed a bug in processing ODE-mode runs, introduced in version 7.0
Additions and modifications as of September 14, 2012 (version 7.1)
Corrected cooperative Ca2+ buffer syntax description in the manual.
Fixed exception handling for stretched grid (only a warning is now given when the number of nodes is too high or too low).
Space-dependent total concentration definition now allowed for distinct binding states of an immobile cooperative buffer.
Additions and modifications as of September 3, 2012 (version 7.0)
Buffers with 1-to-2 binding stoichiometry are now implemented, allowing to simulate cooperative Ca2+ buffers such as calmodulin
Improved error control and instability catching in adaptive method, in particular control of checker-board instability.
File name path determination is corrected when program is run outside of command shell on Windows OS.
Improved accuracy of time-dependent Ca2+ current integration when calculating Ca2+ charge and charge loss.
Additions and modifications as of September 22, 2008 (version 6.0.5)
Significant improvement of non-uniform grid generation. The uniform interval in the stretch definition is accurately preserved.
Time dependent calcium binding and unbinding rates are now allowed.
Several minor bug fixes and improvements
Additions and modifications as of April 27, 2008 (version 5.9.1)
For convenience, Dirichlet boundary conditions has been re-defined, and by default fixes the calcium and buffer concentrations to their background values, instead of zero.
A volume-distributed linear calcium uptake process is now implemented.
Fixed a bug in special buffer obstacle implementation causing segmentation fault in scripts using for loops. Thanks to Robert Zucker for reporting the bug.
Additions and modifications as of March 31, 2008 (version 5.7.9)
Fixed a bug in Dirichlet boundary conditions implementation, introduced in version 5.5.9. Thanks to Thomas Frank for reporting the bug.
Additions and modifications as of March 20, 2008 (version 5.7.8)
Fixed a bug causing segmentation fault with large-size scripts that make use of the local concentration variables (thanks to Robert Zucker for reporting the bug).
The constructor code for time-dependent objects was significantly cleaned up in order to fix a minor bug in initialization of min/max variables. This bug resulted in the crash of xmgrace graphics application when auxiliary variables depended on min/max objects (thanks to Robert Zucker once again for reporting).
Additions and modifications as of Nov 22, 2007 (version 5.7.0)
Implemented buffer obstacles - diffusion obstacles specific to individual buffers. These special obstacles are complementing the more complex tortuosity definition which retards the diffusion of buffers in a specific spatial region.
Additions and modifications as of Feb 14, 2007 (version 5.5.95)
Improved handling of viewport coordinates in xmgr/xmgrace graphics
Additions and modifications as of May 27, 2006 (version 5.5.9)
Tortuosity has been implemented for all cartesian and curvilinear geometries; the low-level integration routines have been streamlined.
The flux boundary conditions have been redefined to implement in a more physiological fashion the zero flux at the background level of calcium concentration
Implemented the continue flow-control statement
Fixed a bug in the parsing of Ca2+ influx width values in 1D and 2D geometries, introduced in version 5.1.0.
Additions and modifications as of October 5, 2005 (version 5.5.0)
Streamlined the makefiles, which should now be problem-free and work on any UNIX platform including OS X. Since the supplied Ygl library binary is not compatible with the newer 64-bit systems, Linux compilation excludes by default the Ygl capabilities. Use "gmake -f Makegl" to include Ygl graphics on a 32-bit Linux platform.
The execution status string now wastes much less CPU time, since it only updates once a second. This eliminates the need for the verbose=0 command to improve efficiency.
When using CalC as an ODE solver, the mode=ODE command is now not necessary. ODE system is assumed if the grid and the Ca2+ diffusion coefficient are not defined in the script file.
Fixed a bug in mute plot data output appearing in the Windows version of the program. The bug only appears when the numerical engine encounters instability and does back-stepping. The bug is related to the inability of Windows to properly process the "rename" OS command.
Fixed a bug in expression optimizer that affects truncation of mathematical formulas of form "variable / const * const", "variable / const / const", "variable - const + const", and "variable - const - const"
Additions and modifications as of May 24, 2005 (version 5.4.5)
Fixed a bug that spoiled the accuracy of the total Charge conservation check after instability recovery during adaptive time-step calculation.
Fixed a bug causing some scripts to crash when they include both graphics and Export data dumps (incorrect plot count).
Minor bug fixed causing some scripts to terminate at very small time steps during adaptive integration.
Additions and modifications as of February 4, 2005 (version 5.4.0)
Implemented several new geometries, such as 2D polar and cylindrical geometries, and 3D cylindrical and spherical geometries (note that periodic boundary conditions are not yet implemented). The geometry implementation code has been considerably streamlined.
Keyword point is now obsolete: plot syntax has been simplified.
Slight change in pump-like Neumann boundary condition definition (removed the [Ca2+]bgr offset in the denominator pump term - it wasn't physiological)
Further changes to the Makefile now allow problem-free compilation on cygwin, which is a very nice and completely free Linux emulator for Windows.
Fixed a bug in expression optimizer: some expressions containing zeros and ones were truncated incorrectly.
Additions and modifications as of October 18, 2004 (version 5.1.0)
Implemented stochastic discrete-state continuous-time Markov process variables, which allow to model stochastic channel kinetics (see an example script).
Implemented distinct Ca2+ currents.
Additions and modifications as of June 17, 2004 (version 5.0.3)
Fixed a bug in expression parser: expressions of form A / B / C were occasionally interpreted as A / (B / C) instead of a more conventional A / (B * C)
A bug in xmgr point plot routine has been found, which resulted in DY <= 0 xmgr error when plotting constant negative functions of time in xmgr mode .
Additions and modifications as of June 11, 2004 (version 5.0.2)
The Unix GNU makefile has been re-written to comply with the different variations of Unix OS on different platforms
Further tweaks to the adaptive time-step algorithm
Fixed a potential segmentaion fault bug in the gl-type point plot.
Additions and modifications as of June 9, 2004 (version 5.0.1)
The adaptive time-stepping algorithm has been significantly streamlined and simplified. The code should now be able to handle any instability without crashing.
Bug fixed in 1D solver: buffer field was updated explicitly, resulting in instability for zero current when using the 1D spherically symmetric and 1D cartesian geometries.
Bug fixed in equation optimizer: some expressions with nested brackets were incorrectly truncated.
Additions and modifications as of May 18, 2004 (version 4.9.11)
Fixed the bug in the equation sorter: if your code has interdependent time-dependent variables, the previous version of the code may have incorrectly swapped the corresponding expressions (check the program output at initialization)
Additions and modifications as of April 2, 2004 (version 4.9.9)
The code now compiles on the Sun / Solaris platform. Run gmake, the gnu make utility, to compile the code on any platform.
New sytax for ODE definitions: a backquote "`" can now be used to denote differentiation, instead of d/dt. This looks closer to the xpp format that most people are used to.
Corrected a bug in parsing tokens starting with "mod", "or", and "and" (as in "modified"), which in the previous version were automatically identified as operators.
ODE accuracy check has been slightly corrected in the adaptive Runge-Kutta integration.
Additions and modifications as of July 27, 2003 (version 4.9.8, 208 KB)
Numerical engine bug introduced in version 4.8.5 has been fixed. It affected (albeit not too drastically) simulations in cartesian 3D geometry. Sorry about that...
Implemented saturable pump boundary condition.
Implemented localized and membrane-bound fixed buffers.
Apart from the gaussian spatial current form-factor, implemented a step-wise (square) current shape
New construct $$ returns the number of command-line arguments (see general syntax section)
Array indexing starts from 1, not from 0 as it used to be. Zero-indexed element returns the array size.
Fixed a bug introduced in version 4.8.5: explicit time-dependent expression in current declaration lead to an error message
Found and eliminated a major memory leak.
Additions and modifications as of May 29, 2003 (version 4.8.5, 205 KB)
Implemented lower-dimensional cartesian 1D and 2D geometries, and the 2D rotationally-symmetric disc geometry.
The entire numerical engine has been streamlined and the code-size was reduced. Although the simulations will now run somewhat slower, the streamlined code is now more readable and is easier to modify.
Fixed the stability problem in all non-cartesian methods.
Fixed the bug in simulations using Dirichlet boundary conditions.
Found and fixed a major bug in expression parser/optimizer: multiplication by zero improperly eliminated.
Additions and modifications as of March 21, 2003 (version 4.6.0, 199 KB)
While tracking a variable's maximum or a minimum value, it is now also possible to track the time at which maximum or minimum is achieved.
Improved error handling
Additions and modifications as of February 14, 2003 (version 4.5.5, 198 KB)
Modified the priority of the exponentiation operator "^". It now supercedes the priority of the unary minus, as it should.
Fixed a bug in 2D plot redraw
Improved instability handling
Additions and modifications as of January 6, 2003 (version 4.5.1, 198 KB)
Fixed a Windows version bug in Import / Export (thanks to Leslie Farnell)
Additions and modifications as of September 19, 2002 (version 4.5.0, 197 KB)
Nested for loops implemented (useful for parameter search-type problems).
Array construct can be used to access the arguments of a compound definition.
Several improvements in user error handling. Fixed a bug in the for loop in ODE-only mode
Additions and modifications as of July 31, 2002 (version 4.4.2, 193 KB)
One can track either the minimum or the maximum of a variable. Keywords min and max replace the keyword peak
Additions and modifications as of July 25, 2002 (version 4.4.0, 165 KB)
Syntax checking (exception handling) has been improved. The program outputs line numbers when a syntax error is encountered.
Cylindrical two-dimensional geometry has been implemented. Not as stable as the cartesian 3D geometry though.
Change of syntax for mute and logarithmic plots: use plot 1D.mute instead of plot mute_1D, plot 1D.mute.log instead of plot log_mute_1D, etc.
Implemented file plots (ASCII) of the concentration profile in a two-dimensional plane. Resulting files can be plotted using the gnuplot or MatLab software.
Additions and modifications as of March 1, 2002 (version 4.3.1, 160 KB)
A unique tortuosity function can be defined for Ca2+ and each of the buffers.
Fixed the bug in the treatment of source definition with weight parameter
Additions and modifications as of January 4, 2002 (version 4.2.6, 146 KB)
Constant arrays implemented in numerical expression.
Several bugs (introduced in version 4.1.0) in the numerical expressions parser have been fixed
Built-in constant Run.scheme (used to specify the finite difference scheme) has been renamed into PDE.scheme.
Spaces are now allowed in concentration constructs (in earlier versions, any spaces between coordinate values and commas and/or brackets would have resulted in a syntax error).
Additions and modifications as of November 29, 2001 (version 4.2.0, 263 KB)
Syntax has been changed for Export and plot dump commands
In numerical expressions, C-like execution priority order for operators has been implemented
Different current strengths may be now assigned to different channels, through the weight parameter in source definition.
Numerical difference scheme can be set by assigning value to the Run.scheme constant.
New built-in variable Charge.loss can serve as a measure of accuracy of the simulation.
ODE integration accuracy can now be controlled through the new built-in constant ODE.accuracy
Few minor bugs fixed; better error catching; expression optimizer implemented
Additions and modifications as of September 4, 2001 (version 4.1.0, 255 KB)
Non-uniform diffusion coefficient has been implemented, through the tortuosity command.
New predefined variables: ICa (total Ca2+ current) and Charge (total Ca2+ charge entering the volume).
At the end of each run, the program outputs the difference between the value of the Charge variable and the actual total calcium in the simulation volume; this difference can serve as a useful measure of the simulation accuracy, in the absence of pump boundary conditions.
Few minor bugs fixed (recovery from instability; data output in for cycle; string interpreter).
Additions and modifications as of July 5, 2001 (version 4.0.3, 233 KB)
Note major syntax changes:
The ":=" operator now replaces "==" in the definition of a time-dependent variable: varName := expression. The "==" symbol is now reserved for the boolean equal operator.
Period ('.') replaces a space or an underscore in all two-part keywords, e.g. stretch.factor instead of stretch_factor; Buff.kplus instead of Buff kplus. This makes the keyword name scheme more systematic, and also mimics object-oriented syntax (the part before the period specifies an object; the second part specifies the object's property).
Simple single-value definitions take the form of parameter definitions, e.g. Ca.D = expression instead of Ca D value. Just like all user-defined parameters, these parameters can now be used in other definitions throughout the parameter file. Definitions that require several arguments ("function calls") are left unchanged (e.g. grid value value value).
Ca.bgr = ... (for background) replaces Ca total ..., since the old keyword Ca total actually defined the background [Ca2+], not the total (bound + unbound) [Ca2+]. For the buffer, one can specify both the bgr and the total values, in which case the initial buffer concentration will be set to the bgr value, instead of being calculated from the condition of equilibrium with the background calcium level (defined by Ca.bgr).
To run simulations in ODE-only mode, omit ODE tag from the Run argument list, and include an additional command mode=ODE
Few keyword changes: include instead of input, adaptive instead of Adaptive, bc.define instead of bc_type. Old keywords will still work, for now.
Syntax changes are summarized in the table below:

Old Ca D 0.22Ca total 0.1 Ca bc all NeumannCa source x y z Bf total 500Bf kplus 0.1 Bf kminus 2Bf KD 20
New Ca.D=0.22Ca.bgr=0.1 Ca.bc all NeumannCa.source x y z Bf.kminus=2Bf.KD=20
Old Ca import fileName bc_type ... stretch_factor 1.05 Run Adaptive ...Run ODE T dt
New Ca.import fileName bc.define ... stretch.factor=1.05 Run adaptive ...mode=ODE ; Run T dt
Old varName == expressioninput fileName plot_method xmgr n mplot_print file geometry conical
New varName := expressioninclude fileName plot.method xmgr n mplot.print file geometry=conical

Implemented conditional processing of parameter file, via if / then / else/ endif statement (see also the exit statement).
Implemented boolean operations "==", "<=", "<", ">", ">=", "and", "or", "not( )"
Numerical expressions can now include power operator "^", the modulus operator "mod", and the truncation function "int( )". Note that the operator priorities are still not well implemented, so use brackets when in doubt.
String expressions can now be printed to a file or terminal upon completion of the simulation, via print / append commands.
Default plot method is now mute, not Ygl. I am discontinuing further development of Ygl plots, since this graphics library doesn't work under the newest window managers.
The track command now accepts as its argument a list of several variables to be tracked, instead of a numerical expression. When running in xmgr mode, variables appearing after a single track statement will be plotted on the same xmgr graph panel.
String expressions are now fully recursive.
Introduced parser debugging statements debug and echo .
Improved diagnostic messages and checks for user errors in parameter file.
Additions and modifications as of June 11, 2001 (version 3.01, 116 KB)
Xmgr plots recover from the back-trace steps taken by the numerical engine when instability is encountered
Additions and modifications as of June 8, 2001 (version 2.99, 115 KB)
Implemented exporting and importing of entire simulation state space (concentration fields and values of ODE variables), using commands Import and Export
Additions and modifications as of April 20, 2001 (version 2.97)
Parameter file can import other parameter files using command input
A fully implicit ADI scheme implemented for conical geometry
The maximal number of steps in ODE equilibration is now user-defined through the 1st argument of command equilibrate
Syntax change: ODEs defined using "df/dt = ..." instead of "f -> ...". Old syntax will still work.
Syntax change: String constants can be enclosed in any of the three quote types, i.e. "string", 'string' or `string`. Opening and closing brackets quotes should be of same type.

Victor Matveev
Last modified: Oct 11, 2022