是否有类似Awk或Lisp的编程语言可以处理s表达式流?

Cal*_*ter 6 lisp awk pipe s-expression

我最近在KiCad中创建了一些PCB封装,它们存储在s-expression文件中,其数据如下所示:

(fp_text user %R (at 0 5.08) (layer F.Fab)
  (effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start -27.04996 -3.986) (end -27.24996 -3.786) (layer F.Fab) (width 0.1))
(pad "" np_thru_hole circle (at 35.56 0) (size 3.175 3.175) (drill 3.175) (layers *.Cu *.Mask)
  (clearance 1.5875))
(pad 96 smd rect (at 1.25 3.08473) (size 0.29972 1.45034) (layers F.Cu F.Paste F.Mask)
  (clearance 0.09906))
Run Code Online (Sandbox Code Playgroud)

我希望能够编写shell one-liners来有效地编辑多个参数.我通常会使用Awk这样的东西,但是s表达式的递归性质使它不适合这项任务.我想知道是否存在一种带有解释器的编程语言,用于处理管道数据并且可以本地处理s表达式.也许Lisp的数据驱动方言会这样做,但我不知道在哪里看.

总之,我希望能够以类似于Awk允许我逐行处理数据列的方式快速编辑s表达式文件; 仅在s表达式的情况下,处理将逐级执行.

例如:发现所有的的pad类型的表达式smd(size 0.29972 1.45034),并重新编号基于其位置每一个.

Bas*_*tch 3

只需编写一个简单的 Lisp 或 Scheme 脚本,它会循环读取并根据需要递归处理您的 s-expr。在 Linux 上,我建议使用Guile(一个很好的 Scheme 解释器)或者Clisp(一个简单的 Common Lisp 实现),甚至SBCL(一个非常强大的 Common Lisp)。

(您可能会考虑DSSSL,但在您的情况下它是多余的)

请注意,您的示例输入不是S-表达式,因为(layer F.Fab)它不是一个(因为在点之后您应该有另一个 s-表达式,而不是像 那样的原子Fab)。我猜这是一个错字,应该是 (layer "F.Fab");或者您的 KiCad 软件可能不处理 S 表达式,而是处理一些受 S 表达式启发的其他输入语言(应指定,可能以EBNF表示法)。

另请注意,KiCad是一款免费软件,并拥有一个包含论坛和邮件列表的社区。也许你应该在那里问你的实际问题?

附言。我们不知道您想要什么转换,但Scheme 和Common Lisp 确实适合此类任务。在大多数情况下,它们的编码非常简单(可能只有几行)。