<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    We went around on this a few times, and in the end concluded that it
    is easy to just wrap the whole thing with a lambda:<br>
    <br>
        () -> STR."Connection from \{name} at \{time}"<br>
    <br>
    which is a Supplier<String>.  Lots of logging frameworks
    already are prepared to deal with Supplier.  <br>
    <br>
    <div class="moz-cite-prefix">On 9/22/2022 3:09 PM, Nathan Walker
      wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:CADM1oTkN2KrO5dsjXNFhrJwNPHmEiYiqMsEG=jdXxtVxwQFO5Q@mail.gmail.com">
      
      <div dir="auto"><span style="word-spacing:1px;color:rgb(49,49,49)">That
          was all about what I expected.  And it is probably the option
          that will result in the fewest surprises for developers.  The
          log example you linked was very interesting.</span><br style="color:rgb(49,49,49);word-spacing:1px">
        <br style="color:rgb(49,49,49);word-spacing:1px">
        <span style="word-spacing:1px;color:rgb(49,49,49)">Has
          permitting lambda/method-reference syntax to insert lazy
          expressions been discussed before?  I would really love to be
          able to do something like "The time is \{Instant::now}" or
          "The time is \{()->Instant.now()}"</span><br>
      </div>
      <div dir="auto"><br>
      </div>
      <div dir="auto"><font style="color:rgb(49,49,49)"><span style="word-spacing:1px">I think there is a lot of potential
            in allowing TemplateProcessors that elect to skip processing
            a template for some precondition avoid the overhead of any
            expensive embedded expressions, and I think this would be
            especially true in processors that can fail by throwing a
            checked exception. </span></font></div>
      <div dir="auto"><br>
      </div>
      <div dir="auto">Thanks,</div>
      <div dir="auto">Nathan</div>
      <div dir="auto"><br>
        <div class="gmail_quote" dir="auto">
          <div dir="ltr" class="gmail_attr">On Thu, Sep 22, 2022 at
            10:17 AM Jim Laskey <<a href="mailto:james.laskey@oracle.com" moz-do-not-send="true" class="moz-txt-link-freetext">james.laskey@oracle.com</a>>
            wrote:<br>
          </div>
          <blockquote class="gmail_quote" style="margin:0px 0px 0px
0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)">
            <div style="word-wrap:break-word;line-break:after-white-space">
              <br>
              <div><br>
                <blockquote type="cite">
                  <div>On Sep 22, 2022, at 11:08 AM, Nathan Walker <<a href="mailto:nathan.h.walker@gmail.com" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">nathan.h.walker@gmail.com</a>>
                    wrote:</div>
                  <br>
                  <div>
                    <div>
                      <div dir="auto"><span style="word-spacing:1px;color:rgb(49,49,49)">Hi
                          folks,</span><br style="color:rgb(49,49,49);word-spacing:1px">
                        <br style="color:rgb(49,49,49);word-spacing:1px">
                        <span style="word-spacing:1px;color:rgb(49,49,49)">Question
                          regarding TemplateStrings that I could not
                          seem to find the answer to in the JEP write up
                          or the Javadoc for TemplateString:  Is the
                          expression evaluation lazy, or immediate?</span><br style="color:rgb(49,49,49);word-spacing:1px">
                        <br style="color:rgb(49,49,49);word-spacing:1px">
                        <span style="word-spacing:1px;color:rgb(49,49,49)">In
                          other words, if I do something like this:</span><br style="color:rgb(49,49,49);word-spacing:1px">
                        <br style="color:rgb(49,49,49);word-spacing:1px">
                        <span style="word-spacing:1px;color:rgb(49,49,49)"> 
                             List<Integer> list=new
                          ArrayList<>();</span><br style="color:rgb(49,49,49);word-spacing:1px">
                        <span style="word-spacing:1px;color:rgb(49,49,49)"> 
                             TemplateString ts = "size = \{list.size()}"</span><br style="color:rgb(49,49,49);word-spacing:1px">
                        <span style="word-spacing:1px;color:rgb(49,49,49)"> 
                             list.add(1);</span><br style="color:rgb(49,49,49);word-spacing:1px">
                        <span style="word-spacing:1px;color:rgb(49,49,49)"> 
                             System.out.println(ts.apply(S</span><span style="word-spacing:1px;color:rgb(49,49,49)">TR));</span><br style="color:rgb(49,49,49);word-spacing:1px">
                        <br style="color:rgb(49,49,49);word-spacing:1px">
                        <span style="word-spacing:1px;color:rgb(49,49,49)">Will
                          it print out size = 0, or size = 1?</span><br style="color:rgb(49,49,49);word-spacing:1px">
                      </div>
                    </div>
                  </div>
                </blockquote>
                <div><br>
                </div>
                <div>The expression is evaluated and the value is
                  captured when creating the <font style="color:rgb(49,49,49)"><span style="word-spacing:1px">TemplatedString instance.
                      There is some discussion around left to right
                      evaluation that tries to clarify this. So the
                      answer is “size = 0”. </span></font></div>
                <div><br>
                </div>
                <br>
                <blockquote type="cite">
                  <div>
                    <div>
                      <div dir="auto"><br style="color:rgb(49,49,49);word-spacing:1px">
                        <span style="word-spacing:1px;color:rgb(49,49,49)">My
                          main reason for asking is that I would love
                          for string templates to result in logging
                          interfaces with overloaded methods that can
                          take TemplateStrings instead of strings, and
                          which are only evaluated if the log level is
                          enabled.  So that instead of something like
                          this:</span><br style="color:rgb(49,49,49);word-spacing:1px">
                        <br style="color:rgb(49,49,49);word-spacing:1px">
                        <span style="word-spacing:1px;color:rgb(49,49,49)"> 
                             if (logger.isEnabled(Level.DEBUG)</span><span style="word-spacing:1px;color:rgb(49,49,49)">)
                          {</span><br style="color:rgb(49,49,49);word-spacing:1px">
                        <span style="word-spacing:1px;color:rgb(49,49,49)"> 
                                  logger.log(Level.DEBUG, "Expensive
                          value is " + lookup() );</span><br style="color:rgb(49,49,49);word-spacing:1px">
                        <span style="word-spacing:1px;color:rgb(49,49,49)"> 
                             }</span><br style="color:rgb(49,49,49);word-spacing:1px">
                        <br style="color:rgb(49,49,49);word-spacing:1px">
                        <span style="word-spacing:1px;color:rgb(49,49,49)">we
                          can just do:</span><br style="color:rgb(49,49,49);word-spacing:1px">
                        <br style="color:rgb(49,49,49);word-spacing:1px">
                        <span style="word-spacing:1px;color:rgb(49,49,49)"> 
                             log.log(Level.DEBUG, "Expensive value is
                          \{lookup()}");</span><br style="color:rgb(49,49,49);word-spacing:1px">
                        <br style="color:rgb(49,49,49);word-spacing:1px">
                        <span style="word-spacing:1px;color:rgb(49,49,49)">And
                          be confident that the cost of invoking
                          lookup() will only be paid if DEBUG is
                          enabled.</span><br style="color:rgb(49,49,49);word-spacing:1px">
                        <br style="color:rgb(49,49,49);word-spacing:1px">
                        <span style="word-spacing:1px;color:rgb(49,49,49)">Probably
                          over 80% of the string building I have seen
                          over my career has been related to building
                          log messages.  And the mistakes I have most
                          often seen are:</span><br style="color:rgb(49,49,49);word-spacing:1px">
                        <br style="color:rgb(49,49,49);word-spacing:1px">
                        <span style="word-spacing:1px;color:rgb(49,49,49)"> 
                             1. Expensive message construction not
                          guarded by checking if logging is enabled at
                          that level</span><br style="color:rgb(49,49,49);word-spacing:1px">
                        <span style="word-spacing:1px;color:rgb(49,49,49)"> 
                             2. Expensive message construction guarded,
                          but by checking the *wrong* logging level
                          (e.g. check INFO, log at ERROR)</span><br style="color:rgb(49,49,49);word-spacing:1px">
                        <span style="word-spacing:1px;color:rgb(49,49,49)"> 
                             3. Using some sort of parameterized
                          message/string format but getting the
                          parameters wrong (out of order, missing one,
                          having too many, etc.)</span><br style="color:rgb(49,49,49);word-spacing:1px">
                        <br style="color:rgb(49,49,49);word-spacing:1px">
                        <span style="word-spacing:1px;color:rgb(49,49,49)">If
                          TemplateStrings evaluate their expression
                          fragments only when processed then every one
                          of these problems gets addressed, and logging
                          code becomes *a lot* simpler to read, write,
                          and code review.</span><br style="color:rgb(49,49,49);word-spacing:1px">
                        <br style="color:rgb(49,49,49);word-spacing:1px">
                        <span style="word-spacing:1px;color:rgb(49,49,49)">(Random
                          side note: I *love* the choice of \ instead of
                          $.  It took some time for me to get use to the
                          idea, but keeping the same escape character is
                          fantastic and I wish more languages had done
                          that instead of using $)</span><br style="color:rgb(49,49,49);word-spacing:1px">
                      </div>
                    </div>
                  </div>
                </blockquote>
                <div><br>
                </div>
                <div><font style="color:rgb(49,49,49)"><span style="word-spacing:1px">You can play some tricks
                      with Suppliers or Futures + lambdas to get lazy
                      evaluation. I have an roughed out (i.e., old)
                      example at </span><span style="word-spacing:1px"><a href="https://cr.openjdk.java.net/~jlaskey/templates/examples/Log.java" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">https://cr.openjdk.java.net/~jlaskey/templates/examples/Log.java</a></span></font></div>
                <div><font style="color:rgb(49,49,49)"><span style="word-spacing:1px"><br>
                    </span></font></div>
                <div><font style="color:rgb(49,49,49)"><span style="word-spacing:1px">Cheers,</span></font></div>
                <div><font style="color:rgb(49,49,49)"><span style="word-spacing:1px"><br>
                    </span></font></div>
                <div><font style="color:rgb(49,49,49)"><span style="word-spacing:1px">— Jim</span></font></div>
              </div>
            </div>
            <div style="word-wrap:break-word;line-break:after-white-space">
              <div>
                <div><font style="color:rgb(49,49,49)"><span style="word-spacing:1px"><br>
                    </span></font></div>
                <div><br>
                </div>
                <br>
                <blockquote type="cite">
                  <div>
                    <div>
                      <div dir="auto"><br style="color:rgb(49,49,49);word-spacing:1px">
                        <span style="word-spacing:1px;color:rgb(49,49,49)">Thanks
                          for your time,</span><br style="color:rgb(49,49,49);word-spacing:1px">
                        <span style="word-spacing:1px;color:rgb(49,49,49)">Nathan</span>
                      </div>
                    </div>
                    -- <br>
                    <div dir="ltr" data-smartmail="gmail_signature">
                      <div>Nathan H. Walker</div>
                      <div><a href="mailto:nathan.h.walker@gmail.com" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">nathan.h.walker@gmail.com</a></div>
                      <div>(703) 987-8937</div>
                      <div><br>
                      </div>
                      <div><br>
                      </div>
                    </div>
                  </div>
                </blockquote>
              </div>
              <br>
            </div>
          </blockquote>
        </div>
      </div>
      -- <br>
      <div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature">
        <div>Nathan H. Walker</div>
        <div><a href="mailto:nathan.h.walker@gmail.com" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">nathan.h.walker@gmail.com</a></div>
        <div>(703) 987-8937</div>
        <div><br>
        </div>
        <div><br>
        </div>
      </div>
    </blockquote>
    <br>
  </body>
</html>