I am not familiar with Rebol but from what I gathered from the &quot;So...What Can&#x27;t Be Done?&quot; section of the article is that `use` is more like a code walker that does lexical binding before the given expression is expanded and evaluated (hence the need for `compose`).<p>If I understand things correctly this is a lot like the `defmacro!` and sub-lexical scoping that Doug Hoyte writes about in _Let Over Lambda_. There the intention of code walking and rewriting is to prevent unwanted variable capture (walking over the code and replacing certain names with unique ones that have their own unique locations is basically implementing lexical scoping).<p>So where `progv` might run into trouble is:<p><pre><code>    (progv &#x27;(msg) &#x27;(&quot;Hello&quot;) (greater10 20 &#x27;(foobar msg)))
</code></pre>
Where foobar is something like:<p><pre><code>    (defmacro foobar (x)
      `(let ((msg &quot;abc&quot;))
         ,x))
</code></pre>
And a Common Lisp `use` might be something like:<p><pre><code>    (defmacro use (var binding expression)
      (let ((var1 (gensym)))
        `(let ((,var1 ,binding))
           ,(subst var1 var expression))))</code></pre>