this post was submitted on 27 Dec 2023
38 points (100.0% liked)

Programming

423 readers
13 users here now

Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!

Cross posting is strongly encouraged in the instance. If you feel your post or another person's post makes sense in another community cross post into it.

Hope you enjoy the instance!

Rules

Rules

  • Follow the programming.dev instance rules
  • Keep content related to programming in some way
  • If you're posting long videos try to add in some form of tldr for those who don't want to watch videos

Wormhole

Follow the wormhole through a path of communities !webdev@programming.dev



founded 1 year ago
MODERATORS
top 6 comments
sorted by: hot top controversial new old
[–] Redkey@programming.dev 10 points 10 months ago* (last edited 10 months ago) (1 children)

I love low-level stuff and this still took me a little while to break down, so I'd like to share some notes on the author's code snippet that might help someone else.

The function morse_decode is meant to be called iteratively by another routine, once per morse "character" c (dot, dash, or null) in a stream, while feeding its own output back into it as state. As long as the function returns a negative value, that value represents the next state of the machine, and the morse stream hasn't yet been resolved into an output symbol. When the return value is positive, that represents the decoded letter, and the next call to morse_decode should use a state of 0. If the return value is 0, something has gone wrong with the decoding.

state is just a negated index into the array t, which is actually two arrays squeezed into one. The first 64 bytes are a binary heap of bytes in the format nnnnnnlr, each corresponding to one node in the morse code trie. l and r are single bits that represent the existence of a left or right child of the current node (i.e. reading a dot or dash in the current state leading to another valid state). nnnnnn is a 6-bit value that, when shifted appropriately and added to 63, becomes an index into the second part of the array, which is a list of UTF-8/ASCII codes for letters and numbers for the final output.

[–] wizzor@sopuli.xyz 1 points 10 months ago
[–] TehPers 7 points 10 months ago (1 children)

Also worth reading is how state machines can be encoded in the type system in some languages, for example the typestate pattern in Rust. By using the type system to encode state like this, you can prevent invalid operations on a state machine from even compiling.

[–] Amaltheamannen@lemmy.ml 3 points 10 months ago

Or just with algebraic types, like Enums in rust or data types in Haskell

[–] mrkite@programming.dev 3 points 10 months ago

State machines always make me think of the Disk II controller on the Apple II. It uses a state machine to implement reading and writing sectors to disk.

https://www.bigmessowires.com/2021/11/12/the-amazing-disk-ii-controller-card/

[–] Tractorbeam42@lemmynsfw.com 1 points 10 months ago

Brilliant! I love FSMs...and this one fairly elegant.