[...document.getElementsByClassName("term")].forEach(el => {
el.innerHTML = el.innerHTML
.replaceAll(/(?)(\()/g, "(")
.replaceAll(/(\))(?!\<)/g, ")")
.replaceAll("[", "[")
.replaceAll("]", "]")
.replaceAll(/(?$1")
})
const clearPopups = () => {
[...document.getElementsByClassName("popup")].forEach(el => {
el.remove()
})
}
const notify = (s, e) => {
console.log(e);
clearPopups()
const popup = document.createElement("div")
popup.className = "popup"
const content = document.createTextNode(s)
popup.style.left = e.pageX + "px";
popup.style.top = e.pageY + "px";
popup.appendChild(content)
document.body.appendChild(popup)
}
const describe = (c, d) => {
[...document.getElementsByClassName(c)].forEach(el => el.addEventListener("click", e => notify(d, e)));
}
describe("binary", "Syntactic sugar for a binary number representation using abstractions as data. Needs a sign and brackets to differentiate it from De Bruijn indices");
describe("char", "Syntactic sugar for a binary representation of characters using abstractions as data.");
describe("com", "This indicates a command to the interpreter. The most common commands are :test (verifying α-equivalency) and :import (importing definitions from other files).");
describe("def", "This defines a new term substitution. Using this identifier will substitute the term on its right side.");
describe("header", "[0] is the identity operation. It returns the first argument it gets. Nothing more.");
describe("index", "This number references the nth abstraction, starting counting from the inside. These 'De Bruijn indices' replace the concept of variables in lambda calculus.");
describe("left-abs", "The opening bracket of a function abstraction. It's basically the equivalent of the λ in lambda calculus.");
describe("left-app", "The opening bracket of a function application.");
describe("mixfix", "This is a mixfix operator. They can be defined like …*… where the … can then be any other term. You can use them without the … as a notation of function application.");
describe("repl", "This indicates a REPL input.");
describe("right-abs", "The closing bracket of a function abstraction.");
describe("right-app", "The closing bracket of a function application.");
describe("stack", "Stack is a dependency manager for Haskell. Install it using the corresponding instructions for your operating system.")
describe("string", "Syntactic sugar for a list of binary encoded chars.")
describe("symbol", "This substitutes a previously defined term (for example from the standard library).");
describe("ternary", "Syntactic sugar for a balanced ternary number representation using abstractions as data. Needs a sign and brackets to differentiate it from De Bruijn indices.");
describe("time", "Incredibly fast for lambda calculus standards.");
document.body.addEventListener("click", clearPopups, true)