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)
,并重新编号基于其位置每一个.
只需编写一个简单的 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 确实适合此类任务。在大多数情况下,它们的编码非常简单(可能只有几行)。