- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个项目,其中包含一堆使用 bash 脚本捆绑在一起的小程序,按照 Unix 哲学。他们的交换格式最初是这样的:
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
由于我设想将来会添加更多的元数据字段,所以我认为是时候切换到结构化程度更高的格式,而不是玩“猜标点符号”的游戏了。
我可以使用 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"
我的要求是:
)
显而易见的选择是使用 Lisp/Scheme 解释器,但我唯一使用过的是 Emacs,它太重量级了。也许另一个实现更轻量级并且适合这个?
在 Haskell 中,我玩过 shelly、turtle 和 atto-lisp,但我的大部分代码都花在了 String/Text/ByteString 之间的转换、包装/解包 Lisp
、实现我自己的 car
, cdr
, cons
等
我读过一些关于 scsh 的资料,但也不知道那是否合适。
最佳答案
你可以试试 Common Lisp。
Straightforward use of stdio with minimal boilerplate, since that's where my programs read/write their data
(loop for (attributes ast) = (safe-read) do (print ...)
safe-read
应该在读取时禁止执行代码。至少有 one implementation .除非您完全了解其中的内容,否则不要直接评估
您的 AST。Easily callable from shell scripts or provide a very compelling alternative to bash's process invocation and pipelining
本着与 java -jar ...
相同的精神,您可以启动您的 Common Lisp 可执行文件,例如sbcl
,参数中有一个脚本:sbcl --load file.lisp
。您甚至可以转储应用程序的核心或可执行核心,并预加载所有内容(save-lisp-and-die
)。或者,使用cl-launch
它自动且可移植地执行上述操作,并生成 shell 脚本和/或从您的代码生成可执行程序。
Streaming I/O if possible; ie. I'd rather work with one AST at a time rather than consuming the whole input looking for a closing )
如果整个输入流以 (
开始,那么 read
将读取到结束的 )
字符,但实际上这很少这样做:Common Lisp 中的源代码不是包含在每个文件的一对括号中,而是作为一系列形式。如果您的流产生的不是一个而是多个 s-exp,读者将一次阅读一个。
Fast and lightweight, especially if it's being invoked a few times; each AST is only a few KB, but they can add up to hundreds of MB
它会很快,特别是如果你保存了一个核心。轻量级,众所周知,lisp 图像会占用一些磁盘空间(例如 46MB),但这很少成为问题。为什么重要?也许您对轻量级的含义有另一种定义,因为这与您将要解析的 AST 的大小无关。不过,阅读这些 AST 应该没有问题。
Should work on Linux at least; cross-platform would be nice
参见 Wikipedia .例如,Clozure CL (CCL) 在 Mac OS X、FreeBSD、Linux、Solaris 和 Windows 上运行,32/64 位。
关于bash - jq 或 xsltproc 替代 s 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31232843/
我正在用 yacc/bison 编写一个简单的计算器。 表达式的语法看起来有点像这样: expr : NUM | expr '+' expr { $$ = $1 + $3; } | expr '-'
我开始学习 lambda 表达式,并在以下情况下遇到了以下语句: interface MyNumber { double getValue(); } MyNumber number; nu
这两个 Linq 查询有什么区别: var result = ResultLists().Where( c=> c.code == "abc").FirstOrDefault(); // vs. va
如果我们查看 draft C++ standard 5.1.2 Lambda 表达式 段 2 说(强调我的 future ): The evaluation of a lambda-expressio
我使用的是 Mule 4.2.2 运行时、studio 7.5.1 和 Oracle JDK 1.8.0_251。 我在 java 代码中使用 Lambda 表达式,该表达式由 java Invoke
我是 XPath 的新手。我有网页的html源 http://london.craigslist.co.uk/com/1233708939.html 现在我想从上面的页面中提取以下数据 完整日期 电子
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
我将如何编写一个 Cron 表达式以在每天上午 8 点和下午 3:30 触发?我了解如何创建每天触发一次的表达式,而不是在多个设定时间触发。提前致谢 最佳答案 你应该只使用两行。 0 8 * * *
这个问题已经有答案了: What do 3 dots next to a parameter type mean in Java? (9 个回答) varargs and the '...' argu
我是 python 新手,在阅读 BeautifulSoup 教程时,我不明白这个表达式“[x for x in titles if x.findChildren()][:-1]”我不明白?你能解释一
(?:) 这是一个有效的 ruby 正则表达式,谁能告诉我它是什么意思? 谢谢 最佳答案 正如其他人所说,它被用作正则表达式的非捕获语法,但是,它也是正则表达式之外的有效 ruby 语法。 在
这个问题在这里已经有了答案: Why does ++[[]][+[]]+[+[]] return the string "10"? (10 个答案) 关闭 8 年前。 谁能帮我处理这个 JavaSc
这个问题在这里已经有了答案: What is the "-->" operator in C++? (29 个答案) Java: Prefix/postfix of increment/decrem
这个问题在这里已经有了答案: List comprehension vs. lambda + filter (16 个答案) 关闭 10 个月前。 我不确定我是否需要 lambda 或其他东西。但是,
C 中的 assert() 函数工作原理对我来说就像一片黑暗的森林。根据这里的答案https://stackoverflow.com/a/1571360 ,您可以使用以下构造将自定义消息输出到您的断言
在this页,John Barnes 写道: If the conditional expression is the argument of a type conversion then effec
我必须创建一个调度程序,它必须每周从第一天上午 9 点到第二天晚上 11 点 59 分运行 2 天(星期四和星期五)。为此,我需要提供一个 cron 表达式。 0-0 0-0 9-23 ? * THU
我正在尝试编写一个 Linq 表达式来检查派生类中的属性,但该列表由来自基类的成员组成。下面的示例代码。以“var list”开头的 Process 方法的第二行无法编译,但我不确定应该使用什么语法来
此 sed 表达式将输入字符串转换为两行输出字符串。两条输出行中的每一行都由输入的子串组成。第一行需要转换成大写: s:random_stuff\(choice1\|choice2\){\([^}]*
我正在使用 Quartz.Net 在我的应用程序中安排我的工作。我只是想知道是否可以为以下场景构建 CRON 表达式: Every second between 2:15AM and 5:20AM 最
我是一名优秀的程序员,十分优秀!