<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:p="urn:schemas-microsoft-com:office:powerpoint" xmlns:a="urn:schemas-microsoft-com:office:access" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns:b="urn:schemas-microsoft-com:office:publisher" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:oa="urn:schemas-microsoft-com:office:activation" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:q="http://schemas.xmlsoap.org/soap/envelope/" xmlns:D="DAV:" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ois="http://schemas.microsoft.com/sharepoint/soap/ois/" xmlns:dir="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" xmlns:udc="http://schemas.microsoft.com/data/udc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sps="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:udcxf="http://schemas.microsoft.com/data/udc/xmlfile" xmlns:wf="http://schemas.microsoft.com/sharepoint/soap/workflow/" xmlns:mver="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns:mrels="http://schemas.openxmlformats.org/package/2006/relationships" xmlns:ex12t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:ex12m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page Section1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.Section1
        {page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang=EN-US link=blue vlink=purple>
<div class=Section1>
<p class=MsoNormal><span style='color:#1F497D'>Ruby hash and Python dictionary
should interop just fine because Ruby’s hash will be an IDictionary and
Python’s dictionary will also be an IDictionary. Therefore we’ll
be able to recognize the interface methods and dispatch to them
appropriately. We don’t currently support extension methods on
interfaces (we have a bug to fix that) but when we do IDictionary will get
methods like keys from Python so even the normal dictionary methods will be
properly exposed. But it looks like Ruby’s hash method is currently
a subclass of Dictionary<object, object> so I think you’ll probably
get a great level of interop today.<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>But what might be more
interesting is a user defined dictionary-like object. For this we’ll
end up getting all the rules directly through an IDynamicObject instead of the
default binder and/or derived binders. The parts of this that Python
could consume today are:<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='font-size:8.0pt;font-family:Consolas'>
del d["bar"]<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:8.0pt;font-family:Consolas'>
d[“meaning of life”] = 42<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>That will work through
DoOperationAction(Operators.GetItem)/DOA(Op.DelItem)/DOA(Op.SetItem). We have
a “Contains” operator in our Operators enum but we don’t yet
use it for language interop. Once we start implementing that then the ‘if
“bar” in d’ would also be consumable from Python. The
.keys call is unlikely to ever work though. You’ll need to call whatever
the Ruby equivalent of .keys is. If it happens to be .keys then it’ll
work.<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>Now you may have noticed that I
said Python could consume objects from another language using these
characteristics. I don’t believe Ruby objects have an
IDynamicObject implementation of sufficient fidelity to make this happen yet.<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p>
<div>
<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>
<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> users-bounces@lists.ironpython.com
[mailto:users-bounces@lists.ironpython.com] <b>On Behalf Of </b>Lee Culver<br>
<b>Sent:</b> Tuesday, September 25, 2007 10:33 AM<br>
<b>To:</b> users@lists.ironpython.com<br>
<b>Subject:</b> [IronPython] DLR and Iron* language types<o:p></o:p></span></p>
</div>
</div>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>Both Ruby and Python have concepts of lists and dictionaries
(though I think ruby calls them something different, and the details of how
they are used are a bit different as well). Is the DLR going to
(eventually) support passing these objects between each other?<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>For example, let’s say I have a piece of IronPython
code as follows:<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal><span style='font-size:8.0pt;font-family:Consolas'>def
foo(d):<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:8.0pt;font-family:Consolas'>
“d is a dictionary”<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:8.0pt;font-family:Consolas'>
if “bar” in d:<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:8.0pt;font-family:Consolas'>
del d["bar"]<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:8.0pt;font-family:Consolas'>
d[“meaning of life”] = 42<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:8.0pt;font-family:Consolas'>
keys = d.keys()<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:8.0pt;font-family:Consolas'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='font-size:8.0pt;font-family:Consolas'>
# call other dictionary functions on d here<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:8.0pt;font-family:Consolas'>
# ...<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:8.0pt;font-family:Consolas'>
# when this function returns, the Ruby hash object this<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:8.0pt;font-family:Consolas'>
# function was called with has been updated</span><o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>Can I call into this function, from IronRuby, with the Ruby
equivalent of a dictionary (I think that’s a “hash” if
I’m not mistaken) and have that hash updated as the “foo”
method suggests?<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>I would imagine, from a programmer’s perspective, that
even though the Ruby hash class has different functions, it’s basically
the same thing as the Python dictionary. When you call into one language
with the other’s “equivalent objects” does the other language
see it as their own type.<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>My question is, do you <b>plan</b> on supporting this type
of functionality in the DLR and the Iron* languages? If so, is that
support implemented “now” (meaning when IronRuby is released will
it support it)?<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>Thanks,<o:p></o:p></p>
<p class=MsoNormal>-Lee<o:p></o:p></p>
</div>
</body>
</html>