【发布时间】:2015-07-05 17:03:44
【问题描述】:
根据 Unix 哲学,我有一个项目,其中包含一堆使用 bash 脚本捆绑在一起的小程序。他们的交换格式最初是这样的:
meta1a:meta1b:meta1c AST1
meta2a:meta2b:meta2c AST2
:-separated 字段是元数据,ASTs 是脚本按原样传递的 s 表达式。这很好用,因为我可以使用cut -d ' ' 将元数据从 AST 中分离出来,并使用cut -d ':' 来挖掘元数据。但是,我随后需要添加一个包含空格的元数据字段,这会破坏这种格式。由于没有字段使用选项卡,我切换到以下内容:
meta1a:meta1b:meta1c:meta 1 d\tAST1
meta2a:meta2b:meta2c:meta 2 d\tAST2
由于我设想未来会添加更多元数据字段,我认为是时候切换到更结构化的格式,而不是玩“猜标点符号”的游戏。
我可以使用 JSON 和 jq,而不是分隔符和 cut,或者我可以使用 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 之间转换、包装/解包 Lisps、实现我自己的 car、@987654334 @、cons等
我读过一些关于 scsh 的文章,但也不知道这是否合适。
【问题讨论】:
标签: bash shell lisp s-expression