In Common Lisp, there are a lot of macros that begin with the word
“with-
”. These typically wrap a body of
code, and establish a context around the execution of the code.
In Scheme, they instead have a lot of functions that begin with the
words “call-with-
”. They typically take
a thunk or receiver as an argument, and establish a
context around a call to the thunk or receiver.
Both of these forms accomplish the same sort of thing: running some
user supplied code within a context. The Scheme way accomplishes
this without a macro, but “call-with-
”
functions are rarely used as arguments to higher order functions.
Writing one as a function is slightly easier than writing one as a
macro because the compiler takes care of avoiding variable capture.
Writing one as a macro leaves it up to the implementor to use
appropriate gensyms. Writing one as a macro avoids a closure and a
function call, but so does inlining the function. The macro
form is slightly more concise because it doesn’t have
a lambda
at every call site. The function form will
likely be easier to debug because it will probably involve a frame
on the stack.
There’s no need to commit to either. Just write a
“with-
” macro that expands into a call to
an inline “call-with-
” function. This
should equally please and irritate everyone.
But what reason would anyone have for being irritated?
ReplyDeleteSome further benefits from this old blog post here: http://random-state.net/log/3390120648.html
ReplyDelete