#+TITLE: Guile-SMC News -- history of user-visible changes.
#+STARTUP: content hidestars

Copyright (C) Artyom V. Poptsov <poptsov.artyom@gmail.com>

  Copying and distribution of this file, with or without modification,
  are permitted in any medium without royalty provided the copyright
  notice and this notice are preserved.

* Version 0.6.4 (2025-07-21)
** Fix compilation of =puml-fsm.scm= from =puml.puml=
Sometimes Guile-SMC would try to build =puml-fsm.scm= from =puml.puml= which
would produce an error when there are no Guile-SMC installed on the system.
Now Guile-SMC does not try to re-build =puml-fsm.scm= if it is present, even
when =puml.puml= has newer timestamp.
** =README.org=: Improve the description of the manual installation process
Now =README.org= mentions that =--with-guilesitedir= and =--prefix= options
must be provided for the proper manual installation.

Reported by mooseyboots in
<https://github.com/artyom-poptsov/guile-smc/issues/6>
** Modernize =guix.scm=
** Add a new test for "transition.scm"
** Improve the build process of "parenthesis-check" example
- Disable Guile auto-compilation in =examples/parenthesis-check/Makefile.am=.
- Set the build environment right before the calling of the Guile state
  machine compiler.

* Version 0.6.3 (2023-12-02)
** PlantUML parser now handles multi-line comments
** =(smc context functional char)=: Bugfix
=pre-action= procedure would increment the row counter even when the input
event is not a newline character.  Now the procedure counts rows properly.
** Skip "hide" blocks in state diagrams
For example, the following code will be ignored by the PlantUML parser:
#+BEGIN_EXAMPLE
hide empty description
#+END_EXAMPLE
** Allow to use "end legend" syntax for "legend" blocks
** Improve error reporting in the PlantUML parser

* Version 0.6.2 (2023-08-11)
** Bugfixes
*** =(smc context functional char)=: =pre-action= now always returns context
The procedure would return an undefined value when the input character is an
EOF object.  Now =pre-action= procedure always returns a context instance.

Also now the procedure handles cases when the input character is equal to
=#f=.
*** =(smc trace-context)=: Fix timestamp calculation
Procedures from the module now ensure that timestamps are always have positive
values.  When a negative value is detected then an error is issued.
*** =(smc cli command-profile)=: Fix time calculation
The profiler would fail to calculate correct time ranges.  Now the time is
calculated properly.
*** =(smc context oop generic)=: Add missing =(smc core log)= import
** Allow to set the FSM pre- and post-action in a PlantUML "legend" block
Guile-SMC now allows to set the pre/post actions for an FSM in the PlantUML "legend" block.
#+BEGIN_EXAMPLE plantuml
legend
pre-action:  custom-pre-action
post-action: custom-post-action
endlegend
#+END_EXAMPLE
** Add missing procedures for the =<fsm>= to get/set pre/post actions
Now the =(smc fsm)= module provides procedures to get and set pre- and post-actions.
** =(smc core log)= now registers the default logger
=(smc core log)= now registers the default logger under the name "guile-smc".
** =(smc core log)=: New procedure: =smc-log-default-logger=
This procedure allows to get the default logger instance.
** Update the documentation
* Version 0.6.1 (2023-07-30)
** Allow to set a global event source in a PlantUML "legend" block
Now PlantUML parser allows to set a global event source for an FSM in a
"legend" block, like follows:
#+BEGIN_EXAMPLE
event-source: some-event-source
#+END_EXAMPLE
** =smc context=: Allow to set context sub-type
=smc context= now allows to set a context sub-type to minimise the amount of
imported code.  This change is backward-compatible with the old CLI as "oop"
and "functional" types still supported. Please see =smc context --help= for
the full list of supported types and subtypes.
** =fsm-run!= bugfix: Return the updated context at the end
Return the updated context at the end of FSM run.
** =(smc core state)=: Bugfix
Add missing serialization of the state "exit-action".  Also set the state exit
action when the state is de-serialized.
* Version 0.6.0 (2023-04-30)
** New context implementation                                    :API_CHANGE:
New FSM context implementation consists of three modules that contain
implementation of common actions/guards:
- =(smc context common)= -- Common actions/guards.
- =(smc context char)= -- Guards for a stream of characters.
- =(smc context u8)= -- Guards for a stream of bytes.

Also there are now two types of structures that provide memory for an FSM:
- =(smc context functional ...)= -- FSM context based on =(srfi srfi-9 gnu)=
  structures.
- =(smc context oop ...)= -- FSM context based on =(oop goops)=.
** Drop the support for =guile-standalone-copy= target           :API_CHANGE:
It seems that only two targets are reasonable to keep for now: =guile= (which
produces code that depends on Guile-SMC) and =guile-standalone= (which
produces code that does not depend on Guile-SMC and mimic hand-crafted FSM
implementation.)

Extra compilation targets are adding extra maintenance burden so I'd prefer to
focus my somewhat limited resources on those that make sense in the long run.
** =<fsm>= now supports "pre-actions" and "post-actions"
The class slots can be set with "#:pre-action" and "#:post-action" keyword
parameters in the class constructor.

"pre-action" is a global action that is performed on a context and event
before all the other guards and actions.

"post-action" is a global action that is performed on a context and event
after all the other guards and actions are executed in a chain.

By default both actions are procedures that return a context as is.
** =smc compile= and =smc context= now support "--guile-smc-path"
The option sets the path where Guile-SMC core modules are stored.  E.g.:
=~/.guix-profile/share/guile/site/=
** =smc context=
*** New option: "--type", "-T"
This option allows to specify context type for the output context when an
intermediate context is generated.
=~/.guix-profile/share/guile/site/=
** =smc run=: Remove the deprecated "--log-file= option           :API_CHANGE:
** =smc profile= now allow to print data in JSON format
** =smc=: Improve the "--debug" mode
Now when the debug mode is enabled =smc= will not enable stderr logging.  To
enable logging to stderr in addition to the regular logging drivers, there's
now logger option "stderr" that can be used to enable/disable stderr logging.
For example,
#+BEGIN_EXAMPLE shell
$ smc compile --log-driver file --log-opt "file=out.log,stderr=true"
#+END_EXAMPLE
* Version 0.5.2 (2022-09-02)
** Bugfixes
*** =smc context=: Add missing =(smc core config)= to the FSM context
Add missing =(smc core config)= to the FSM context generated by =smc context=
command.
*** =smc compile=: Copy =(smc core config)= when standalone-copy target is used
Copy =(smc core config)= when =guile-standalone-copy= compiler target is used
with =smc compile= command.
* Version 0.5.1 (2022-09-02)
** Fix =log= core binding shadowing by =(smc core log)=
** Allow to set the log driver in Guile-SMC CLI.
See the =--help= for each =smc= action for the description of the new command
line options.

Implemented log drivers are: =syslog=, =file= and =null=.
** =stderr= logging now works with any log driver
Updated =(smc core log)= API now allows to use =stderr= logging with any other
driver.  That is, Guile-SMC will log messages to the =stderr= even for =none=
driver is set after =log-use-stderr!= is called with =#t=.

The =stderr= logging can be disabled by calling =log-use-stderr!= with =#f= as
the argument.
** PNG parser example now uses =null= log driver
That should make building in isolated/restricted environments (like in Guix)
easier.
** Guile-SMC tests now uses file log driver
Each test suite now logs to a file named =<test-suite-name>-smc.log= in the
=tests= directory.
** Update the Texinfo documentation
* Version 0.5.0 (2022-08-23)
** Compiler changes
*** =guile-standalone=: Add missing dependency for the target code
*** =guile-standalone=: API change: Target now produces =fsm-run!= procedure
Guile-SMC now generates =fsm-run!= procedure when =guile-standalone= target is
set to provide the same API as for other targets.
*** =guile-standalone=: Improve the output code layout
Code from different modules now separated by section headers.
** core: API change: =(smc core stack)= is removed
** =smc context=: API change: Implement intermediate contexts
Now =smc context= allows to generate intermediate contexts that can be used
from custom contexts.  Intermediate contexts can be used to implement some
custom code (e.g. user contexts) that is indifferent to target compiler.
** =smc context=: Allow to read input from a provided file
=smc context= now can read the input PlantUML data from a provided file.
** =smc profile=: Fix the help message
** =smc run=
*** Ensure that the =context-thunk= is a procedure with zero parameters
*** debug mode: Now print stats for both parent and child FSMs
*** Improve help messages
** Update the Texinfo documentation
* Version 0.4.0 (2022-03-11)
** Add FSM profiler
   Add =smc profile= command.  Currently the profiler allows to measure the
   time a FSM spends in each state.
** Add =guile-standalone= compilation target
   This compilation target produces GNU Guile FSM code in a single file that
   does not dependent on Guile-SMC.

   All required Guile-SMC procedures will be copied to the output stream, and
   the extra procedures that are not used in the output code are removed by
   pruning.

   Here's an example of an output FSM (without the auxiliary code copied from
   Guile-SMC that normally goes before this procedure):
** Add =guile-standalone-copy= compilation target
   The compiler can be configured in such way that it will copy all the
   modules that are needed to run the output FSM so the FSM will not depend on
   Guile-SMC.
** =smc compile= now accepts =--target= option
   This option allows to set the compilation target.  Allowed targets are:
   - guile
   - guile-standalone
   - guile-standalone-copy
** =smc compile= now allows to pass input file as an argument
** =smc= now handles =--version= option
   The state machine compiler now either read input FSM description in
   PlantUML format from the standard input or from a file specified as an
   argument.
** Optimize the PlantUML parser
   PlantUML parser now about 25% faster.
** Add new examples
** Add =smc= man page
** Update/expand the documentation
* Version 0.3.0 (2021-12-04)
** Bootstrap PlantUML parser by itself
   Now Guile-SMC uses itself to generate an FSM for PlantUML format.
** =(smc version)=: New module
   The module contains information about the current Guile-SMC version.
** Guile-SMC compiler now adds version information to the output file
** Add new context modules
   There are now =(smc context context-char)=.  This module defines guards
   for the whole ASCII table.
** Allow to provide custom event sources for FSMs
** Allow to set entry/exit actions for each state
** Use a logger implementation from the Guile-Library
** Order of parameters of guards and actions is changed
** =(smc puml)=: Improve PlantUML syntax checking
** Guile-SMC now allows to set a FSM description
** =smc= functionality now split between sub-commands
** =smc= now allows to generate and analyze FSM context
   See =context= sub-command.
** =(smc fsm)=: API of =fsm-run!= is simplified
** Implement "run" command
   The =smc= program now has =run= command that allows to read and run a
   finite-state machine based on a PlantUML description right away.
** Add new tests
** Documentation updated
* Version 0.2.0 (2021-06-06)
** Fix installation paths for source and compiled and files
   - Compiled files are now installed to the right 'site-ccache' path.
   - Guile modules are now installed to the current Guile site directory by
     default.

   Thanks to Aleix Conchillo Flaqué.
** Expand the Texinfo documentation
** API changes
*** =(smc context context)=: Bugfix
    The =<context>= would always have unexpected side effects due to field
    initialization with a single global instance of a <stack>. The instance
    would become shared between all the context in an application.

    Now the error is fixed.
*** =action:no-op= procedure moved to the context
    Now it's available from =(smc context char-context)= and =(smc context
    context)=.
*** All transition guards are now a part of Guile-SMC contexts
    There are modules in =(smc context)= name space that contain the
    transition guards.

    =(smc guards char)= is removed.
*** =(smc context char-context)=: New module
    This module contains a context for handling streams of characters.
*** In =(smc fsm)=
**** New procedures in (smc fsm)
     - =fsm?=
**** Renames
     - =log-debug-transition= -> =fsm-log-transition=
** Changes in =smc= program
*** Handle FSM validation independently
    The =smc= tool now handles FSM validation (=--validation= flag)
    independently from e.g. compilation. Compilation stops when any problems in
    the output FSM are found.
*** Handle empty =modules= and =fsm-module= options
    The program does not throw an error when the options left empty -- it uses
    default values instead.
* Version 0.1.0 (2021-05-01)
  First version of Guile-SMC.

Local Variables:
mode: org
End:
