【发布时间】:2021-02-25 21:31:21
【问题描述】:
我想获得一个调用 shell 命令并返回字符串的函数的结果。 我正在使用球拍,这是我的第一次尝试:
(define (run-function)
(let*
([stdout (some-function)]
[output (process-string stdout)])
;; many more lines...
output))
它似乎工作得很好,但假设我想为许多其他 shell 命令编写类似于run-function 的函数。
为避免代码重复,我可以定义一个更通用的函数,如下所示:
(define (shell cmd)
(let*
([stdout (cmd)]
[output (process-string stdout)])
;; many more lines...
output))
然后调用例如(shell ls) 或(shell pwd)。
另一种方法是使用简单的宏:
(define-syntax shell
(syntax-rules ()
[(shell cmd)
(let*
([stdout (cmd)]
[output (process-string stdout)])
;; many more lines...
output)]))
这还具有允许更通用语法的优点,例如,我可以轻松更改宏,以便它需要尽可能多的参数(命令),但我确信可以通过编写来复制相同的行为高阶函数更合理。
问。编写高阶函数与宏的优缺点是什么?两者之间有明显的赢家吗?
【问题讨论】:
-
我认为一个好的经验法则是尽可能地使用函数,并且只有当你绝对需要宏时(例如,为了避免评估)你才使用它。不是一个完美的规则(宏有利于简化语法),但重点是:尽可能使用函数。
-
@MLavrentyev 你的评论让我终于明白为什么我们会喜欢宏:做一些非常特殊的任务,比如改变解释器的工作规则——在大多数语言中都是这样除非您准备更改解释器源代码本身,否则这是不可能的(然后您必须记住使用您的自定义解释器来运行某个脚本……复杂性会飞得很快)。
标签: macros scheme racket higher-order-functions idioms