<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=windows-1252"
      http-equiv="Content-Type">
    <title></title>
  </head>
  <body text="#000000" bgcolor="#ffffff">
    On 25.10.2010 23:35, Tom Van Cutsem wrote:
    <blockquote
      cite="mid:AANLkTimYsgzsenvhd2_Wv4Q4mtovWJ9sSV3SW5Hww-Wv@mail.gmail.com"
      type="cite"><br>
      <br>
      <div class="gmail_quote">2010/10/20 Dmitry A. Soshnikov <span
          dir="ltr">&lt;<a moz-do-not-send="true"
            href="mailto:dmitry.soshnikov@gmail.com">dmitry.soshnikov@gmail.com</a>&gt;</span><br>
        <blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt
          0.8ex; border-left: 1px solid rgb(204, 204, 204);
          padding-left: 1ex;">
          <div bgcolor="#ffffff" text="#000000"> (I answer both --
            Brendan's and Mark's letters for convenience in here).
            <div class="im"><br>
              <br>
              On 20.10.2010 21:06, Brendan Eich wrote:
              <blockquote type="cite">
                <div>
                  <div>On Oct 20, 2010, at 9:16 AM, Mark S. Miller
                    wrote:</div>
                  <br>
                  <blockquote type="cite">On Wed, Oct 20, 2010 at 7:10
                    AM, Dmitry A. Soshnikov <span dir="ltr">&lt;<a
                        moz-do-not-send="true"
                        href="mailto:dmitry.soshnikov@gmail.com"
                        target="_blank">dmitry.soshnikov@gmail.com</a>&gt;</span>
                    wrote:<br>
                    <div class="gmail_quote">
                      <blockquote class="gmail_quote" style="margin: 0px
                        0px 0px 0.8ex; border-left: 1px solid rgb(204,
                        204, 204); padding-left: 1ex;">
                        <div bgcolor="#ffffff" text="#000000"> OK, I'd
                          like nevertheless to continue the discussion
                          with possible decisions.<br>
                          <br>
                          Here is a description of how [[Get]] method
                          can work of a trapping proxy object (I took
                          the basis from the proxy semantics page -- <a
                            moz-do-not-send="true"
href="http://wiki.ecmascript.org/doku.php?id=harmony:proxies_semantics#semantics_of_proxies"
                            target="_blank">http://wiki.ecmascript.org/doku.php?id=harmony:proxies_semantics#semantics_of_proxies</a>):<br>
                          <br>
                          [[Get]] (P)<br>
                          <br>
                          When the [[Get]] internal method of a trapping
                          proxy O is called with property name P, the
                          following steps are taken:<br>
                          <br>
                             1. Let handler be the value of the
                          [[Handler]] internal property of O.<br>
                             2. Let get be the result of calling the
                          [[Get]] internal method of handler with
                          argument “get”.<br>
                             3. If get is undefined, return the result
                          of performing the default behavior, by
                          consulting handler’s “getPropertyDescriptor”
                          trap.<br>
                             4. If IsCallable(get) is false, throw a
                          TypeError exception.<br>
                             5. Let getResult be the result of calling
                          the [[Call]] internal method of get providing
                          handler as the this value, O as the first
                          argument and P as the second argument.<br>
                             6. if getResult is undefined and
                          [[HasProperty]](P)</div>
                      </blockquote>
                    </div>
                  </blockquote>
                  <div><br>
                  </div>
                  [[HasProperty]] takes O as its receiver (this)
                  parameter, so doesn't this break double-lifting? (<a
                    moz-do-not-send="true"
href="http://wiki.ecmascript.org/doku.php?id=harmony:proxies#a_simple_membrane"
                    target="_blank">http://wiki.ecmascript.org/doku.php?id=harmony:proxies#a_simple_membrane</a>)</div>
                <div>
                  <div><br>
                  </div>
                </div>
                <div><br>
                </div>
              </blockquote>
              <br>
            </div>
            Hm.. Actually, I don't completely understand what is "double
            lifting" (a proxied proxy?) as well as the whole membrane
            example (to many wrap-wrap-wrap and a every time a creating
            of a new function), but I think I should carefully read
            Mark's "markm-thesis.pdf" paper. Though, your example from
            slides is simpler than on the strawman page (but there too
            -- wrap calls wrapFunction, which in turn calls wrap again
            -- not so easy to get from the first glance, but I'll look
            closer).<br>
            <br>
            However, if someone can clarify it (the main and basic idea
            in "two words" and regarding "double lifting" too) I'll be
            very thankful, 'cause it's interesting.<br>
            <br>
            Anyway, is there an alternative how [[HasProperty]] can work
            correctly? I just though, that it's called by the "has" hook
            of a handler, which in turn can "lie" of course (i.e. return
            true when a property does not exist -- in such a case,
            noSuchMethod won't be called).</div>
        </blockquote>
        <div><br>
        </div>
        <div>I think Dmitry is right: calling [[HasProperty]] on a proxy
          object should trigger its "has()" trap in the normal way,
          which should work with double lifting.</div>
        <div><br>
        </div>
        <div>In short, double lifting is a trick where the handler
          object of a proxy is itself a handler.</div>
      </div>
    </blockquote>
    <br>
    Ah, I see, thanks. I realized it too while was analyzing the
    membrane example from Brendan's slides.<br>
    <br>
    <blockquote
      cite="mid:AANLkTimYsgzsenvhd2_Wv4Q4mtovWJ9sSV3SW5Hww-Wv@mail.gmail.com"
      type="cite">
      <div class="gmail_quote">
        <div>See section 4.5 of the paper about proxies that MarkM and I
          presented at the Dynamic Languages Symposium last week (here's
          a link to the submitted, non-final, version: &lt;<a
            moz-do-not-send="true"
            href="http://soft.vub.ac.be/%7Etvcutsem/proxies/assets/proxies.pdf">http://soft.vub.ac.be/~tvcutsem/proxies/assets/proxies.pdf</a>&gt;)
          In the paper, we use the term "meta-level shifting" instead of
          "double lifting", but it's the same concept.</div>
        <div><br>
        </div>
      </div>
    </blockquote>
    <br>
    Yeah, I'll take a detail look on the document. Thanks.<br>
    <br>
    P.S.: btw, I also realized that I misinterpreted (possibly a
    hardness of translation) your conclusion that there may be no sense
    in noSuchMethod. I missed your words about that a proxy may have no
    a proxied object (i.e. a handler just returns some completely
    virtual calculation dealing without any object). Apologize. So, from
    this viewpoint of course noSuchMethod looks a bit strange.<br>
    <br>
    Taking into account this fact, possibly it's good to move
    availability of noSuchMethod to the minor task, since the major task
    are mentioned (in previous letters, and in the recent one to
    Brendan) issues -- with if (!o.foo) o.foo = {...}, etc. Since the
    transparency of proxy objects is a sound feature, a user of the
    proxy object shouldn't know that this is a proxy. And therefore he
    may use it as he/she wishes. But he won't be able, since `o.foo`
    will always be a function.<br>
    <br>
    Also a mentioned by Mark approach with `isCall` flag will also
    require caching/invalidating the cache, etc. And unfortunately, as
    also was mentioned, it's a vicious circle -- if to distinguish
    call/not a call (via the flag e.g.) -- we, theoretically, do not
    have desirable virtual functional object, i.e. o.foo -- will be
    (possibly) `undefined` anyway (in other case -- for what to
    distinguish call/not a call?). And o.foo() will be called as a
    virtual function. That again leads to `only-invoke phantoms` scheme.<br>
    <br>
    So, it's not a simple question, and there is more sense to think
    about issues, rather than about presence of noSuchMethod as itself.<br>
    <br>
    By the way, do you see some/any solutions for those issues (Mark,
    Brendan)? I don't see yet.<br>
    <br>
    Dmitry.<br>
    <br>
    <blockquote
      cite="mid:AANLkTimYsgzsenvhd2_Wv4Q4mtovWJ9sSV3SW5Hww-Wv@mail.gmail.com"
      type="cite">
      <div class="gmail_quote">
        <div>Cheers,</div>
        <div>Tom</div>
      </div>
      <br>
    </blockquote>
    <br>
  </body>
</html>