summaryrefslogtreecommitdiff
path: root/project/templates/thue2a.html
diff options
context:
space:
mode:
Diffstat (limited to 'project/templates/thue2a.html')
-rw-r--r--project/templates/thue2a.html97
1 files changed, 97 insertions, 0 deletions
diff --git a/project/templates/thue2a.html b/project/templates/thue2a.html
new file mode 100644
index 0000000..c0430db
--- /dev/null
+++ b/project/templates/thue2a.html
@@ -0,0 +1,97 @@
+
+{% extends "base.html" %}
+
+
+
+{% block title %}Thue Version 2a{% endblock %}
+
+
+
+{% block content %}
+
+<h4>Thue Version 2a</h4>
+
+<p><a href="http://esolangs.org/wiki/Thue">Thue</a> is an esoteric programming language
+based on unrestricted grammars. A Thue program consists of a number of rules detailing a
+sequence of symbols to replace and a sequence of symbols to replace with, and an initial
+state of the program. Applicable rules are then applied to the inital state in a random
+order until no more are applicable, at which point the program terminates.</p>
+
+<p>An example Thue program that increments a binary number surrounded by '_' characters:
+<code>
+ 1_::=1++
+ 0_::=1
+ 01++::=10
+ 11++::=1++0
+ _0::=_
+ _1++::=10
+ ::=
+ _1111111_
+</code>
+</p>
+
+<p>The before and after symbols in each rule are separated by '::=' and the list of rules is
+ended by a blank rule. Note that whitespace in rules and the inital state is NOT ignored.</p>
+
+<p>Output is handled by prefixing the right hand side with '~', which causes those symbols to
+go to stdout and the replacement in the program to be the empty string.</p>
+
+<p>The traditional Hello World program:
+<code>
+ a::=~Hello World!
+ ::=
+ a
+</code>
+</p>
+
+<p>Input is handled by having the right hand side of a rule be ':::', which causes the left
+hand side symbols to be replaced with a line from the standard output. Unfortunately, this
+immediately causes problems.</p>
+
+<p>The following is an innocent piece of code that accepts a single line of input and does nothing
+more. Maybe.
+<code>
+ a::=:::
+ ::=
+ a
+</code>
+</p>
+
+<p>If a string involving the letter 'a' is entered into the above program, the single input rule
+will again become applicable and another line of input will be obtained. In other words, the
+input in Thue is unescaped and allows direct code injection into a program.</p>
+
+<p>To solve this problem, I've constructed a slightly modified version of Thue that I'm calling
+version 2a. In this version, all symbols obtained through stdin are treated as different from
+ordinary symbols. Rules can refer to and manipulate symbols obtained through stdin by
+surrounding them in double quotes.</p>
+
+<p>A rule that replaces an ordinary symbol 'a' with 'abc':
+<code>
+ a::=abc
+</code>
+</p>
+
+<p>A rule that replaces the letter 'a' that was obtained from stdin with 'abc':
+<code>
+ "a"::=abc
+</code>
+</p>
+
+<p>For convenience, a number of escaped characters are also available:
+<pre>
+ \\ -> backslash
+ \r -> return
+ \n -> newline
+ \: -> colon
+ \" -> double quote
+ \EOT -> end of file
+</pre>
+</p>
+
+<p>While this doesn't solve all the problems Thue has (try writing a Thue program that asks
+for and greets the user by name!) it should solve this one particular issue. Source code is
+available <a href="https://github.com/jedb/esoteric">here</a>.</p>
+
+{% endblock %}
+