<blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
That is similar to the approach I used, although HLVM provides a pointer  </blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
<span class="Apple-style-span" style="border-collapse: collapse; ">directly to the type, saving you a single hop.</span></blockquote><div><br></div><div>I'm not so sure that is a very good reason, depending on your implementation data structures that are fundamental to the type system of the virtual machine use custom allocators so the extra hop carries little to no expense.</div>
<div><br></div><div><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
I would not have considered it had I not seen the damage done to F# by the </blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
<span class="Apple-style-span" style="border-collapse: collapse; ">CLR's typeless nulls. You want an unallocated constant for many different</span></blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
<span class="Apple-style-span" style="border-collapse: collapse; ">purposes in F#, such as representing the empty option type None, the empty</span></blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
<span class="Apple-style-span" style="border-collapse: collapse; ">list [] and maybe the unit value (). Unfortunately, using "null" means you</span></blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
<span class="Apple-style-span" style="border-collapse: collapse; ">don't get any type information and that means that none of those values work</span></blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
<span class="Apple-style-span" style="border-collapse: collapse; ">correctly with anything requiring run-time type information such as generic</span></blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
<span class="Apple-style-span" style="border-collapse: collapse; ">printing, serialization and so on. The only alternative is to use an</span></blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
<span class="Apple-style-span" style="border-collapse: collapse; ">allocated value but the allocator and (concurrent) GC are very slow so that</span></blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
<span class="Apple-style-span" style="border-collapse: collapse; ">gives you the functionality you want but only at a grave cost in terms of</span></blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
<span class="Apple-style-span" style="border-collapse: collapse; ">performance.</span></blockquote><div> </div><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
<span class="Apple-style-span" style="border-collapse: collapse; ">Consequently, they chose to represent the empty list with an allocated value</span></blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
<span class="Apple-style-span" style="border-collapse: collapse; ">(so [] prints correctly) but the option type uses null. Hence printf "%A"</span></blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
<span class="Apple-style-span" style="border-collapse: collapse; ">None prints "<null>". They've also used other tricks like having an internal</span></blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
<span class="Apple-style-span" style="border-collapse: collapse; ">set representation that uses nulls but is wrapped in another representation</span></blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
<span class="Apple-style-span" style="border-collapse: collapse; ">that handles them correctly but only at the cost of an extra level of</span></blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
<span class="Apple-style-span" style="border-collapse: collapse; ">indirection.</span></blockquote></div><div><span class="Apple-style-span" style="border-collapse: collapse;"><br></span></div><div><span class="Apple-style-span" style="border-collapse: collapse;">I know little to nothing about that so I find it hard to comment.</span></div>
<div><span class="Apple-style-span" style="border-collapse: collapse;"><br></span></div><div><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
The only alternative is to use an <span class="Apple-style-span" style="border-collapse: collapse; ">allocated value but the allocator and (concurrent) GC are very slow so that<span class="Apple-style-span" style="border-collapse: separate; "> </span></span></blockquote>
<blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
<span class="Apple-style-span" style="border-collapse: collapse; ">gives you the functionality you want but only at a grave cost in terms of<span class="Apple-style-span" style="border-collapse: separate; "> </span></span></blockquote>
<blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
<span class="Apple-style-span" style="border-collapse: collapse; ">performance</span></blockquote><div><br></div><div>I find this hard to believe, the GC used in CLR 2.0 is very fast. Surely its only downfall is that it uses a general mark-sweep generational algorithm so some languages (yours may be one of them) may suffer because of its generality. It sounds though as if you are using the fast allocator in the runtime anyway (which most objects do) which is incredibly fast as it does little to no checks before allocating space for the object.</div>
<div><br></div><div>It may be that your solution cuts some of the time off the GC, but I really don't think that the GC in the second incarnation of the CLR is slow. </div></div><br><div class="gmail_quote">2009/6/18 Jon Harrop <span dir="ltr"><<a href="mailto:jon@ffconsultancy.com">jon@ffconsultancy.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="im">On Thursday 18 June 2009 12:28:57 Cory Nelson wrote:<br>
> I'm also curious what language uses this and why it is useful :)<br>
<br>
</div>HLVM is intended to be a general-purpose VM rather than a particular language.<br>
<div class="im"><br>
> Also, things like this would make lock-free algorithms difficult or<br>
> impossible.<br>
<br>
</div>True. Perhaps that is a good argument for providing both kinds. However, nulls<br>
are certainly more common than concurrent data structures. :-)<br>
<br>
The entire source code for HLVM is available for free under a<br>
commerce-friendly BSD license, BTW:<br>
<br>
  <a href="http://forge.ocamlcore.org/projects/hlvm/" target="_blank">http://forge.ocamlcore.org/projects/hlvm/</a><br>
<font color="#888888"><br>
--<br>
</font><div class="im">Dr Jon Harrop, Flying Frog Consultancy Ltd.<br>
<a href="http://www.ffconsultancy.com/?e" target="_blank">http://www.ffconsultancy.com/?e</a><br>
_______________________________________________<br>
</div><div><div></div><div class="h5">LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>Granville Barnett<br><a href="http://gbarnett.github.com">http://gbarnett.github.com</a><br>