M index.janet => index.janet +7 -3
@@ 1,5 1,6 @@
(defn render-pantagruel
[pant]
+
(defn replace-unicode
[line]
(->> line
@@ 8,13 9,16 @@
(string/replace-all "=>" "⇒")
(string/replace-all "<=" "⇐")
(string/replace-all "->" "→")
- (string/replace-all "---" "<hr>")
- (string/replace-all ";" "<hr><hr>")))
+ (string/replace-all "---" `<hr class=chapter-separator>`)
+ (string/replace-all ";" `<hr class=where>`)
+ (string/replace-all "\t" " ")))
(defn render-line
[line]
(if-not (string/has-prefix? "//" line)
- (string (replace-unicode line) "<br>")
+ (let [replaced (replace-unicode line)
+ line-end (if (string/has-suffix? ">" replaced) "" "<br>")]
+ (string replaced line-end))
(bagatto/markdown->html (string "> " (string/trim line "/")))))
(as-> pant .
M index.pant => index.pant +39 -14
@@ 1,5 1,5 @@
Thought.
-Specification <= [String].
+Specification = [String].
// Pantagruel is a language for writing *system specifications*.
@@ 8,9 8,9 @@ pantagruel thoughts: [Thought] => Specification.
// It's a computer language, but not as you might think of it.
-// The effects of evaluating a specification are *nil*---Pantagruel has no semantics.
+// The effects of evaluating a specification are *nil*---Pantagruel has no execution semantics.
-eval spec = Nil.
+eval spec = null.
;
@@ 21,24 21,49 @@ check spec: Specification => Bool.
// However, Pantagruel specifications can be checked to ensure that certain conditions have been met.
// For instance, that you've defined all your terms by the end of your document.
-check spec = all symbol: invoked_symbols spec =>
- symbol in (head spec) -> bound_as_of? symbol (first_appearance symbol)
- symbol in (body spec) -> bound_as_of? symbol (next_chapter (first_appearance symbol)).
+(all s <: invoked_symbols spec =>
+ first_invoked_in_head? s spec -> bound_as_of? s (first_appearance s spec)
+ and
+ first_invoked_in_body? s spec -> bound_as_of? s (next_chapter (first_appearance s spec))) -> check spec.
;
-(Head, Body) <= [String].
-Chapter <= [Head, Body].
-Specification <= [Chapter].
+(Head, Body) = [String].
+Chapter = (Head, Body).
+Specification = [Chapter].
// This allows a structured form of description where terms can be explained in gradually greater detail.
-invoked_symbols <= {String}.
-chapter head: Head, body: Body => Chapter.
-first_appearance symbol: String => Nat.
-bound_as_of? symbol: String, Nat => Bool.
+first_invoked_in_head? symbol: String, spec: Specification => Bool.
+first_invoked_in_body? symbol: String, spec: Specification => Bool.
+
+//
+
+invoked_symbols spec: Specification => {String}.
+first_appearance symbol: String, spec: Specification => Nat.
+
+//
+
+bound_as_of? symbol: String, position: Nat => Bool.
next_chapter n: Nat => Nat.
---
-invoked_symbols spec = {all s: String => s in spec}.
+invoked_symbols spec =
+ [all chapter <: spec, head_s <: (chapter 0) => head_s] +
+ [all chapter <: spec, body_s <: (chapter 1) => body_s].
+
+;
+
+Expression.
+
+// Specifications can also be type-checked to ensure that your logic is consistent.
+type_checks? expr: Expression => Bool.
+---
+
+(all expr <: expressions spec => type_checks? expr) -> check spec.
+
+;
+
+expressions spec: Specification => [Expression].
+---
M index.temple => index.temple +4 -1
@@ 36,12 36,15 @@
<a href="https://github.com/subsetpark/pantagruel">Pantagruel on GitHub</a>
</p>
<p>
+ <a href="https://github.com/subsetpark/pantagruel/blob/master/priv/reference.md">Pantagruel Language Reference</a>
+ </p>
+ <p>
<a href="https://blog.zdsmith.com/posts/a-specification-of-a-note-taking-program.html">A Specification of a Note-Taking Program</a>
</p>
</div>
<div class="footer">
- <div class="narrow">Z. D. Smith, 2021.</div>
+ <div class="narrow">Z. D. Smith, 2022.</div>
<div class="column"> </div>
<div class="narrow">Built with <a href="https://bagatto.co">Bagatto</a>.</div>
</div>
M static/style.css => static/style.css +7 -1
@@ 96,5 96,11 @@ h2 {
}
}
+.where {
+ border: 1px solid black;
+ margin: 4em;
+}
-
+.chapter-separator {
+ border: 1px dashed black;
+}