加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-14 01:06:05 所属栏目:Linux 来源:网络整理
导读:我最近在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) (
我最近在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))

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

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

示例:查找smd类型的所有pad表达式(大小为0.29972 1.45034),并根据其位置对每个表达式重新编号.

解决方法

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

(你可能会考虑DSSSL,但在你的情况下它是矫枉过正的)

请注意,您的样本输入不是S-expression,因为(图层F.Fab)不是一个(因为在点之后您应该有另一个s表达式,而不是像Fab这样的原子).我想这是一个错字,应该是(层“F.Fab”);或者你的KiCad软件不会处理S表达式,而是一些受S表达式启发的其他输入语言(应该在EBNF表示法中指定).

另请注意,KiCad是一个免费软件,拥有一个forums社区和一个邮件列表.也许你应该问你那里的实际问题?

PS.我们不知道你有什么转变,但Scheme和Common Lisp非常适合这样的任务.在大多数情况下,它们的编码非常简单(可能只有几行).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读