Jinser Kafka › JK blog [jsr-0003]

这是我的 blog,我会在这里写一些工作,学习中遇到的经验和笔记。

目前都是凑数的。

Forester anatomy of \def [jsr-0006]

简单描述在 Forester \def 的使用方式。从语法开始。

从 grammar 看 \def 语法大致由三个部分组成:identbinderarg。考虑一个完整的 \def 实例:

分别来看组成部分:

  1. \def 是关键词,表示一个宏定义的开始。
  2. \lamident,表示正在 \def 的宏的名字。
  3. [x]binder,即绑定参数名的位置,这里绑定的参数名是 x
  4. \lambda\x\mathpunct{.}arg,parser 中写作 arg 也许是想表示其作为 \def 参数的意思,不过实际上可以看作正在定义的宏的 body。观察 body,可以发现 binder 中绑定的参数名在其中被用到:\x

这个通过 \def 定义出的名为 \lam 的宏被设计为在 \(\LaTeX \) 环境中使用,使用 ## { } 进入。

##{
  \begin{aligned}
    \lam{x} \\
    \lam{x y} \\
    \lam{x}\lam{y} \\
  \end{aligned}
}

可以注意到参数是如何传递给 \lam 宏的,在宏后面写一对花括号,花括号中的任意字符都是会传递给该宏的参数。这里三次传递的参数分别是 xx y 以及 xy

##{
  \begin{aligned}
    \lambda\x\mathpunct{.} \\
    \lambda\x y\mathpunct{.} \\
    \lambda\x\mathpunct{.}\lambda\y\mathpunct{.} \\
  \end{aligned}
}

观察展开后的样子,可以看到这些参数分别出现在了各自原先 \x 的位置,这可以看作一种重写或替换。

渲染的效果就像下面这样:

\[ \begin {aligned} \lambda x\mathpunct {.} \\ \lambda x y\mathpunct {.} \\ \lambda x\mathpunct {.}\lambda y\mathpunct {.} \\ \end {aligned} \]

\def 的参数可以不止一个,在 binder 的位置写任意数量的参数都是允许的。

每个 binder 都需要用方括号括起来,每个绑定参数的名字都在方括号中;绑定了的参数名可以在 arg 中使用。

\SubSup{x}{y} => \(_{x}^{y}\)。

传参的时候也是写多个花括号,要传递的参数按顺序对应。

最后看一个更简单的例子:

在这个例子中,binder 被省略,这意味着这个宏不需要绑定参数。使用不需要参数的宏非常简单直接,只需要不写花括号提供参数。

\forester is a experimental forest markup language.

会被展开成:

[ocaml-forester](https://git.sr.ht/~jonsterling/ocaml-forester) is a experimental forest markup language.

ocaml-forester is a experimental forest markup language.

Forester 🖊 Neovim / ❄️ Nix 合作笔记 [jsr-0004]

扁平的文件树导航问题可以通过虚拟嵌套(部分)解决,如果不是遇到特别大的树,效果挺好的。

Fix Forester ❄️ Nix flake on x86_64-darwin [jsr-0005]

Forester 3.0 开始增加了 ❄️ Nix flake 支持,遗憾的是,jon 和 kento 都不使用 x86_64-darwin。作为二等公民 nix-darwin 的二等公民 x86_64-darwin 不幸运地 broken 了。