【问题标题】:Are there lisp-like macros in the shell?shell中有类似lisp的宏吗?
【发布时间】:2022-10-23 12:16:19
【问题描述】:

我有一组看起来像这样的 shell 命令

if check-some-condition $a then;
   do stuff
   run-exit-code $a
fi

其中check-some-conditionrun-exit-code 可以替换为采用单个参数$a 的函数,而do stuff 是可能几个shell 命令的占位符。是否可以模拟我可以编写的宏的 Lisp 功能

(my-macro $a stuff)

并将其替换为上面的代码吗?我正在使用 Bash,但如果它们具有使这更容易的功能,我可以使用任何其他 shell。起初我想使用函数,但我认为我不能传入一个命令块。

【问题讨论】:

  • 不,shell 没有宏预处理器。您可以编写一个使用eval 的shell 函数。
  • @ptdecker 我可以使用任何工具。 M4会是这样做的规范方式吗?
  • M4 是一个通用的宏处理器。您可能需要通过它来传输整个脚本。
  • PowerShell 支持脚本块,但在不知道 check-some-conditionrun-exit-code 做什么的情况下,很难说将它们转换为 PowerShell 有多么容易(这与传统的 unix shell 完全不同)。

标签: shell macros lisp


【解决方案1】:

shell 中没有宏定义系统,因此不会遍历 shell 语法以扩展宏。但是,shell 有一个文本 eval 命令。您可以编写一个合成 shell 语法的函数,例如通过将给定的参数插入到模板中。该函数可以打印该语法,调用者可以使用$(...) 命令替换语法捕获并传递给eval

eval $(macro-like foo bar)

每次执行该行代码时都会发生扩展。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 2011-12-28
    • 2022-11-24
    • 2022-11-29
    • 1970-01-01
    • 2013-07-29
    相关资源
    最近更新 更多