====== Sycl ====== [[https://git.syndicate-lang.org/ehmry/sycl|Sycl]] is the Tcl implementation of the [[.:syndicate|Syndicated Actor Model]]. Sycl is comprised of the ''preserves'' and ''syndicate'' libraries. ==== Preserves ==== A Tcl interpreter extension((https://git.syndicate-lang.org/ehmry/sycl/src/branch/trunk/preserves.md)) implemented in [[Nim]]. Preserves((https://preserves.dev/)) is the data language used by Syndicate. Preserves can be written in text syntax, which the interpreter extension can parse automatically from Tcl strings. Preserves also has a binary syntax, which the Syndicate library uses for communicating over a network. Preserves text syntax is a superset of JSON, so the library also acts as a JSON parser. The library can render to JSON as well, but some type conversions are made. package require preserves set pr [preserves parse {{foo: 0 bar: 1}}] # {bar: 1 foo: 0} preserves render $pr # {bar: 1 foo: 0} preserves render -json $pr # {"bar":1,"foo":0} ==== Syndicate ==== The Syndicate library((https://git.syndicate-lang.org/ehmry/sycl/src/branch/trunk/syndicate.md)) is almost pure Tcl and makes heavy use of namespaces. The library supports a SAM facet((https://synit.org/book/glossary.html#facet)) tree using nested namespaces. The ''during'' proc (equivalent to ''When'') executes its handle script in a new namespace on every match, and when the ''during'' statement expires the namespaces are destroyed automatically. === Relaying === The library does not implement [[.:syndicate#dataspaces|dataspaces]]. It can however communicate with external dataspaces provided by ''syndicate-server'' from the Rust implementation((https://git.syndicate-lang.org/syndicate-lang/syndicate-rs)). package require syndicate set route {]>} syndicate::spawn exampleActor { connect $route remoteDataspace { setDefaultTarget $remoteDataspace assert [list hello world] during "[weather is @weather #?]" { puts "Weather at $::route is $weather." } } } vwait ${exampleActor}::stopped === Patterns === Patterns for matching SAM assertions are written as strings. The pattern ''@z #([@x #? #_ @y #?])'' would match against ''[foo baz bar]'' and could trigger a handler bindings equivalent to: set x foo set y bar set z [list foo bar baz] ===== Availability ===== Sycl is only known to have been built with the [[Nix]] package manager, but Nix can work on practically any Linux distro. Sycl is compatible with Tcl 8 & 9. ===== Example programs ===== * [[.:synit|Synit]] service utility: https://git.syndicate-lang.org/synit/synit-service * [[.:synit|Synit]] network-configurator: https://git.syndicate-lang.org/synit/synit-network-utils/src/branch/trunk/network-configurator.tcl