I would like to get the results of a function which calls a shell command and returns a string. I am using racket, and this is my first attempt:
(define (run-function)
(let*
([stdout (some-function)]
[output (process-string stdout)])
;; many more lines...
output))
It seems to work well enough, but suppose that I would like to write functions similar to run-function for many other shell commands.
To avoid code duplication, I could just define a more general function like this:
(define (shell cmd)
(let*
([stdout (cmd)]
[output (process-string stdout)])
;; many more lines...
output))
and then call for example (shell ls) or (shell pwd).
An alternative would be using a simple macro:
(define-syntax shell
(syntax-rules ()
[(shell cmd)
(let*
([stdout (cmd)]
[output (process-string stdout)])
;; many more lines...
output)]))
This would also have the advantage of allowing a more general syntax, for example I could easily change the macro so that it takes as many parameters (commands) as I want, but I am sure the same behaviour could be replicated by writing the higher order function more sensibly.
Q. What are the pros/cons of writing a higher order function vs a macro? Is there a clear winner between the two?