<html>
  <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    > There is nothing about recursion in documentation.<br>
    The only doc that I've managed to find about the subject is the link
    from my initial post
    (<a class="moz-txt-link-freetext" href="http://erlang.org/doc/reference_manual/functions.html#id78464">http://erlang.org/doc/reference_manual/functions.html#id78464</a>).<br>
    And it says about recursion: in sub-chapter's header, in sub-chapter
    itself and in the example (all in all, everywhere). Is there another
    documentation that you mean?<br>
    <br>
    <div class="moz-cite-prefix">On 10/17/2016 03:36 PM, Dmytro
      Lytovchenko wrote:<br>
    </div>
    <blockquote
cite="mid:CAOUb9CE=2bAAzKWkheRKLmKRWWdD-T2yFMSJ+HjSC-S8J2-UHQ@mail.gmail.com"
      type="cite">
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
      <div dir="ltr">
        <div>
          <div>There is nothing about recursion in documentation.<br>
            <br>
          </div>
          Your module:<br>
          -module(tc).<br>
          -export([a/0]).<br>
          a() -> b().<br>
          b() -> c().<br>
          c() -> z().<br>
          z() -> self().<br>
          <br>
          Compiles to (memory dump):<br>
          00007F07875A2DA8: i_func_info_IaaI 0 tc a 0.<br>
          00007F07875A2DD0: i_call_only_f tc:b/0.<br>
          <br>
          00007F07875A2DE0: i_func_info_IaaI 0 tc b 0.<br>
          00007F07875A2E08: i_call_only_f tc:c/0.<br>
          <br>
          00007F07875A2E18: i_func_info_IaaI 0 tc c 0.<br>
          00007F07875A2E40: i_call_only_f tc:z/0.<br>
          <br>
          00007F07875A2E50: i_func_info_IaaI 0 tc z 0.<br>
          00007F07875A2E78: self_r x(0).<br>
          00007F07875A2E80: return.<br>
          <br>
        </div>
        Note the call_only functions. These are the tail calls.<br>
        <div><br>
        </div>
      </div>
      <div class="gmail_extra"><br>
        <div class="gmail_quote">2016-10-17 14:28 GMT+02:00 Salikhov
          Dinislam <span dir="ltr"><<a moz-do-not-send="true"
              href="mailto:Dinislam.Salikhov@kaspersky.com"
              target="_blank">Dinislam.Salikhov@kaspersky.com</a>></span>:<br>
          <blockquote class="gmail_quote" style="margin:0 0 0
            .8ex;border-left:1px #ccc solid;padding-left:1ex">
            <div bgcolor="#FFFFFF" text="#000000"> The confusing thing
              is that the doc says about tail <b>recursive</b> call.<br>
              For example, if I have a call chain:<br>
                  a() -><br>
                      % some code<br>
                      b().<br>
                  b() -><br>
                      % some code<br>
                      c().<br>
                  % ...<br>
                  y() -><br>
                      %some code<br>
                      z().<br>
              Recursion is <b>not</b> involved here. And I'd like to
              know if erlang requires (and guarantees) that all tail
              callees in the chain above use the stack of the caller.<br>
              AFAIU, compiler is free to not apply the optimization if
              it is not stated in the specification (and it is pure luck
              that the compiler does).<span class="HOEnZb"><font
                  color="#888888"><br>
                  <br>
                  Salikhov Dinislam</font></span>
              <div>
                <div class="h5"><br>
                  <br>
                  <div class="m_-5841299804546824751moz-cite-prefix">On
                    10/17/2016 03:00 PM, Dmytro Lytovchenko wrote:<br>
                  </div>
                  <blockquote type="cite">
                    <div dir="ltr">
                      <div>In the doc page you linked:<br>
                        > If the last expression of a function body
                        is a function call, a <strong>tail recursive</strong>
                        call is done.<br>
                        <br>
                      </div>
                      <div>Compiler will replace call opcode with a tail
                        call (call_last, call_ext_last, apply_last). You
                        can check it with "erl -S test.erl" to see
                        assembly, and in erl console: "l(modulename)."
                        to load the module then
                        "erts_debug:df(modulename)." to create
                        disassembly from BEAM VM memory (it will be a
                        bit different from the erl -S output).<br>
                        <br>
                      </div>
                      <div>See that your calls are replaced with one of:
                        call_last, call_ext_last, apply_last.</div>
                    </div>
                    <div class="gmail_extra"><br>
                      <div class="gmail_quote">2016-10-17 10:58
                        GMT+02:00 Salikhov Dinislam <span dir="ltr"><<a
                            moz-do-not-send="true"
                            href="mailto:Dinislam.Salikhov@kaspersky.com"
                            target="_blank">Dinislam.Salikhov@kaspersky.<wbr>com</a>></span>:<br>
                        <blockquote class="gmail_quote" style="margin:0
                          0 0 .8ex;border-left:1px #ccc
                          solid;padding-left:1ex">
                          <div bgcolor="#FFFFFF" text="#000000">
                            <div
                              class="m_-5841299804546824751m_-6524208612865981557moz-text-flowed"
style="font-family:-moz-fixed;font-size:12px" lang="x-unicode">Hello. <br>
                              <br>
                              Erlang guarantees tail recursion
                              optimization and states it in the
                              documentation: <br>
                              <a moz-do-not-send="true"
class="m_-5841299804546824751m_-6524208612865981557moz-txt-link-freetext"
href="http://erlang.org/doc/reference_manual/functions.html#id78464"
                                target="_blank">http://erlang.org/doc/referenc<wbr>e_manual/functions.html#<wbr>id78464</a>
                              <br>
                              <br>
                              Does erlang guarantee that tail call
                              optimization is done in a generic case,
                              without recursion? <br>
                              Say, we have a function calling a function
                              from another module as its final
                              statement: <br>
                                  alpha() -> <br>
                                      xxx:beta(). <br>
                              Is it guaranteed that xxx:beta() will use
                              the stack of alpha() regardless whether
                              recursion is involved. <br>
                              I mean whether the language guarantees it
                              rather than virtual machine may provide
                              such optimization. <br>
                              <br>
                              Thanks in advance, <br>
                              Salikhov Dinislam <br>
                            </div>
                          </div>
                          <br>
                          ______________________________<wbr>_________________<br>
                          erlang-questions mailing list<br>
                          <a moz-do-not-send="true"
                            href="mailto:erlang-questions@erlang.org"
                            target="_blank">erlang-questions@erlang.org</a><br>
                          <a moz-do-not-send="true"
                            href="http://erlang.org/mailman/listinfo/erlang-questions"
                            rel="noreferrer" target="_blank">http://erlang.org/mailman/list<wbr>info/erlang-questions</a><br>
                          <br>
                        </blockquote>
                      </div>
                      <br>
                    </div>
                  </blockquote>
                  <br>
                </div>
              </div>
            </div>
          </blockquote>
        </div>
        <br>
      </div>
    </blockquote>
    <br>
  </body>
</html>