<?xml version="1.0"?>
<!--?xml-stylesheet type="text/css" href="rss.css" ?-->
<rss version="2.0">

  <channel>
    <title>Dao Language</title>
    <link>http://www.daovm.net/space/dao&#38;rss_news&#38;lang=en_uk</link>
    <description>Dao Language</description>
    <language>en-us</language>
    <pubDate>Tuesday,19-Mar-2013 08:08:38 GMT</pubDate>
    <lastBuildDate>Saturday,18-May-2013 08:08:39 GMT</lastBuildDate>
    <generator>Dao Scripts</generator>
    <managingEditor>webmaster@daovm.net</managingEditor>
    <webMaster>webmaster@daovm.net</webMaster>
    <ttl>60</ttl>
 

<item>
	<title>Dao has finally become feature complete!</title>
	<link>http://www.daovm.net/space/dao/thread/939</link>
	<description>
	 After the recent implementation of communication channel for tasklets, deferred blocks and exception handling by defer-recover, I believe Dao has finally become feature complete. Since now the main tasks will be testing and improving the implementation, preparing documentations and finishing some partially implemented modules. It's also about time to do some serious promotion of Dao, as a good start I will be speaking about Dao at the &lt;a href=&quot;https://thestrangeloop.com/preconf&quot;&gt;Emerging Languages Camp of the Strange Loop 2013&lt;/a&gt;  :) &lt;br/&gt;&lt;br/&gt;
I have planned a stable release for this year, but possibly after the conference (Sep. 18th). I am considering to use 2.0 as the version number, as 1.2 no longer reflects the amount of changes and improvements that have been made since version 1.1 released about four years ago!&lt;br clear=all /&gt;
	</description>
	<pubDate>Saturday,18-May-2013 05:46:20 GMT</pubDate>
	<guid>http://www.daovm.net/space/dao/thread/939</guid>
</item>

<item>
	<title>A new feature for concurrent programming: tasklet communication channels!</title>
	<link>http://www.daovm.net/space/dao/thread/938</link>
	<description>
	 I have been looking for ways to improve Dao's support for concurrent programming. The most recent improvement is the addition of the &lt;span class=text_bold&gt; tasklet communication channel&lt;/span&gt;  which is inspired by the Go programming language. Channels can be used to communicate between tasklets and synchronize their execution.&lt;br/&gt;&lt;br/&gt;
The implementation of this feature was simple, because the infrastructure for concurrent programming was already there in Dao virtual machine. But I did take this opportunity to make various and significant improvements to the scheduling of tasklets.&lt;br/&gt;&lt;br/&gt;
The &lt;span class=text_bold&gt; channel&lt;/span&gt;  type is implemented as a customized C data type that supports template-like type arguments. So to construct a channel that can send and receive integers, one can use,
&lt;div class=&quot;hlcode&quot;&gt;
chan = mt&lt;span class=SpecSymbol&gt;::&lt;/span&gt;channel&#38;lt;&lt;span class=DataType&gt;int&lt;/span&gt;&#38;gt;&lt;span class=SpecSymbol&gt;(&lt;/span&gt;&lt;span class=SpecSymbol&gt;)&lt;/span&gt;&lt;/div&gt;
 
Here &lt;span class=text_italic&gt; channel&lt;/span&gt;  is prefixed with &lt;span class=text_italic&gt; mt::&lt;/span&gt; , because &lt;span class=text_bold&gt; channel&lt;/span&gt;  is defined in the built-in &lt;span class=text_bold&gt; mt&lt;/span&gt;  multi-threading module.&lt;br/&gt;&lt;br/&gt;
The type argument &lt;span class=text_italic&gt; int&lt;/span&gt;  indicates this channel can only be used to transmit integers. Currently, only primitive types (&lt;span class=text_bold&gt; int&lt;/span&gt; , &lt;span class=text_bold&gt; float&lt;/span&gt; , &lt;span class=text_bold&gt; double&lt;/span&gt; , &lt;span class=text_bold&gt; complex&lt;/span&gt; , &lt;span class=text_bold&gt; string&lt;/span&gt; , &lt;span class=text_bold&gt; enum&lt;/span&gt; ) plus &lt;span class=text_bold&gt; array&lt;/span&gt;  types, and their composition through &lt;span class=text_bold&gt; list&lt;/span&gt; , &lt;span class=text_bold&gt; map&lt;/span&gt;  and &lt;span class=text_bold&gt; tuple&lt;/span&gt;  types are supported for channels. &lt;br/&gt;&lt;br/&gt;
Each channel has a capacity for transmitting data, which are buffered in the channel. When the channel's buffer reached its capacity, any attempt to send data to it will result in the blocking of the sender, which will be resumed either after a timeout or after some data of the channel have been read out of the buffer to make room for the new data being sent by the blocked sender. Channel capacity can be passed to the constructor of the channel as an optional parameter, which is one by default.&lt;br/&gt;&lt;br/&gt;
The channel type has a number of methods which include:
&lt;ul&gt;
&lt;li&gt;&lt;div class=&quot;hlcode&quot;&gt;
buffer&lt;span class=SpecSymbol&gt;(&lt;/span&gt; &lt;span class=SpecSymbol&gt;self&lt;/span&gt; :channel&#38;lt;@V&#38;gt; &lt;span class=SpecSymbol&gt;)&lt;/span&gt; &lt;span class=SpecSymbol&gt;=&gt;&lt;/span&gt; &lt;span class=DataType&gt;int&lt;/span&gt;&lt;/div&gt;
 
It returns the number of unprocessed data items in the channel buffer.&lt;/li&gt;

&lt;li&gt;&lt;div class=&quot;hlcode&quot;&gt;
cap&lt;span class=SpecSymbol&gt;(&lt;/span&gt; &lt;span class=SpecSymbol&gt;self&lt;/span&gt; :channel&#38;lt;@V&#38;gt; &lt;span class=SpecSymbol&gt;)&lt;/span&gt; &lt;span class=SpecSymbol&gt;=&gt;&lt;/span&gt; &lt;span class=DataType&gt;int&lt;/span&gt;&lt;/div&gt;
 
Return the channel capacity.&lt;/li&gt;

&lt;li&gt;&lt;div class=&quot;hlcode&quot;&gt;
cap&lt;span class=SpecSymbol&gt;(&lt;/span&gt; &lt;span class=SpecSymbol&gt;self&lt;/span&gt; :channel&#38;lt;@V&#38;gt;, cap :&lt;span class=DataType&gt;int&lt;/span&gt; &lt;span class=SpecSymbol&gt;)&lt;/span&gt; &lt;span class=SpecSymbol&gt;=&gt;&lt;/span&gt;&lt;span class=DataType&gt;int&lt;/span&gt;&lt;/div&gt;
 
Set the channel capacity and returns the previous one. Set the capacity to zero to prevent it from receiving further data, and effectively close it when its buffer become empty.&lt;/li&gt;

&lt;li&gt;&lt;div class=&quot;hlcode&quot;&gt;
send&lt;span class=SpecSymbol&gt;(&lt;/span&gt; &lt;span class=SpecSymbol&gt;self&lt;/span&gt; :channel&#38;lt;@V&#38;gt;, data :@V, timeout :&lt;span class=DataType&gt;float&lt;/span&gt; = -&lt;span class=Number&gt;1&lt;/span&gt; &lt;span class=SpecSymbol&gt;)&lt;/span&gt; &lt;span class=SpecSymbol&gt;=&gt;&lt;/span&gt; &lt;span class=DataType&gt;int&lt;/span&gt;&lt;/div&gt;
 
Send a data item with a timeout. A negative timeout parameter means infinite waiting. It return 1 upon timeout, 0 otherwise.&lt;/li&gt;

&lt;li&gt;&lt;div class=&quot;hlcode&quot;&gt;
receive&lt;span class=SpecSymbol&gt;(&lt;/span&gt; &lt;span class=SpecSymbol&gt;self&lt;/span&gt; :channel&#38;lt;@V&#38;gt;, timeout :&lt;span class=DataType&gt;float&lt;/span&gt; = -&lt;span class=Number&gt;1&lt;/span&gt; &lt;span class=SpecSymbol&gt;)&lt;/span&gt; &lt;span class=SpecSymbol&gt;=&gt;&lt;/span&gt; &lt;span class=DataType&gt;tuple&lt;/span&gt;&#38;lt;data :@V|none, status :enum&#38;lt;received,timeout,finished&gt;&gt;&lt;/div&gt;
 
Receive a data item with a timeout. A negative timeout parameter means infinite waiting. It returns a tuple with the following possible values:
&lt;ul&gt;
&lt;li&gt; (data, $received);&lt;/li&gt;

&lt;li&gt; (none, $timeout);&lt;/li&gt;

&lt;li&gt; (none, $finished);&lt;/li&gt;

&lt;/ul&gt;
&lt;/li&gt;

&lt;li&gt;&lt;div class=&quot;hlcode&quot;&gt;
select&lt;span class=SpecSymbol&gt;(&lt;/span&gt; group :&lt;span class=DataType&gt;list&lt;/span&gt;&#38;lt;@T&#38;gt;, timeout = -&lt;span class=Number&gt;1.0&lt;/span&gt; &lt;span class=SpecSymbol&gt;)&lt;/span&gt; &lt;span class=SpecSymbol&gt;=&gt;&lt;/span&gt; &lt;span class=DataType&gt;tuple&lt;/span&gt;&#38;lt;selected: none|@T, &lt;span class=Method&gt;value&lt;/span&gt; :&lt;span class=DataType&gt;any&lt;/span&gt;, status :enum&#38;lt;selected,timeout,finished&gt;&gt;&lt;/div&gt;
 
Select on a group of channels, wait with a timeout for data become available from any of the channels. It returns a tuple with the following possible values:
&lt;ul&gt;
&lt;li&gt; (channel, data, $selected);&lt;/li&gt;

&lt;li&gt; (none, none, $timeout);&lt;/li&gt;

&lt;li&gt; (none, none, $finished);&lt;/li&gt;

&lt;/ul&gt;
  
As the signature indicates, this is a static method.&lt;/li&gt;

&lt;/ul&gt;
 &lt;br/&gt;
Here is a simple example, where integers are sent through one channel and strings through another, and these integers and strings are received using the select method:
&lt;div class=&quot;hlcode&quot;&gt;
&lt;span class=StmtKey&gt;load&lt;/span&gt; sys&lt;br/&gt;
&lt;br/&gt;
chans = &lt;span class=SpecSymbol&gt;{&lt;/span&gt; mt&lt;span class=SpecSymbol&gt;::&lt;/span&gt;channel&#38;lt;&lt;span class=DataType&gt;int&lt;/span&gt;&#38;gt;&lt;span class=SpecSymbol&gt;(&lt;/span&gt;&lt;span class=Number&gt;1&lt;/span&gt;&lt;span class=SpecSymbol&gt;)&lt;/span&gt;, mt&lt;span class=SpecSymbol&gt;::&lt;/span&gt;channel&#38;lt;&lt;span class=DataType&gt;string&lt;/span&gt;&#38;gt;&lt;span class=SpecSymbol&gt;(&lt;/span&gt;&lt;span class=Number&gt;1&lt;/span&gt;&lt;span class=SpecSymbol&gt;)&lt;/span&gt; &lt;span class=SpecSymbol&gt;}&lt;/span&gt;&lt;br/&gt;
&lt;br/&gt;
mt.start&lt;span class=SpecSymbol&gt;::&lt;/span&gt;&lt;span class=SpecSymbol&gt;{&lt;/span&gt;&lt;br/&gt;
&#38;nbsp;&#38;nbsp;index = &lt;span class=Number&gt;0&lt;/span&gt;;&lt;br/&gt;
&#38;nbsp;&#38;nbsp;&lt;span class=StmtKey&gt;while&lt;/span&gt;&lt;span class=SpecSymbol&gt;(&lt;/span&gt; ++index &lt;= &lt;span class=Number&gt;10&lt;/span&gt; &lt;span class=SpecSymbol&gt;)&lt;/span&gt;&lt;span class=SpecSymbol&gt;{&lt;/span&gt;&lt;br/&gt;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&lt;span class=StmtKey&gt;if&lt;/span&gt;&lt;span class=SpecSymbol&gt;(&lt;/span&gt; rand&lt;span class=SpecSymbol&gt;(&lt;/span&gt;&lt;span class=Number&gt;2&lt;/span&gt;&lt;span class=SpecSymbol&gt;)&lt;/span&gt; &lt;span class=SpecSymbol&gt;)&lt;/span&gt;&lt;span class=SpecSymbol&gt;{&lt;/span&gt;&lt;br/&gt;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&lt;span class=Method&gt;io.writeln&lt;/span&gt;&lt;span class=SpecSymbol&gt;(&lt;/span&gt; &lt;span class=String&gt;&quot;sending integer:&quot;&lt;/span&gt;, index &lt;span class=SpecSymbol&gt;)&lt;/span&gt;;&lt;br/&gt;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;chans&lt;span class=SpecSymbol&gt;[&lt;/span&gt;&lt;span class=Number&gt;0&lt;/span&gt;&lt;span class=SpecSymbol&gt;]&lt;/span&gt;.send&lt;span class=SpecSymbol&gt;(&lt;/span&gt; index &lt;span class=SpecSymbol&gt;)&lt;/span&gt;&lt;br/&gt;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&lt;span class=SpecSymbol&gt;}&lt;/span&gt;&lt;span class=StmtKey&gt;else&lt;/span&gt;&lt;span class=SpecSymbol&gt;{&lt;/span&gt;&lt;br/&gt;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&lt;span class=Method&gt;io.writeln&lt;/span&gt;&lt;span class=SpecSymbol&gt;(&lt;/span&gt; &lt;span class=String&gt;&quot;sending string: S&quot;&lt;/span&gt; + &lt;span class=SpecSymbol&gt;(&lt;/span&gt;&lt;span class=DataType&gt;string&lt;/span&gt;&lt;span class=SpecSymbol&gt;)&lt;/span&gt; index &lt;span class=SpecSymbol&gt;)&lt;/span&gt;;&lt;br/&gt;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;chans&lt;span class=SpecSymbol&gt;[&lt;/span&gt;&lt;span class=Number&gt;1&lt;/span&gt;&lt;span class=SpecSymbol&gt;]&lt;/span&gt;.send&lt;span class=SpecSymbol&gt;(&lt;/span&gt; &lt;span class=String&gt;'S'&lt;/span&gt; + &lt;span class=SpecSymbol&gt;(&lt;/span&gt;&lt;span class=DataType&gt;string&lt;/span&gt;&lt;span class=SpecSymbol&gt;)&lt;/span&gt; index &lt;span class=SpecSymbol&gt;)&lt;/span&gt;&lt;br/&gt;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;&lt;span class=SpecSymbol&gt;}&lt;/span&gt;   &lt;br/&gt;
&#38;nbsp;&#38;nbsp;&#38;nbsp;&#38;nbsp;sys.sleep&lt;span class=SpecSymbol&gt;(&lt;/span&gt;&lt;span class=Number&gt;0.5&lt;/span&gt;&lt;span class=SpecSymbol&gt;)&lt;/span&gt;&lt;br/&gt;
&#38;nbsp;&#38;nbsp;&lt;span class=SpecSymbol&gt;}&lt;/span&gt;   &lt;br/&gt;
&#38;nbsp;&#38;nbsp;&lt;span class=Comment&gt;# set channel buffer sizes to zero to close them:&lt;br/&gt;
&lt;/span&gt;&#38;nbsp;&#38;nbsp;chans&lt;span class=SpecSymbol&gt;[&lt;/span&gt;&lt;span class=Number&gt;0&lt;/span&gt;&lt;span class=SpecSymbol&gt;]&lt;/span&gt;.cap&lt;span class=SpecSymbol&gt;(&lt;/span&gt;&lt;span class=Number&gt;0&lt;/span&gt;&lt;span class=SpecSymbol&gt;)&lt;/span&gt; &lt;br/&gt;
&#38;nbsp;&#38;nbsp;chans&lt;span class=SpecSymbol&gt;[&lt;/span&gt;&lt;span class=Number&gt;1&lt;/span&gt;&lt;span class=SpecSymbol&gt;]&lt;/span&gt;.cap&lt;span class=SpecSymbol&gt;(&lt;/span&gt;&lt;span class=Number&gt;0&lt;/span&gt;&lt;span class=SpecSymbol&gt;)&lt;/span&gt;&lt;br/&gt;
&lt;span class=SpecSymbol&gt;}&lt;/span&gt;&lt;br/&gt;
&lt;br/&gt;
&lt;span class=StmtKey&gt;while&lt;/span&gt;&lt;span class=SpecSymbol&gt;(&lt;/span&gt; &lt;span class=Number&gt;1&lt;/span&gt; &lt;span class=SpecSymbol&gt;)&lt;/span&gt;&lt;span class=SpecSymbol&gt;{&lt;/span&gt;&lt;br/&gt;
&#38;nbsp;&#38;nbsp;data = mt&lt;span class=SpecSymbol&gt;::&lt;/span&gt;channel&lt;span class=SpecSymbol&gt;::&lt;/span&gt;select&lt;span class=SpecSymbol&gt;(&lt;/span&gt; chans, &lt;span class=Number&gt;0.2&lt;/span&gt; &lt;span class=SpecSymbol&gt;)&lt;/span&gt;&lt;br/&gt;
&#38;nbsp;&#38;nbsp;&lt;span class=Method&gt;io.writeln&lt;/span&gt;&lt;span class=SpecSymbol&gt;(&lt;/span&gt; &lt;span class=String&gt;&quot;received:&quot;&lt;/span&gt;, data &lt;span class=SpecSymbol&gt;)&lt;/span&gt;;&lt;br/&gt;
&#38;nbsp;&#38;nbsp;&lt;span class=StmtKey&gt;if&lt;/span&gt;&lt;span class=SpecSymbol&gt;(&lt;/span&gt; data.status == $finished &lt;span class=SpecSymbol&gt;)&lt;/span&gt; &lt;span class=StmtKey&gt;break&lt;/span&gt;&lt;br/&gt;
&lt;span class=SpecSymbol&gt;}&lt;/span&gt;&lt;/div&gt;
 &lt;br/&gt;
Please see &lt;a href=&quot;https://github.com/daokoder/dao/tree/master/demo/concurrent&quot;&gt;demo/concurrent&lt;/a&gt;  for more examples.&lt;br clear=all /&gt;
	</description>
	<pubDate>Saturday,18-May-2013 00:35:32 GMT</pubDate>
	<guid>http://www.daovm.net/space/dao/thread/938</guid>
</item>

<item>
	<title>Dao now supports Go-style panic/exception handling!</title>
	<link>http://www.daovm.net/space/dao/thread/937</link>
	<description>
	 I recently looked into the panic/exception handling in the Go programming language (defer-recover), and found it very interesting. After careful evaluation and consideration of its design and possible way of implementation and improvements, I was convinced that it is a better approach to handle exceptions than the conventional try-catch. (But I do think it is a mistake in Go to use returned error codes as the common way to handle errors).&lt;br/&gt;&lt;br/&gt;
I believe the main advantage of defer-recover exception handling over the try-catch is that it doesn't complicate the control flow of the program. This not only makes programs using defer-recover more readable than using try-catch, but also makes the implementation of this feature in a language much simpler than implementing try-catch exception handling. In fact, I was able to implement defer-recover in Dao in a few days (including testing and bug fixing).&lt;br/&gt;&lt;br/&gt;
The defer-recover handling in Go does have an disadvantage, that is, it does not allow handling exceptions in place close to where exceptions may arise, and the normal execution has to be resumed in the caller of the function that handles the exception.&lt;br/&gt;&lt;br/&gt;
This issue is solved in Dao, by supporting a new type of code block (not sure how to call it, maybe I will simply call it &lt;span class=text_bold&gt; framed block&lt;/span&gt;  for convenience) placed in @@{}. Such framed block is executed in a new stack frame using the same stack data of the function where it is defined. Deferred blocks defined in framed blocks are handled in the same way as in normal functions, namely, when a framed block finishes, its deferred blocks are executed in the reverse order of being deferred. Codes in framed blocks can access variables outside the blocks in the same as that in code blocks for code block/section methods.&lt;br/&gt;&lt;br/&gt;
Framed block allows to handle exceptions right at the place where they arise, and to resume normal execution right after the framed block (namely in the same function where the exception is handled). Here is a simple example,
&lt;div class=&quot;hlcode&quot;&gt;
fout = &lt;span class=Method&gt;io.stdio&lt;/span&gt;&lt;br/&gt;
&lt;br/&gt;
@@ &lt;span class=SpecSymbol&gt;{&lt;/span&gt;  &lt;span class=Comment&gt;# framed block to be executed in a new stack frame:&lt;br/&gt;
&lt;/span&gt;&#38;nbsp;&#38;nbsp;defer &lt;span class=SpecSymbol&gt;{&lt;/span&gt; recover&lt;span class=SpecSymbol&gt;(&lt;/span&gt;&lt;span class=SpecSymbol&gt;)&lt;/span&gt; &lt;span class=SpecSymbol&gt;}&lt;/span&gt;&lt;br/&gt;
&#38;nbsp;&#38;nbsp;fout = &lt;span class=Method&gt;io.open&lt;/span&gt;&lt;span class=SpecSymbol&gt;(&lt;/span&gt; &lt;span class=String&gt;&quot;NonExistingFile.txt&quot;&lt;/span&gt;, &lt;span class=String&gt;'r+'&lt;/span&gt; &lt;span class=SpecSymbol&gt;)&lt;/span&gt;&lt;br/&gt;
&lt;span class=SpecSymbol&gt;}&lt;/span&gt;&lt;br/&gt;
&lt;span class=StmtKey&gt;if&lt;/span&gt;&lt;span class=SpecSymbol&gt;(&lt;/span&gt; fout != &lt;span class=Method&gt;io.stdio&lt;/span&gt; &lt;span class=SpecSymbol&gt;)&lt;/span&gt; defer&lt;span class=SpecSymbol&gt;{&lt;/span&gt; fout.close&lt;span class=SpecSymbol&gt;(&lt;/span&gt;&lt;span class=SpecSymbol&gt;)&lt;/span&gt; &lt;span class=SpecSymbol&gt;}&lt;/span&gt;&lt;br/&gt;
fout.writeln&lt;span class=SpecSymbol&gt;(&lt;/span&gt; &lt;span class=String&gt;'hello'&lt;/span&gt; &lt;span class=SpecSymbol&gt;)&lt;/span&gt;&lt;/div&gt;
 
These codes basically try to open a file to write something, and if the file cannot be opened successfully, the standard I/O will be used instead. In the deferred block, the built-in function &lt;span class=text_bold&gt; recover()&lt;/span&gt;  is used to recover a list of exceptions to be handled. This function may take an exception type as parameter to request recovering a specific type of exceptions.&lt;br/&gt;&lt;br/&gt;
Even better, in situations where one wants to use a optional value produced by may-fail expressions/statements, the following can significantly simplify coding:&lt;br/&gt;
&lt;div class=&quot;hlcode&quot;&gt;
&lt;span class=Method&gt;value&lt;/span&gt; = @@&lt;span class=SpecSymbol&gt;(&lt;/span&gt; default_value &lt;span class=SpecSymbol&gt;)&lt;/span&gt; &lt;span class=SpecSymbol&gt;{&lt;/span&gt; block_to_produce_new_value &lt;span class=SpecSymbol&gt;}&lt;/span&gt;&lt;/div&gt;
 &lt;br/&gt;
For example, the above example can be simplified to:&lt;br/&gt;
&lt;div class=&quot;hlcode&quot;&gt;
fout = @@&lt;span class=SpecSymbol&gt;(&lt;/span&gt; &lt;span class=Method&gt;io.stdio&lt;/span&gt; &lt;span class=SpecSymbol&gt;)&lt;/span&gt;&lt;span class=SpecSymbol&gt;{&lt;/span&gt; &lt;span class=Method&gt;io.open&lt;/span&gt;&lt;span class=SpecSymbol&gt;(&lt;/span&gt; &lt;span class=String&gt;&quot;NonExistingFile.txt&quot;&lt;/span&gt;, &lt;span class=String&gt;'r+'&lt;/span&gt; &lt;span class=SpecSymbol&gt;)&lt;/span&gt; &lt;span class=SpecSymbol&gt;}&lt;/span&gt; &lt;br/&gt;
&lt;span class=StmtKey&gt;if&lt;/span&gt;&lt;span class=SpecSymbol&gt;(&lt;/span&gt; fout != &lt;span class=Method&gt;io.stdio&lt;/span&gt; &lt;span class=SpecSymbol&gt;)&lt;/span&gt; defer&lt;span class=SpecSymbol&gt;{&lt;/span&gt; fout.close&lt;span class=SpecSymbol&gt;(&lt;/span&gt;&lt;span class=SpecSymbol&gt;)&lt;/span&gt; &lt;span class=SpecSymbol&gt;}&lt;/span&gt;&lt;br/&gt;
fout.writeln&lt;span class=SpecSymbol&gt;(&lt;/span&gt; &lt;span class=String&gt;'hello'&lt;/span&gt; &lt;span class=SpecSymbol&gt;)&lt;/span&gt;&lt;/div&gt;
 &lt;br/&gt;
As it can be seen, defer-recover can be just as convenient as try-catch, yet it offers better readability in the programming part (and better maintainability in the language implementation part, considering how easily it was implemented).&lt;br/&gt;&lt;br/&gt;
More information about deferred block can be found in the Deferred Block subsection in
&lt;a href=&quot;http://daovm.net/help/en/dao.tutorial.controls.html&quot;&gt;dao.tutorial.controls&lt;/a&gt; ,
and the panic/exception handling in the help entry
&lt;a href=&quot;http://daovm.net/help/en/dao.tutorial.exception.html&quot;&gt;dao.tutorial.exception&lt;/a&gt; .&lt;br/&gt;&lt;br/&gt;
Online demos for them is also available at: &lt;a href=&quot;http://daovm.net/demo.html&quot;&gt;Dao Online Demo!&lt;/a&gt;&lt;br clear=all /&gt;
	</description>
	<pubDate>Tuesday,07-May-2013 02:04:56 GMT</pubDate>
	<guid>http://www.daovm.net/space/dao/thread/937</guid>
</item>

</channel></rss>
