about summary refs log tree commit diff stats
path: root/tangle/Readme.md
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2019-02-18 20:25:37 -0800
committerKartik Agaram <vc@akkartik.com>2019-02-18 20:25:37 -0800
commitdfbc5a6c4bf9153e550c5a72dda2b1749de589f3 (patch)
tree534a9e9ff5a685f14e736609d60ddb4924e60553 /tangle/Readme.md
parentead24155ca2cebcba94a9c8d5906d6142d286a01 (diff)
downloadmu-dfbc5a6c4bf9153e550c5a72dda2b1749de589f3.tar.gz
4979
Diffstat (limited to 'tangle/Readme.md')
-rw-r--r--tangle/Readme.md112
1 files changed, 112 insertions, 0 deletions
diff --git a/tangle/Readme.md b/tangle/Readme.md
new file mode 100644
index 00000000..863965bf
--- /dev/null
+++ b/tangle/Readme.md
@@ -0,0 +1,112 @@
+[Literate Programming](https://en.wikipedia.org/wiki/Literate_programming)
+tool to convert Mu's layers into compilable form.
+
+Mu's tangling differ from Knuth's classic implementation. The classical
+approach starts out with labeled subsystems that are initially empty, and adds
+code to them using two major directives:
+
+```
+<name> ≡
+<code>
+```
+
+```
+<name> +≡
+<code>
+```
+
+(`<code>` can span multiple lines.)
+
+This approach is best suited for top-down exposition.
+
+On the other hand, Mu's tangling directives are better suited for a cleaned-up
+history of a codebase. They can tell a story of a program over multiple
+versions, within each version keeping all the code related to each new
+feature close together.
+
+Read more:
+* http://akkartik.name/post/wart-layers
+* http://akkartik.name/post/literate-programming
+* https://github.com/akkartik/mu/blob/master/000organization.cc
+
+## directives
+
+Add code to a project:
+
+```
+:(code)
+<code>
+```
+
+Insert code before a specific line:
+
+```
+:(before <waypoint>)
+<code>
+```
+
+Here `<waypoint>` is a substring matching a single line in the codebase. (We
+never use regular expressions.) Surround the substring in `"` quotes if it
+spans multiple words.
+
+Insert code _after_ a specific line:
+
+```
+:(after <waypoint>)
+<code>
+```
+
+Delete a specific previously-added line (because it's not needed in a newer
+version).
+
+```
+:(delete <line>)
+```
+
+Delete a block of code starting with a given header and surrounded by `{` and
+`}`:
+
+```
+:(delete{} <header>)
+```
+
+_(Caveat: doesn't support C's `do`..`while` loops.)_
+
+Replace a specific line with new code:
+
+```
+:(replace <line>)
+<code>
+```
+
+This is identical to:
+```
+:(before <line>)
+<code>
+:(delete <line>)
+```
+_(Assuming `<code>` did not insert a new line matching the substring `<line>`.)_
+
+Replace a block of code with another:
+
+```
+:(replace{} <header>)
+<code>
+```
+
+Insert code before or after a substring pattern that isn't quite a unique
+waypoint in the whole codebase:
+
+```
+:(before <line> following <waypoint>)
+<code>
+:(after <line> following <waypoint>)
+<code>
+```
+
+```
+:(before <waypoint> then <line>)
+<code>
+:(after <waypoint> then <line>)
+<code>
+```