Unix の哲学に従って、bash スクリプトを使用して結合された一連の小さなプログラムを含むプロジェクトがあります。彼らの交換フォーマットはもともと次のようなものでした:
meta1a:meta1b:meta1c AST1
meta2a:meta2b:meta2c AST2
で:
区切られたフィールドはメタデータであり、AST
はスクリプトがそのまま渡す 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を簡単に使用できます
- シェル スクリプトから簡単に呼び出すことができるか、 bash のプロセス呼び出しとパイプライン処理に代わる非常に魅力的な手段を提供します
- 可能であればストリーミング I/O。すなわち。クロージングを探して入力全体を消費するよりも、一度に 1 つの AST で作業したい
)
- 特に数回呼び出される場合は、高速で軽量です。各 AST はわずか数 KB ですが、合計すると数百 MB になる可能性があります
- 少なくとも Linux では動作するはずです。クロスプラットフォームはいいだろう
Lisp/Scheme インタープリターを使用するのが当然の選択ですが、私が経験した唯一の方法は Emacs で、これはあまりにも重すぎます。おそらく、別の実装がより軽量でこれに適していますか?
Haskell では、shelly、turtle、atto-lisp をいじりましたが、私のコードのほとんどは、String/Text/ByteString 間の変換、 のラップ/ラップ解除、Lisp
独自の 、 、 などの実装car
にcdr
費やさcons
れました。
scshについて少し読んだことがありますが、それが適切かどうかもわかりません。