根据 Unix 哲学,我有一个项目,其中包含一堆使用 bash 脚本捆绑在一起的小程序。他们的交换格式最初是这样的:
meta1a:meta1b:meta1c AST1
meta2a:meta2b:meta2c AST2
其中-:
分隔的字段是元数据,而AST
s 是脚本按原样传递的 s 表达式。这很好用,因为我可以用来cut -d ' '
从 AST 中拆分元数据,并cut -d ':'
深入研究元数据。但是,我随后需要添加一个包含空格的元数据字段,这会破坏这种格式。由于没有字段使用标签,我切换到以下内容:
meta1a:meta1b:meta1c:meta 1 d\tAST1
meta2a:meta2b:meta2c:meta 2 d\tAST2
由于我设想将来会添加更多元数据字段,因此我认为是时候切换到更结构化的格式而不是玩“猜标点符号”的游戏了。
而不是分隔符,cut
我可以使用 JSON 和jq
,或者我可以使用 XML 和xsltproc
,但是由于我已经在 AST 中使用 s 表达式,我想知道是否有一种很好的方法可以在这里使用它们?
例如,看起来像这样的东西:
(echo '(("foo1" "bar1" "baz1" "quux 1") ast1)'
echo '(("foo2" "bar2" "baz2" "quux 2") ast2)') | sexpr 'caar'
"foo1"
"foo2"
我的要求是:
- 以最少的样板直接使用 stdio,因为这是我的程序读取/写入数据的地方
- 可从 shell 脚本轻松调用,或为bash 的进程调用和流水线提供非常引人注目的替代方案
- 如果可能,流式 I/O;IE。我宁愿一次使用一个 AST,而不是消耗整个输入来寻找结束
)
- 快速且轻量级,尤其是在它被多次调用的情况下;每个 AST 只有几 KB,但它们加起来可以达到数百 MB
- 至少应该在 Linux 上工作;跨平台就好了
显而易见的选择是使用 Lisp/Scheme 解释器,但我使用过的唯一一个是 Emacs,它太重量级了。也许另一个实现更轻量级并且适合这个?
在 Haskell 中,我使用过 shelly、turtle 和 atto-lisp,但我的大部分代码都用于在 String/Text/ByteString、包装/解包Lisp
、实现我自己的car
、cdr
、cons
等之间进行转换。
我已经阅读了一些关于 scsh 的内容,但也不知道这是否合适。