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.
2 comments:
But what reason would anyone have for being irritated?
Some further benefits from this old blog post here: http://random-state.net/log/3390120648.html
Post a Comment