diff --git a/content/blog/00_types_intro.md b/content/blog/00_types_intro.md index d3ee8d4..6f0b4b3 100644 --- a/content/blog/00_types_intro.md +++ b/content/blog/00_types_intro.md @@ -4,11 +4,11 @@ date: 2022-06-26T18:36:01-07:00 tags: ["Type Systems", "Programming Languages"] series: "Everything I Know About Types" draft: true +bergamot: + render_presets: + default: "lc.bergamot" --- -{{< katex_component_js >}} -{{< bergamot_js_css >}} - I am in love with types and type systems. They are, quite probably, my favorite concept in the world. Most of us mere mortals use types as a way to make sure we aren't writing diff --git a/content/blog/01_types_basics.md b/content/blog/01_types_basics.md index 7c6aa75..af5ded9 100644 --- a/content/blog/01_types_basics.md +++ b/content/blog/01_types_basics.md @@ -4,11 +4,11 @@ date: 2022-06-30T19:08:50-07:00 tags: ["Type Systems", "Programming Languages"] series: "Everything I Know About Types" draft: true +bergamot: + render_presets: + default: "lc.bergamot" --- -{{< katex_component_js >}} -{{< bergamot_js_css >}} - It's finally time to start looking at types. As I mentioned, I want to take an approach that draws a variety of examples from the real world - I'd like to talk about examples from real programming diff --git a/content/blog/bergamot/index.md b/content/blog/bergamot/index.md index fa0b1a4..cf1a512 100644 --- a/content/blog/bergamot/index.md +++ b/content/blog/bergamot/index.md @@ -3,11 +3,11 @@ title: "Bergamot: Exploring Programming Language Inference Rules" date: 2023-12-22T18:16:44-08:00 tags: ["Project", "Programming Languages"] description: "In this post, I show off Bergamot, a tiny logic programming language and an idea for teaching inference rules." +bergamot: + render_presets: + default: "lc.bergamot" --- -{{< katex_component_js >}} -{{< bergamot_js_css >}} - ### Inference Rules and the Study of Programming Languages In this post, I will talk about _inference rules_, particularly in the field of programming language theory. The first question to get out of the way is diff --git a/layouts/shortcodes/bergamot_js_css.html b/layouts/shortcodes/bergamot_js_css.html deleted file mode 100644 index 4509d1e..0000000 --- a/layouts/shortcodes/bergamot_js_css.html +++ /dev/null @@ -1,180 +0,0 @@ - - -{{ $style := resources.Get "scss/bergamot.scss" | resources.ToCSS | resources.Minify }} - - diff --git a/layouts/shortcodes/bergamot_preset.html b/layouts/shortcodes/bergamot_preset.html index 4f74fa8..4bebe31 100644 --- a/layouts/shortcodes/bergamot_preset.html +++ b/layouts/shortcodes/bergamot_preset.html @@ -1,8 +1,10 @@ diff --git a/static/bergamot/rendering/lc.bergamot b/static/bergamot/rendering/lc.bergamot new file mode 100644 index 0000000..e86019b --- /dev/null +++ b/static/bergamot/rendering/lc.bergamot @@ -0,0 +1,72 @@ +PrecApp @ prec(app(?l, ?r), 100, left) <-; +PrecPlus @ prec(plus(?l, ?r), 80, either) <-; +PrecAbs @ prec(abs(?x, ?t, ?e), 0, right) <-; +PrecArr @ prec(tarr(?l, ?r), 0, right) <-; + +SelectHead @ select(cons([?t, ?v], ?rest), ?default, ?v) <- ?t; +SelectTail @ select(cons([?t, ?v], ?rest), ?default, ?found) <- not(?t), select(?rest, ?default, ?found); +SelectEmpty @ select(nil, ?default, ?default) <-; + +ParenthAssocLeft @ parenthassoc(?a_i, left, right) <-; +ParenthAssocRight @ parenthassoc(?a_i, right, left) <-; +ParenthAssocNone @ parenthassoc(?a_i, none, ?pos) <-; +ParenthAssocNeq @ parenthassoc(?a_i, ?a_o, ?pos) <- not(symeq(?a_i, ?a_o)); + +Parenth @ parenth(?inner, ?outer, ?pos, ?strin, ?strout) <- + prec(?inner, ?p_i, ?a_i), prec(?outer, ?p_o, ?a_o), + join(["(", ?strin, ")"], ?strinparen), + select([ [less(?p_i, ?p_o), strinparen], [less(?p_o, ?p_i), ?strin], [ parenthassoc(?a_i, ?a_o, ?pos), ?strinparen ] ], ?strin, ?strout); +ParenthFallback @ parenth(?inner, ?outer, ?pos, ?strin, ?strin) <-; + +LatexListNil @ latexlist(nil, nil) <-; +LatexListCons @ latexlist(cons(?x, ?xs), cons(?l_x, ?l_s)) <- latex(?x, ?l_x), latexlist(?xs, ?l_s); + +IntercalateNil @ intercalate(?sep, nil, nil) <-; +IntercalateConsCons @ intercalate(?sep, cons(?x_1, cons(?x_2, ?xs)), cons(?x_1, cons(?sep, ?ys))) <- intercalate(?sep, cons(?x_2, ?xs), ?ys); +IntercalateConsNil @ intercalate(?sep, cons(?x, nil), cons(?x, nil)) <-; + +NonEmpty @ nonempty(cons(?x, ?xs)) <-; + +LatexInt @ latex(?i, ?l) <- int(?i), tostring(?i, ?l); +LatexFloat @ latex(?f, ?l) <- float(?f), tostring(?f, ?l); +LatexStr @ latex(?s, ?l) <- str(?s), escapestring(?s, ?l_1), latexifystring(?s, ?l_2), join(["\\texttt{\"", ?l_2, "\"}"], ?l); +LatexMeta @ latex(metavariable(?l), ?l) <-; +LatexLit @ latex(lit(?i), ?l) <- latex(?i, ?l); +LatexVar @ latex(var(?s), ?l) <- latex(?s, ?l); +LatexPlus @ latex(plus(?e_1, ?e_2), ?l) <- + latex(?e_1, ?l_1), latex(?e_2, ?l_2), + parenth(?e_1, plus(?e_1, ?e_2), left, ?l_1, ?lp_1), + parenth(?e_2, plus(?e_1, ?e_2), right, ?l_2, ?lp_2), + join([?lp_1, " + ", ?lp_2], ?l); +LatexPair @ latex(pair(?e_1, ?e_2), ?l) <- latex(?e_1, ?l_1), latex(?e_2, ?l_2), join(["(", ?l_1, ", ", ?l_2, ")"], ?l); +LatexAbs @ latex(abs(?x, ?t, ?e), ?l) <- latex(?e, ?l_e), latex(?t, ?l_t), latex(?x, ?l_x), join(["\\lambda ", ?l_x, " : ", ?l_t, " . ", ?l_e], ?l); +LatexApp @ latex(app(?e_1, ?e_2), ?l) <- + latex(?e_1, ?l_1), latex(?e_2, ?l_2), + parenth(?e_1, app(?e_1, ?e_2), left, ?l_1, ?lp_1), + parenth(?e_2, app(?e_1, ?e_2), right, ?l_2, ?lp_2), + join([?lp_1, " \\enspace ", ?lp_2], ?l); + +LatexTInt @ latex(tint, "\\text{tint}") <-; +LatexTStr @ latex(tstr, "\\text{tstr}") <-; +LatexTArr @ latex(tarr(?t_1, ?t_2), ?l) <- + latex(?t_1, ?l_1), latex(?t_2, ?l_2), + parenth(?t_1, tarr(?t_1, ?t_2), left, ?l_1, ?lp_1), + parenth(?t_2, tarr(?t_1, ?t_2), right, ?l_2, ?lp_2), + join([?lp_1, " \\to ", ?lp_2], ?l); +LatexTPair @ latex(tpair(?t_1, ?t_2), ?l) <- latex(?t_1, ?l_1), latex(?t_2, ?l_2), join(["(", ?l_1, ", ", ?l_2, ")"], ?l); + +LatexTypeEmpty @ latex(empty, "\\varnothing") <-; +LatexTypeExtend @ latex(extend(?a, ?b, ?c), ?l) <- latex(?a, ?l_a), latex(?b, ?l_b), latex(?c, ?l_c), join([?l_a, " , ", ?l_b, " : ", ?l_c], ?l); +LatexTypeInenv @ latex(inenv(?x, ?t, ?G), ?l) <-latex(?x, ?l_x), latex(?t, ?l_t), latex(?G, ?l_G), join([?l_x, " : ", ?l_t, " \\in ", ?l_G], ?l); + +LatexTypeBin @ latex(type(?e, ?t), ?l) <- latex(?e, ?l_e), latex(?t, ?l_t), join([?l_e, " : ", ?l_t], ?l); +LatexTypeTer @ latex(type(?G, ?e, ?t), ?l) <- latex(?G, ?l_G), latex(?e, ?l_e), latex(?t, ?l_t), join([?l_G, " \\vdash ", ?l_e, " : ", ?l_t], ?l); + +LatexConverts @ latex(converts(?f, ?t), ?l) <- latex(?f, ?l_f), latex(?t, ?l_t), join([?l_f, " \\preceq ", ?l_t], ?l); + +LatexIsInt @ latex(int(?e), ?l) <- latex(?e, ?l_e), join([?l_e, " \\in \\texttt{Int}"], ?l); +LatexIsFloat @ latex(float(?e), ?l) <- latex(?e, ?l_e), join([?l_e, " \\in \\texttt{Float}"], ?l); +LatexIsNum @ latex(num(?e), ?l) <- latex(?e, ?l_e), join([?l_e, " \\in \\texttt{Num}"], ?l); +LatexIsStr @ latex(str(?e), ?l) <- latex(?e, ?l_e), join([?l_e, " \\in \\texttt{Str}"], ?l); +LatexSym @ latex(?s, ?l) <- sym(?s), tostring(?s, ?l_1), join(["\\text{", ?l_1,"}"], ?l); +LatexCall @ latex(?c, ?l) <- call(?c, ?n, ?ts), nonempty(?ts), latexlist(?ts, ?lts_1), intercalate(", ", ?lts_1, ?lts_2), join(?lts_2, ?lts_3), join(["\\text{", ?n, "}", "(", ?lts_3, ")"], ?l); diff --git a/themes/vanilla b/themes/vanilla index acaa007..dee7579 160000 --- a/themes/vanilla +++ b/themes/vanilla @@ -1 +1 @@ -Subproject commit acaa00754bb096e2bf3cc2c6caf415a3b2aa755e +Subproject commit dee7579b2956fda6ca64819fa7d08b2832a235a9