Re: curlyBrackets & squareBrackets

Jacob Peck <[email protected]> Tue, 13 Nov 2012 15:45:47 -0500
Newsgroups gmane.comp.lang.io
Message-ID <[email protected]>
--------------090701040309070100050603
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit

 From the source code, it's pretty clear here:

https://github.com/stevedekorte/io/blob/master/libs/iovm/source/IoLexer.c#L558-563

That is, [] and {} are just replaced with the message "squareBrackets" 
and "curlyBrackets", and from then on they're passed along just like any 
other message.  It's in the lexer, before the parser even gets a hold of 
them.

-->Jake

On 11/13/2012 3:41 PM, Jeremy Tregunna wrote:
>
> Alright, so "curlyBrackets", "squareBrackets" and "" are all treated 
> specially. They correspond to {}, [] and ().
>
> They are processed specially because they capture infix expressions. 
> That is to say, the expression itself is stuck between two known tokens.
>
> I'll provide an implementation of list() using all three (tl;dr, it's 
> the same code for all three methods)
>
> curlyBrackets := method(call evalArgs)
> squareBrackets := method(call evalArgs)
> setSlot("", method(call evalArgs))
>
> Now we can do: {1, 2, 3} or [1, 2, 3] or (1, 2, 3) /* so long as the 
> latter is preceded by a space */
>
> and things just magically work as you'd expect. That method is called, 
> and since "call evalArgs" iterates over the messages supplied as 
> arguments, evaluating them in the sending context.
>
> The "curlyBrackets" and "squareBrackets" methods are not defined by 
> default, they are permitted for user code, but the core language 
> doesn't define them. "" on the other hand, is defined by the system, 
> and it's just defined as:
>
> setSlot("", method(call evalArgAt(0)))
>
> I hope this clears up how this works.
>
> Regards,
>
> Jeremy Tregunna
>
> On Monday, 12 November, 2012 at 8:10 AM, sunwinson wrote:
>
>> I was confused about how "curlyBrackets" or "squareBrackets" are over 
>> rided by runtime.
>>
>> [Example]
>> I saw some wonderful example about redefining curlyBrackets or 
>> squareBrackets, to create graceful DSL to handle the next txt file:
>> {
>> "Blair, Black": 10,
>> "John, Kelly": 11
>> }
>>
>> Redefining "curlyBrackets" can operate the item one by by as a map.
>>
>> [My Research]
>> I searched:
>> 1. all slotNames of "Object" for "curlyBrackets", none was found.
>> 2. source code of Io language, only find one instance in Lexer, which 
>> returns "curlyBrackets" as the name of IDENTIFIER token and finally 
>> become the name of IoObject/IoObjectData. The weird thing is, it 
>> seems no one is using IoObject name or IDENTIFIER in parser. May I 
>> miss anything in source code?
>>
>> [My Guess]
>> 1. "curlyBrackets" should be some one's secret slot name, but I 
>> didn't find in reference nor Object/Lobby.
>> 2. "curlyBrackets" is specially proceed in parser, to check "if 
>> anyone implement that name, then use the specified method object".
>>
>> Could anyone can help me to understand how this "curlyBrackets" works 
>> from complier perspective? Thanks a lot!
>>
>
> 


--------------090701040309070100050603
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 8bit




<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
</head>







<body style="background-color: #fff;">
<span style="display:none">&nbsp;</span>

<!--~-|**|PrettyHtmlStartT|**|-~-->
<div id="ygrp-mlmsg" style="position:relative;">
  <div id="ygrp-msg" style="z-index: 1;">
<!--~-|**|PrettyHtmlEndT|**|-~-->

    <div id="ygrp-text" >
      
      
      <p>
  
  
    <div class="moz-cite-prefix">From the source code, it's pretty clear
      here:<br>
      <br>
      <a href="https://github.com/stevedekorte/io/blob/master/libs/iovm/source/IoLexer.c#L558-563">https://github.com/stevedekorte/io/blob/master/libs/iovm/source/IoLexer.c#L558-563</a><br>
      <br>
      That is, [] and {} are just replaced with the message
      "squareBrackets" and "curlyBrackets", and from then on they're
      passed along just like any other message.  It's in the lexer,
      before the parser even gets a hold of them.<br>
      <br>
      --&gt;Jake<br>
      <br>
      On 11/13/2012 3:41 PM, Jeremy Tregunna wrote:<br>
    </div>
    <blockquote cite="mid:[email protected]" type="cite">
      <span> </span>
      
          <div id="ygrp-text">
            <p> </p>
            <div> Alright, so "curlyBrackets", "squareBrackets" and ""
              are all treated specially. They correspond to {}, [] and
              ().
              <div><br>
              </div>
              <div>They are processed specially because they capture
                infix expressions. That is to say, the expression itself
                is stuck between two known tokens.</div>
              <div><br>
              </div>
              <div>I'll provide an implementation of list() using all
                three (tl;dr, it's the same code for all three methods)</div>
              <div><br>
              </div>
              <div>curlyBrackets := method(call evalArgs)</div>
              <div>squareBrackets := method(call evalArgs)</div>
              <div>setSlot("", method(call evalArgs))</div>
              <div><br>
              </div>
              <div>Now we can do: {1, 2, 3} or [1, 2, 3] or (1, 2, 3) /*
                so long as the latter is preceded by a space */</div>
              <div><br>
              </div>
              <div>and things just magically work as you'd expect. That
                method is called, and since "call evalArgs" iterates
                over the messages supplied as arguments, evaluating them
                in the sending context.</div>
              <div><br>
              </div>
              <div>The "curlyBrackets" and "squareBrackets" methods are
                not defined by default, they are permitted for user
                code, but the core language doesn't define them. "" on
                the other hand, is defined by the system, and it's just
                defined as:</div>
              <div><br>
              </div>
              <div>setSlot("", method(call evalArgAt(0)))</div>
              <div><br>
              </div>
              <div>I hope this clears up how this works.</div>
            </div>
            <div>
              <div><br>
              </div>
              <div>Regards,</div>
              <div><br>
              </div>
              <div>Jeremy Tregunna</div>
              <div><br>
              </div>
            </div>
            <p style="color: #A0A0A8;">On Monday, 12 November, 2012 at
              8:10 AM, sunwinson wrote:</p>
            <blockquote type="cite" style="border-left-style:solid;border-width:1px;"> <span>
                <div>
                  <div>
                    <span> </span>
                    <div>
                      <p>I was confused about how "curlyBrackets" or
                        "squareBrackets" are over rided by runtime.<br>
                        <br>
                        [Example]<br>
                        I saw some wonderful example about redefining
                        curlyBrackets or squareBrackets, to create
                        graceful DSL to handle the next txt file:<br>
                        {<br>
                        "Blair, Black": 10,<br>
                        "John, Kelly": 11<br>
                        }<br>
                        <br>
                        Redefining "curlyBrackets" can operate the item
                        one by by as a map.<br>
                        <br>
                        [My Research]<br>
                        I searched:<br>
                        1. all slotNames of "Object" for
                        "curlyBrackets", none was found.<br>
                        2. source code of Io language, only find one
                        instance in Lexer, which returns "curlyBrackets"
                        as the name of IDENTIFIER token and finally
                        become the name of IoObject/IoObjectData. The
                        weird thing is, it seems no one is using
                        IoObject name or IDENTIFIER in parser. May I
                        miss anything in source code?<br>
                        <br>
                        [My Guess]<br>
                        1. "curlyBrackets" should be some one's secret
                        slot name, but I didn't find in reference nor
                        Object/Lobby.<br>
                        2. "curlyBrackets" is specially proceed in
                        parser, to check "if anyone implement that name,
                        then use the specified method object".<br>
                        <br>
                        Could anyone can help me to understand how this
                        "curlyBrackets" works from complier perspective?
                        Thanks a lot!<br>
                        <br>
                      </p>
                    </div>
                    <!-- end group email -->
                  </div>
                </div>
              </span> </blockquote>
            <div> <br>
            </div>
          </div>
          
      
      <!-- end group email -->
    </blockquote>
    <br>
  

</p>

    </div>
     

    <!--~-|**|PrettyHtmlStart|**|-~-->
    <div style="color: #fff; height: 0;">__._,_.___</div>

        
  
  
    <table cellspacing=4px style="margin-top: 20px; margin-bottom: 10px;">
      <tbody>
        <tr>
          <td style="font-size: 12px; font-family: arial; font-weight: bold; padding: 7px 5px 5px; color: #FFF; background-color: #F2F2F2; border: 1px solid #EAEAEA "  >
                          <a style="text-decoration: none; color: #2D50FD" href="http://groups.yahoo.com/group/iolanguage/post;_ylc=X3oDMTJxYXQ5ajZmBF9TAzk3MzU5NzE0BGdycElkAzY2Nzc0NzYEZ3Jwc3BJZAMxNzA1MDA2NzY0BG1zZ0lkAzEzMjg0BHNlYwNmdHIEc2xrA3JwbHkEc3RpbWUDMTM1MjgzOTU1OA--?act=reply&messageNum=13284">Reply via web post</a>
                      </td>
          <td style="font-size: 12px; font-family: arial; padding: 7px 5px 5px; color: #FFF; background-color: #F2F2F2; border: 1px solid #EAEAEA; " >
            <a href="mailto:[email protected]?subject=Re%3A%20%5BIo%5D%20curlyBrackets%20%26%20squareBrackets" style="text-decoration: none; color: #2D50FD;">
              Reply to sender            </a> 
          </td>
          <td style="font-size: 12px; font-family: arial; padding: 7px 5px 5px; color: #FFF; background-color: #F2F2F2; border: 1px solid #EAEAEA; ">
            <a href="mailto:[email protected]?subject=Re%3A%20%5BIo%5D%20curlyBrackets%20%26%20squareBrackets" style="text-decoration: none; color: #2D50FD">
              Reply to group            </a> 
          </td>
          <td style="font-size: 12px; font-family: arial; padding: 7px 5px 5px; color: #FFF; background-color: #F2F2F2; border: 1px solid #EAEAEA; " >
            <a href="http://groups.yahoo.com/group/iolanguage/post;_ylc=X3oDMTJlY3NjdXRnBF9TAzk3MzU5NzE0BGdycElkAzY2Nzc0NzYEZ3Jwc3BJZAMxNzA1MDA2NzY0BHNlYwNmdHIEc2xrA250cGMEc3RpbWUDMTM1MjgzOTU1OA--" style="text-decoration: none; color: #2D50FD">Start a New Topic</a>
          </td>
          <td style="font-size: 12px; font-family: arial; padding: 7px 5px 5px; color: #2D50FD; background-color: #F2F2F2; border: 1px solid #EAEAEA; " >
                            <a href="http://groups.yahoo.com/group/iolanguage/message/13282;_ylc=X3oDMTM2dWZzNzNyBF9TAzk3MzU5NzE0BGdycElkAzY2Nzc0NzYEZ3Jwc3BJZAMxNzA1MDA2NzY0BG1zZ0lkAzEzMjg0BHNlYwNmdHIEc2xrA3Z0cGMEc3RpbWUDMTM1MjgzOTU1OAR0cGNJZAMxMzI4Mg--" style="text-decoration: none; color: #2D50FD;">Messages in this topic</a>
                (3)
                      </td>
        </tr>
      </tbody>
    </table>

        
<!------- Start Nav Bar ------>
<!-- |**|begin egp html banner|**| -->
<!-- |**|end egp html banner|**| -->

<!-- |**|begin egp html banner|**| -->
<div id="ygrp-vital" style="background-color: #f2f2f2; font-family: Verdana; font-size: 10px; margin-bottom: 10px; padding: 10px;">
      <span id="vithd" style="font-weight: bold; color: #333; text-transform: uppercase; ">Recent Activity:</span>

    <ul style="list-style-type: none; margin: 0; padding: 0; display: inline;">
            <li style="border-right: 1px solid #000; font-weight: 700; display: inline; padding: 0 5px; margin-left: 0;">
      <span class="cat"><a href="http://groups.yahoo.com/group/iolanguage/members;_ylc=X3oDMTJmdTVkZTNsBF9TAzk3MzU5NzE0BGdycElkAzY2Nzc0NzYEZ3Jwc3BJZAMxNzA1MDA2NzY0BHNlYwN2dGwEc2xrA3ZtYnJzBHN0aW1lAzEzNTI4Mzk1NTg-?o=6" style="text-decoration: none;">New Members</a></span>
      <span class="ct" style="color: #ff7900;">1</span>
    </li>
                                              </ul>
    
  <div style="clear: both; padding-top: 2px; color: #1e66ae;">
    <a href="http://groups.yahoo.com/group/iolanguage;_ylc=X3oDMTJlaG1qNm82BF9TAzk3MzU5NzE0BGdycElkAzY2Nzc0NzYEZ3Jwc3BJZAMxNzA1MDA2NzY0BHNlYwN2dGwEc2xrA3ZnaHAEc3RpbWUDMTM1MjgzOTU1OA--" style="text-decoration: none;">Visit Your Group</a>
  </div>
</div>


  
<div id="ft" style="font-family: Arial; font-size: 11px; margin-top: 5px; padding: 0 2px 0 0; clear: both;">
  <a href="http://groups.yahoo.com/;_ylc=X3oDMTJkdWdwZWc3BF9TAzk3NDc2NTkwBGdycElkAzY2Nzc0NzYEZ3Jwc3BJZAMxNzA1MDA2NzY0BHNlYwNmdHIEc2xrA2dmcARzdGltZQMxMzUyODM5NTU4" style="float: left;"><img src="http://l.yimg.com/a/i/us/yg/logo/us.gif" height="15" width="137" alt="Yahoo! Groups" style="border: 0;"/></a>
  <div style="color: #747575; float: right;">Switch to: <a href="mailto:[email protected]?subject=Change Delivery Format: Traditional" style="text-decoration: none;">Text-Only</a>, <a href="mailto:[email protected]?subject=Email Delivery: Digest" class="margin-rt" style="text-decoration: none;">Daily Digest</a> &bull; <a href="mailto:[email protected]?subject=Unsubscribe" style="text-decoration: none;">Unsubscribe</a> &bull; <a href="http://docs.yahoo.com/info/terms/" style="text-decoration: none;">Terms of Use</a> &bull; <a href="mailto:[email protected]?subject=Feedback on the redesigned individual mail v1" style="text-decoration: none;">Send us Feedback </a></div>
</div>

<!-- |**|end egp html banner|**| -->

  </div> <!-- ygrp-msg -->

  <!-- Sponsor -->
  <!-- |**|begin egp html banner|**| -->
  <div id="ygrp-sponsor" style="width:160px; float:right; clear:none; margin:0 0 25px 0; background: #fff;">

<!-- Start Recommendations -->
<div id="ygrp-reco">
     </div>
<!-- End Recommendations -->



  </div>   <!-- |**|end egp html banner|**| -->

  <div style="clear:both; color: #FFF; font-size:1px;">.</div>
</div>

  <img src="http://geo.yahoo.com/serv?s=97359714/grpId=6677476/grpspId=1705006764/msgId=13284/stime=1352839558/nc1=3848644/nc2=5191955/nc3=4507179" width="1" height="1"> <br>

<div style="color: #fff; height: 0;">__,_._,___</div>
<!--~-|**|PrettyHtmlEnd|**|-~-->

</body>

<!--~-|**|PrettyHtmlStart|**|-~-->
<head>
  <style type="text/css">
  <!--
  #ygrp-mkp {
  border: 1px solid #d8d8d8;
  font-family: Arial;
  margin: 10px 0;
  padding: 0 10px;
}

#ygrp-mkp hr {
  border: 1px solid #d8d8d8;
}

#ygrp-mkp #hd {
  color: #628c2a;
  font-size: 85%;
  font-weight: 700;
  line-height: 122%;
  margin: 10px 0;
}

#ygrp-mkp #ads {
  margin-bottom: 10px;
}

#ygrp-mkp .ad {
  padding: 0 0;
}

#ygrp-mkp .ad p {
  margin: 0;
}

#ygrp-mkp .ad a {
  color: #0000ff;
  text-decoration: none;
}
  #ygrp-sponsor #ygrp-lc {
  font-family: Arial;
}

#ygrp-sponsor #ygrp-lc #hd {
  margin: 10px 0px;
  font-weight: 700;
  font-size: 78%;
  line-height: 122%;
}

#ygrp-sponsor #ygrp-lc .ad {
  margin-bottom: 10px;
  padding: 0 0;
}

  #actions {
    font-family: Verdana;
    font-size: 11px;
    padding: 10px 0;
  }

  #activity {
    background-color: #e0ecee;
    float: left;
    font-family: Verdana;
    font-size: 10px;
    padding: 10px;
  }

  #activity span {
    font-weight: 700;
  }

  #activity span:first-child {
    text-transform: uppercase;
  }

  #activity span a {
    color: #5085b6;
    text-decoration: none;
  }

  #activity span span {
    color: #ff7900;
  }

  #activity span .underline {
    text-decoration: underline;
  }

  .attach {
    clear: both;
    display: table;
    font-family: Arial;
    font-size: 12px;
    padding: 10px 0;
    width: 400px;
  }

  .attach div a {
    text-decoration: none;
  }

  .attach img {
    border: none;
    padding-right: 5px;
  }

  .attach label {
    display: block;
    margin-bottom: 5px;
  }

  .attach label a {
    text-decoration: none;
  }
  
  blockquote {
    margin: 0 0 0 4px;
  }

  .bold {
    font-family: Arial;
    font-size: 13px;
    font-weight: 700;
  }

  .bold a {
    text-decoration: none;
  }

  dd.last p a {
    font-family: Verdana;
    font-weight: 700;
  }

  dd.last p span {
    margin-right: 10px;
    font-family: Verdana;
    font-weight: 700;
  }

  dd.last p span.yshortcuts {
    margin-right: 0;
  }

  div.attach-table div div a {
    text-decoration: none;
  }

  div.attach-table {
    width: 400px;
  }

  div.file-title a, div.file-title a:active, div.file-title a:hover, div.file-title a:visited {
    text-decoration: none;
  }

  div.photo-title a, div.photo-title a:active, div.photo-title a:hover, div.photo-title a:visited {
    text-decoration: none;
  }

  div#ygrp-mlmsg #ygrp-msg p a span.yshortcuts {
    font-family: Verdana;
    font-size: 10px;
    font-weight: normal;
  }

  .green {
    color: #628c2a;
  }

  .MsoNormal {
    margin: 0 0 0 0;
  }

  o {
    font-size: 0;
  }

  #photos div {
    float: left;
    width: 72px;
  }

  #photos div div {
    border: 1px solid #666666;
    height: 62px;
    overflow: hidden;
    width: 62px;
  }

  #photos div label {
    color: #666666;
    font-size: 10px;
    overflow: hidden;
    text-align: center;
    white-space: nowrap;
    width: 64px;
  }

  #reco-category {
    font-size: 77%;
  }

  #reco-desc {
    font-size: 77%;
  }

  .replbq {
    margin: 4px;
  }

  #ygrp-actbar div a:first-child {
   /* border-right: 0px solid #000;*/
    margin-right: 2px;
    padding-right: 5px;
  }

  #ygrp-mlmsg {
    font-size: 13px;
    font-family: Arial, helvetica,clean, sans-serif;
    *font-size: small;
    *font: x-small;
  }

  #ygrp-mlmsg table {
    font-size: inherit;
    font: 100%;
  }

  #ygrp-mlmsg select, input, textarea {
    font: 99% Arial, Helvetica, clean, sans-serif;
  }

  #ygrp-mlmsg pre, code {
    font:115% monospace;
    *font-size:100%;
  }

  #ygrp-mlmsg * {
    line-height: 1.22em;
  }

  #ygrp-mlmsg #logo {
    padding-bottom: 10px;
  }


  #ygrp-msg p a {
    font-family: Verdana;
  }

  #ygrp-msg p#attach-count span {
    color: #1E66AE;
    font-weight: 700;
  }

  #ygrp-reco #reco-head {
    color: #ff7900;
    font-weight: 700;
  }

  #ygrp-reco {
    margin-bottom: 20px;
    padding: 0px;
  }

  #ygrp-sponsor #ov li a {
    font-size: 130%;
    text-decoration: none;
  }

  #ygrp-sponsor #ov li {
    font-size: 77%;
    list-style-type: square;
    padding: 6px 0;
  } 

  #ygrp-sponsor #ov ul {
    margin: 0;
    padding: 0 0 0 8px;
  }

  #ygrp-text {
    font-family: Georgia;
  }

  #ygrp-text p {
    margin: 0 0 1em 0;
  }

  #ygrp-text tt {
    font-size: 120%;
  }

  #ygrp-vital ul li:last-child {
    border-right: none !important; 
  } 
  -->
  </style>
</head>

<!--~-|**|PrettyHtmlEnd|**|-~-->
</html>
<!-- end group email -->


--------------090701040309070100050603--