UPDATE: Converted to lambda.r.

Here’s a short example of using lambda.r for calculating the DV01 of a bond. The basic idea is to layout the type definitions and then create the functions to do the calculations.

```<br />require(lambda.r)<br /><br />Bond(par, coupon, yield, periods, freq) %as% {<br /><%%KEEPWHITESPACE%%>  list(par=par, coupon=coupon, yield=yield, periods=periods, freq=freq)<br />}<br /><br /># Inherit from the Bond type<br />SemiBond(par, coupon, yield, periods, freq=2) %as%<br /><%%KEEPWHITESPACE%%>  Bond(par, coupon, yield, periods, freq)<br /><br />price(bond) %::% Bond : numeric<br />price(bond) %as% price(bond, bond\$yield)<br /><br />price(bond, r) %::% Bond : numeric : numeric<br />price(bond, r) %as%<br />{<br /><%%KEEPWHITESPACE%%>  r &lt;- r / bond\$freq<br /><%%KEEPWHITESPACE%%>  n &lt;- bond\$periods<br /><%%KEEPWHITESPACE%%>  coupon(bond) * (1 - (1+r)^-n) / r + bond\$par * (1+r)^-n<br />}<br /><br />dv01(bond) %::% Bond : numeric<br />dv01(bond) %as%<br />{<br /><%%KEEPWHITESPACE%%>  y1 &lt;- bond\$yield - 0.0001<br /><%%KEEPWHITESPACE%%>  y2 &lt;- bond\$yield + 0.0001<br /><%%KEEPWHITESPACE%%>  p1 &lt;- price(bond, y1)<br /><%%KEEPWHITESPACE%%>  p2 &lt;- price(bond, y2)<br /><%%KEEPWHITESPACE%%>  - (p1 - p2) / (y1 - y2) / 100<br />}<br />
The helper functions below show some of the power of guards. Depending on the value of a field, a different function variant can be called for the coupon calculation. (Note that this is used for illustrative purposes and would break down in the current ZIRP world.)
<br /># When coupon is in percentage terms<br />coupon(bond) %::% Bond : numeric<br />coupon(bond) %when% {<br /><%%KEEPWHITESPACE%%>  bond\$coupon &lt; 1<br />} %as% {<br /><%%KEEPWHITESPACE%%>  bond\$par * bond\$coupon / bond\$freq<br />}<br /><br />coupon(bond) %::% Bond : numeric<br />coupon(bond) %as% { bond\$coupon / bond\$freq }<br />
The code can be run by executing the below snippet.
<br />&gt; b &lt;- SemiBond(100,3.5, 0.035, 10)<br />&gt; dv01(b)<br />[1] 4.550612<br />

0.000000
0.000000

jQuery(window).blur( function() {
});
});

var stat_gif = document.location.protocol + "//stats.wordpress.com/g.gif?v=wpcom-no-pv";
new Image().src = stat_gif + "&baba=" + Math.random();
return true;
}

if (wpcom_adclk_recorded) { return true; } // no double counting
var stat_gif = document.location.protocol + "//stats.wordpress.com/g.gif?v=wpcom-no-pv";

new Image().src = stat_gif + "&baba=" + Math.random();
var now=new Date(); var end=now.getTime()+250;
while(true){now=new Date();if(now.getTime()>end){break;}}
return true;
}

}