require: "pretty.atomo"
require: "util.atomo"
(a: A) evaluate: (e: Expression) :=
a environment evaluate: e
-- various semantic helpers
A bold: s := s in-tag: "strong"
A italic: s := s in-tag: "em"
A code: (s: String) := s escape in-tag: "code"
A list: s := s in-tag: "ul"
A numbered-list: s := s in-tag: "ol"
A item: s := s in-tag: "li"
A definitions: s := s in-tag: "dl"
A item: s is: v := (s in-tag: "dt") .. (v in-tag: "dd")
A verbatim: (s: String) :=
s escape in-tag: "pre class=\"verbatim\""
-- external link
(a: A) link: name to: (url: Expression) := a link: name to: (a evaluate: url)
(a: A) link: (name: Expression) to: url := a link: (a evaluate: name) to: url
A link: (name: String) to: (url: String) :=
name in-tag: ("a href=\"" .. url .. "\" class=\"external\"")
-- pretty-printing a single expr, inline
(a: A) atomo: (e: Expression) :=
(a pretty: e) in-tag: "code"
-- pretty-printing a single expr, block
(a: A) atomo-line: (e: Expression) :=
(a pretty: e) in-tag: "pre class=\"verbatim\""
-- pretty-print a block of expressions
(a: A) atomo-segment: (e: Expression) :=
(a evaluate: e) contents (map: { c | a pretty: c }) (join: "\n")
in-tag: "pre class=\"verbatim\""
-- example code (unevaluated)
(a: A) example-segment: (e: Expression) :=
("Example:" .. (a atomo-segment: e))
in-tag: "div class=\"example\""
-- pretty-print a block of Atomo code, multiline
(a: A) atomo-block: (e: Expression) :=
a atomo-block: (a evaluate: e)
(a: A) atomo-block: (b: Block) :=
with: multiline-pretty? as: True do: {
b contents (map: { e | a atomo-line: e }) join
}
-- example interaction session
(a: A) example: (e: Expression) :=
("Example:" .. (a interaction: e))
in-tag: "div class=\"example\""
-- a REPL simulator
(a: A) interaction: (e: Expression) :=
a interaction: (a evaluate: e) on: Lobby clone
(a: A) interaction: (b: Block) :=
a interaction: b on: Lobby clone
-- a REPL simulator locked into an environment
(a: A) interaction: (e: Expression) on: (t: Expression) :=
a interaction: (a evaluate: e) on: (a evaluate: t)
(a: A) interaction: (b: Block) on: env :=
{ ("interaction: " .. b show) print
log = b contents (map: { e |
output = String-Port new do: {
display: s :=
{ output contents = output contents .. s (as: String) escape
s
} call
}
error = String-Port new do: {
display: s :=
{ error contents = error contents .. (s as: String)
output contents = output contents .. (s (as: String) escape type: "error-output")
s
} call
}
res = {
with: [
value-output? -> True
*error-output* -> error
] do: {
with-output-to: output do: {
a pretty: (env evaluate: e expand)
}
}
} catch: { e |
(a pretty: e) type: "error"
}
[ ">" type: "caret"
" "
a pretty: e
"\n"
output contents
res
"\n"
] join
}) join
log in-tag: "pre class=\"interaction\""
} call