<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="http://lambda-the-ultimate.org">
<channel>
 <title>Lambda the Ultimate - LtU Forum</title>
 <link>http://lambda-the-ultimate.org/taxonomy/term/1/0</link>
 <description>Main Discussion Forum</description>
 <language>en</language>
<item>
 <title>Teaching challenge: culturally enriching formulae-as-types</title>
 <link>http://lambda-the-ultimate.org/node/4447</link>
 <description>&lt;p &gt;&lt;a href=&quot;https://plus.google.com/u/0/109012086282988391144/posts/awqezAk2s1j&quot;&gt;In  a G+ request,&lt;/a&gt; Norman Ramsey says he wants spice up his PL survey course with &lt;i &gt;a little bit of &quot;cultural enrichment&quot; to show my students the &quot;propositions as types&quot; approach to proof.&lt;/i&gt;  He&#039;s looking for source materials, and, I take it, experiences from people who have tried to teach similar things.&lt;/p&gt;</description>
 <category domain="http://lambda-the-ultimate.org/taxonomy/term/1">LtU Forum</category>
 <pubDate>Thu, 09 Feb 2012 05:56:40 -0500</pubDate>
</item>
<item>
 <title>Active Variables in Common Lisp</title>
 <link>http://lambda-the-ultimate.org/node/4445</link>
 <description>&lt;p &gt;A feature I lifted from ksh93, I thought I would share with LTU.  Active variables in Common Lisp; variables with callbacks on reading and writing.  Possibly a useful feature that I rarely see in modern programming languages.
&lt;p &gt;&lt;a href=&quot;https://github.com/kruhft/cl-active-variables&quot;&gt;github/cl-active-variables&lt;/a&gt;&lt;/p&gt;</description>
 <category domain="http://lambda-the-ultimate.org/taxonomy/term/1">LtU Forum</category>
 <pubDate>Sat, 04 Feb 2012 23:33:01 -0500</pubDate>
</item>
<item>
 <title>Peak Abstraction</title>
 <link>http://lambda-the-ultimate.org/node/4442</link>
 <description>&lt;p &gt;Today I learned a new term from a &lt;a href=&quot;http://tomhammersley.blogspot.com.au/2012/02/peak-abstraction.html#!http://tomhammersley.blogspot.com/2012/02/peak-abstraction.html&quot;&gt;blog post&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote &gt;&lt;p &gt;
An interesting phenomena I&#039;ve observed over my years as a programmer is the occurrence of &quot;Peak Abstraction&quot; within a young programmer - and their subsequent improvement.&lt;/p&gt;
&lt;p &gt;There is a common pattern. It typically occurs after 3-4 years of professional practice. A programmer is growing in his confidence. He begins to tackle more complex, challenging problems. And, he reflects those problems with complex, challenging data structures. He has not yet learnt the fine art of simplicity.&lt;/p&gt;
&lt;p &gt;Every member of every data structure is a pointer or a reference. There are no simple data types. ... Those around them become increasingly desperate. They can see the code becoming inflated, inefficient, unmaintainable. &lt;/p&gt;
&lt;p &gt;And then it happens. The programmer realises the error of their ways. They realise that they are adding neither design value nor computational value. They realise they are adding overhead and maintenance trouble. ... And thus the recovery begins. Data structures become simple, expressive, and maintainable.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p &gt;The complete blog post rags mostly on perf issues, but I&#039;m more interested in the complexity implications. I felt myself go through this before, and to be honest the more powerful the language, the worse my peak abstraction got. It was only when moving to a less expressive language (C# rather than Scala) that I had incentive to keep it simple. &lt;/p&gt;
&lt;p &gt;Has anyone else found themselves in an abstraction trap and come down as they grew as a programmer? What can we do in PL design to avoid, or at least discourage, overuse of abstraction? Is this a case of where less might be more?  &lt;/p&gt;</description>
 <category domain="http://lambda-the-ultimate.org/taxonomy/term/1">LtU Forum</category>
 <pubDate>Fri, 03 Feb 2012 01:21:16 -0500</pubDate>
</item>
<item>
 <title>Evolution of mainstream programming language paradigms</title>
 <link>http://lambda-the-ultimate.org/node/4441</link>
 <description>&lt;p &gt;I have been thinking recently about what makes the mainstream language a mainstream. And I think that the mainstream programming language paradigms generally evolve using the following evolution pattern:&lt;/p&gt;
&lt;ol &gt;
&lt;li &gt;&lt;em &gt;Complexity Pain&lt;/em&gt;: complexity of reasoning about some aspects of the programs growth fastest with program growth. At some time amount of efforts required to reason about some piece of code becomes unreasonable.&lt;/li&gt;
&lt;li &gt;&lt;em &gt;Virtual Structure&lt;/em&gt;: Organizing program according to virtual structure that makes reasoning about that aspect of the program easier.&lt;/li&gt;
&lt;li &gt;&lt;em &gt;Explicit Structure&lt;/em&gt;: Develop language, that makes virtual structure explicit by introducing additional meta-level constructs, that organize constructs of the previous levels into the structure.&lt;/li&gt;
&lt;/ol&gt;
&lt;p &gt;In paradigm for mainsteam languages we could obviously see the chain when the following level organizes the previous one.&lt;/p&gt;
&lt;ol &gt;
&lt;li &gt;[Conditional] jumps, memory assignments,and register arithmetics (assemblers).&lt;/li&gt;
&lt;li &gt;Statements (FORTRAN).&lt;/li&gt;
&lt;li &gt;Blocks, procedures, and data types (C, Pascal).&lt;/li&gt;
&lt;li &gt;Classes (abstraction over procedures and data types) (C++)&lt;/li&gt;
&lt;li &gt;Components (abstraction over classes and interfaces that differenitates techinical and intential aspects) (Java, C#, VB.NET, VB+COM, JavaScript[only halve way here])&lt;/li&gt;
&lt;/ol&gt;
&lt;p &gt;As we see here, the next generation always abstracted previous level, and it was exactly one level abstraction. The functional languages so far do not fit into this picture.&lt;/p&gt;

&lt;p &gt;The LISP was not one step jump, they are many step jump. Many features of LISP got into mainstream (the latest were garbage collection and lambda expressions), but there are some things to integerate (like internal DSLs). So LIPS was a kind of peak experience for programming language paradigms.&lt;/p&gt;

&lt;p &gt;To me Haskell and ML did not offer appropriate &lt;em &gt;one-step&lt;/em&gt; abstraction over structured programming. ML modules were only half-step abstraction over data and procedures, since data and functions were still different concepts. There were also halfway abstraction of data and behavior in the form of lambda expressions, but it was a single-method object, but GUI toolkits (current complexity challlenge at that time) required many-methods objects for appropriate abstraction.&lt;/p&gt;

&lt;p &gt;If we look to the sequence, the next step should be some abstraction over components, and I think it would be component systems. We could see the early component systems as libraries now (Spring, GUI toolkits, EJB3, Plugins in Eclipse and IDEA, UML2, etc).&lt;/p&gt; 

&lt;p &gt;I have written more details why I think so in &lt;a href=&quot;https://docs.google.com/document/d/11afniF3J_u_gxzGRsTUsZ2Q1F2qedbL6N2Tla3_yOdQ/edit&quot;&gt;this document&lt;/a&gt;. It also contains an initial list of requirements for the possible next generation mainstream language. I think it will be a component system programming langauge (CSPL). So the document is named CSPL Challenge. I think typing and and type-checking component systems would be a quite interesting research topic. And maybe there are already some results out there, that fit requirement exactly.&lt;/p&gt;</description>
 <category domain="http://lambda-the-ultimate.org/taxonomy/term/1">LtU Forum</category>
 <pubDate>Sat, 28 Jan 2012 19:19:52 -0500</pubDate>
</item>
<item>
 <title>Syntax Desugaring Algorithm Question</title>
 <link>http://lambda-the-ultimate.org/node/4439</link>
 <description>&lt;p &gt;Hello all!&lt;/p&gt;
&lt;p &gt;I&#039;m building a lisp in F# using FParsec. The language is called AML. I have a reader and an interpreter running, and I just now built a &#039;desugaring&#039; function to rewrite AML code. For example, the expression a.b desugars to (access :m:b a). This is all well and good, but there is a problem. Once the desugarer outputs the transformed code text, it will be passed to the reader. As mentioned, the reader uses FParsec to create the AST. When FParsec encounters an unparsable character sequence, it propagates some nice error position information, a somewhat useful error message, and a description of the where the code text cannot be parsed. The issue is that this information will not be very meaningful to the user once the reader gets its input from the desugarer rather than the original user&#039;s code.&lt;/p&gt;
&lt;p &gt;How do interpreters typically preserve this error information across transformed code so that the user can get error messages in terms of his original code?&lt;/p&gt;
&lt;p &gt;Any practical or research material is nice. For run-time performance and implement-ability, I prefer a simple algorithm to a more sophisticated one. In truth, I am a language development newbie in many respects.&lt;/p&gt;
&lt;p &gt;Thank you greatly!&lt;/p&gt;</description>
 <category domain="http://lambda-the-ultimate.org/taxonomy/term/1">LtU Forum</category>
 <pubDate>Thu, 26 Jan 2012 17:57:37 -0500</pubDate>
</item>
<item>
 <title>LastCalc: A web-based REPL for a pure functional programming language with a flexible syntax and parser</title>
 <link>http://lambda-the-ultimate.org/node/4438</link>
 <description>&lt;p &gt;&lt;a href=&quot;http://blog.locut.us/2012/01/23/progress-report-on-lastcalc/&quot;&gt;LastCalc&lt;/a&gt; is a very experimental web-based tool that started out as a kind of Google Calculator but with a &quot;REPL&quot;-style user interface that permits variable assignment.&lt;/p&gt;
&lt;p &gt;Like Google Calculator it supports basic math, and conversions between different measurement types like miles or kilograms (relying on the Java JScience library for this functionality), all with a relatively natural language syntax.&lt;/p&gt;
&lt;p &gt;Along the way we added the ability to define parameterized functions, and then pattern matching on datastructures like lists and maps (inspired by ML), including recursively defined functions, all in a friendly AJAX-based web user interface.&lt;/p&gt;
&lt;p &gt;LastCalc&#039;s parser is extremely robust, doing a reasonably efficient best-first search with backtracking to interpret its input.  Anything it can&#039;t interpret is ignored.&lt;/p&gt;
&lt;p &gt;Soon people will be able to share the parameterized functions they&#039;ve designed, ultimately allowing people to collaboratively &quot;teach&quot; LastCalc how to interpret things that it currently cannot.&lt;/p&gt;
&lt;p &gt;The link above provides a quick walk through of the system along with a link to it so that you can try it for yourself.&lt;/p&gt;</description>
 <category domain="http://lambda-the-ultimate.org/taxonomy/term/1">LtU Forum</category>
 <pubDate>Wed, 25 Jan 2012 19:25:59 -0500</pubDate>
</item>
<item>
 <title>Language outline of Modern Eiffel (SW Verification)</title>
 <link>http://lambda-the-ultimate.org/node/4437</link>
 <description>&lt;p &gt;Link to the original &lt;a href=&quot;http://softwareverificaton.wordpress.com/2012/01/25/language-outline-7/&quot;&gt;blog entry&lt;/a&gt;.&lt;/p&gt;
&lt;p &gt;In the course of this blog I am going to use a variant of Eiffel called&lt;br &gt;
&quot;Modern Eiffel&quot;. This blog entry gives a short outline of the language&lt;br &gt;
elements. Although &quot;Modern Eiffel&quot; is a full blown language with all&lt;br &gt;
sorts of imperative elements, mutable reference type objects, multiple&lt;br &gt;
inheritance, dynamic bind etc. this blog entry concentrates only on a&lt;br &gt;
small subset: immutable types and inductive types. The reason:&lt;br &gt;
immutable/inductive types are a very important concept to verify&lt;br &gt;
statically the correctness of a program. More advanced features will be&lt;br &gt;
introduced if necessary.&lt;/p&gt;
Skeleton of a class
&lt;p &gt;Modern Eiffel is an object oriented language. All types are defined by&lt;br &gt;
classes (as in other object oriented languages like C++, C#, java,&lt;br &gt;
scala, etc.). The skeleton of a class looks like&lt;/p&gt;
&lt;pre &gt;
   class
      MY_CLASS   -- class name
   create
      creator1(a:A)  ...
      creator2  ...
   feature
      some_function(b:B): RT   ...

      some_command(c:C)  ...

      all(i:INT) some_property(i)
         proof
            ...
         end

      CHAR = CHARACTER   -- type alias
   invariant
      ...   -- consistency conditions
   end
&lt;/pre&gt;&lt;p &gt;
Comments begin with &quot;--&quot; and span to the end of the line.&lt;br &gt;
Classes and types are always written in uppercase. Each class can have&lt;br &gt;
creators by which objects of the corresponding type can be constructed.&lt;br &gt;
The features of a class are either functions (i.e. routines which return&lt;br &gt;
a value) or commands (i.e. routines which change the state of the&lt;br &gt;
object) or assertions or type aliases.&lt;/p&gt;
Basic types
&lt;p &gt;There are some basic types. These are types with built-in functions and&lt;br &gt;
built-in value representation. The basic types are BOOLEAN, NAT&lt;br &gt;
(unsigned integers of a certain size), INT (signed integers of a certain&lt;br &gt;
size). Beside their built-in functions and value representation the&lt;br &gt;
basic types are nothing special. They are defined with classes as well.&lt;/p&gt;
&lt;pre &gt;
   immutable class
      BOOLEAN
   feature
      implication alias &quot;=&amp;gt;&quot; (o:BOOLEAN): BOOLEAN
         external &quot;built_in&quot; end

      negated alias &quot;not&quot;: BOOLEAN
         external &quot;built_in&quot; end

      conjuncted alias &quot;and&quot; (o:BOOLEAN): BOOLEAN
         external &quot;built_in&quot; end

      disjuncted alias &quot;or&quot; (o:BOOLEAN): BOOLEAN
         external &quot;built_in&quot; end

      ...
   end
&lt;/pre&gt;&lt;p &gt;
Functions can have operator aliases for unary and binary operators. I.e.&lt;br &gt;
having variables a,b,c of type BOOLEAN the expressions&lt;/p&gt;
&lt;pre &gt;
   not a            -- highest precedence

   a and b

   a or b

   a =&amp;gt; b           -- lowest precedence
&lt;/pre&gt;&lt;p &gt;
have the expected meaning. The most important boolean operator is the&lt;br &gt;
implication &quot;=&amp;gt;&quot;. It is right associative i.e. &quot;a =&amp;gt; b =&amp;gt; c&quot; is parsed&lt;br &gt;
as &quot;a =&amp;gt; (b =&amp;gt; c)&quot;. The binary operators &quot;and&quot; and &quot;or&quot; are left&lt;br &gt;
associative. All binary boolean operators are not strict (short&lt;br &gt;
circuited) i.e. the second operand is only evaluated if necessary to&lt;br &gt;
determine the truth value of the expression.&lt;/p&gt;
Default inheritance and equality
&lt;p &gt;A class can inherit features from other classes. For this blog entry&lt;br &gt;
inheritance is not important. I just mention the fact that each class&lt;br &gt;
has some implicit inheritance. A class T with no inheritance clause is&lt;br &gt;
treated as if it were defined as&lt;/p&gt;
&lt;pre &gt;
   class
      T
   inherit
      -&amp;gt; ANY
      COMPARABLE
   ...
   end
&lt;/pre&gt;&lt;p &gt;
The symbol &quot;-&amp;gt;&quot; stands for conforming inheritance. For the following&lt;br &gt;
the class ANY is not important. But the parent class COMPARABLE defines&lt;br &gt;
equality. It has the outline&lt;/p&gt;
&lt;pre &gt;
   class
      COMPARABLE
   feature
      is_equal(o:like Current): BOOLEAN
         external &quot;built_in&quot;
         ensure
            all(x:like Current) x=x
            all(x,y: like Current) x=y =&amp;gt; y=x
            all(x,y,z: like Current) x=y =&amp;gt; y=z =&amp;gt; x=z
            -- &quot;=&quot; has higher precedence than &quot;=&amp;gt;&quot;
         end
   end
&lt;/pre&gt;&lt;p &gt;
The feature &quot;is_equal&quot; is used in Modern Eiffel to define equality. It&lt;br &gt;
is a built-in function which guarantees properties which are expected&lt;br &gt;
from an equivalence relation. Reflexivity (every entity is equal to&lt;br &gt;
itself), symmetry and transitivity. In Modern Eiffel the postconditions&lt;br &gt;
of built-in routines are treated as axioms, i.e. properties which do not&lt;br &gt;
need any proof. Note the transitivity law written as&lt;/p&gt;
&lt;pre &gt;
  x=y =&amp;gt; y=z =&amp;gt; x=z
&lt;/pre&gt;&lt;p &gt;
Usually one would expect the transitivity law written as&lt;/p&gt;
&lt;pre &gt;
   x=y and y=z =&amp;gt; x=z
&lt;/pre&gt;&lt;p &gt;
Both forms are equivalent. This will be proved later. If possible we&lt;br &gt;
write all properties with the implication operator, because implication&lt;br &gt;
is more powerful and practical for proofs.&lt;/p&gt;
&lt;p &gt;Each class inheriting from COMPARABLE can redefine (i.e. overwrite) the&lt;br &gt;
feature &quot;is_equal&quot;. The postconditions are inherited but in case of&lt;br &gt;
redefinition they are no longer treated as axioms; they have to be&lt;br &gt;
proved to be true.&lt;/p&gt;
Inductive types
Simple inductive types
&lt;p &gt;People with experience in imperative languages like C++, C#, Java, etc.&lt;br &gt;
are not acustomed to use inductive types. People having experience with&lt;br &gt;
functional languages like Haskell, ML, OCAML, COQ, Isabelle know&lt;br &gt;
inductive types well. This chapter is written for people not knowing&lt;br &gt;
inductive types. The others might just be interested to learn how&lt;br &gt;
inductive types are presented in Eiffel syntax.&lt;/p&gt;
&lt;p &gt;Inductive data types are best explained with some examples. The simplest&lt;br &gt;
inductive type is similar to an enumeration type in other languages. We&lt;br &gt;
can define a class COLOR like&lt;/p&gt;
&lt;pre &gt;
  case class
    COLOR
  create
    red
    green
    blue
  end
&lt;/pre&gt;&lt;p &gt;
The keyword &quot;case&quot; introduces an inductive class. The class COLOR has&lt;br &gt;
just three creators to define objects of type color. E.g. we can use&lt;br &gt;
this class to define variable of type COLOR.&lt;/p&gt;
&lt;pre &gt;
    r: COLOR := red
    g: COLOR := green
    ...
&lt;/pre&gt;&lt;p &gt;
The assigment operator &quot;:=&quot; can be used to initialize variables.&lt;/p&gt;
&lt;p &gt;In a similar fashion we can define a class WEEKDAY&lt;/p&gt;
&lt;pre &gt;
  case class
    WEEKDAY
  create
    monday
    thuesday
    wednesday
    ...
    sunday
  feature
    next: WEEKDAY
      ...
  end
&lt;/pre&gt;&lt;p &gt;
The class WEEKDAY has a feature &quot;next&quot; in order to calculate the next&lt;br &gt;
weekday. The definition of &quot;next&quot; looks like&lt;/p&gt;
&lt;pre &gt;
  next: WEEKDAY =
    inspect Current
    case monday   then thuesday
    case thuesday then wednesday
    ...
    case sunday   then monday
    end
&lt;/pre&gt;&lt;p &gt;
Inductive types allow case expression to make distinctions on how the&lt;br &gt;
object has been constructed. The keyword &quot;Current&quot; returns the current&lt;br &gt;
object. For each creator a cause clause is given. The meaning should be&lt;br &gt;
quite clear. It is like C&#039;s select statement.&lt;/p&gt;
&lt;p &gt;The above form is the short form of a function definition. The function&lt;br &gt;
&quot;next&quot; does not have any precondition. Therefore the short form is&lt;br &gt;
appropriate. In the case that a function has preconditions, the long&lt;br &gt;
form must be used.&lt;/p&gt;
&lt;pre &gt;
  next: WEEKDAY
    require
       ...   -- precondition(s)
    ensure
      Result =
        inspect Current
        case monday    then thuesday
        ...
        end
    end
&lt;/pre&gt;&lt;p &gt;
The keyword &quot;Result&quot; indicates the return value of the function. The&lt;br &gt;
postcondition &quot;Result = ... &quot; specifies the return value of the function.&lt;/p&gt;
Inductive types with stored values
&lt;p &gt;Objects of the very simple inductive types like COLOR and WEEKDAY just&lt;br &gt;
store as its value the way they have been constructed. But objects of&lt;br &gt;
inductive type can store other values as well.&lt;/p&gt;
&lt;p &gt;Let us consider the following class&lt;/p&gt;
&lt;pre &gt;
  case class
    OPTIONAL[G]
  create
    none
    value(value: G)
  end
&lt;/pre&gt;&lt;p &gt;
This class is generic. A generic class is a type constructor. It can&lt;br &gt;
construct the types OPTIONAL[INT], OPTIONAL[BOOLEAN], OPTIONAL[COLOR],&lt;br &gt;
OPTIONAL[OPTIONAL[CHARACTER]], ...&lt;/p&gt;
&lt;p &gt;The class has just two creators: &quot;none&quot; and &quot;value&quot;. The object&lt;/p&gt;
&lt;pre &gt;
  n: OPTIONAL[INT] := none
&lt;/pre&gt;&lt;p &gt;
has no value and the object&lt;/p&gt;
&lt;pre &gt;
  i7: OPTIONAL[INT] := value(7)
&lt;/pre&gt;&lt;p &gt;
has the value 7. The name &quot;value&quot; is used for the creator and for an&lt;br &gt;
attribute. The attribute &quot;value&quot; is an optional attribute. It is&lt;br &gt;
available only if the object has been created with the &quot;value&quot; creator.&lt;/p&gt;
&lt;p &gt;The access of the attribute &quot;value&quot; is illegal, if the corresponding&lt;br &gt;
object has not been created with the &quot;value&quot; creator. In many case the&lt;br &gt;
attribute is not accessed directly. Usually the attribute is accessed&lt;br &gt;
better through pattern matching expressions.&lt;/p&gt;
&lt;p &gt;In order to introduce pattern matching we use a contrived example of a&lt;br &gt;
function.&lt;/p&gt;
&lt;pre &gt;
  value_plus_100(o:OPTIONAL[INT]) =
    inspect o
    case none     then  -1
    case value(i) then  i+100
    end
&lt;/pre&gt;&lt;p &gt;
The function &quot;value_plus_100 is contrived, because one would not write&lt;br &gt;
such a function in Modern Eiffel. The inspect expression distinguishes&lt;br &gt;
the two possible creators for an object of type OPTIONAL[INT].&lt;/p&gt;
&lt;p &gt;The first case clause is for objects created with the &quot;none&quot; creator.&lt;br &gt;
Since the &quot;none&quot; creator has no arguments, no value can be extracted in&lt;br &gt;
that case.&lt;/p&gt;
&lt;p &gt;The second case clause is for objects which have been created with the&lt;br &gt;
&quot;value&quot; creator. This creator has one argument which can be retrieved&lt;br &gt;
and attached to a fresh local variable with name &quot;i&quot;. This variable is&lt;br &gt;
availalbe only on the right hand side of this case clause to calculate&lt;br &gt;
the return value.&lt;/p&gt;
&lt;p &gt;The function &quot;value_plus_100&quot; can be written in a form which accesses&lt;br &gt;
the attribute &quot;value&quot; directly.&lt;/p&gt;
&lt;pre &gt;
  value_plus_100(o:OPTIONAL[INT]) =
    inspect o
    case none      then -1
    case value(_)  then o.value + 100
    end
&lt;/pre&gt;&lt;p &gt;
The wild card &quot;_&quot; is used to supress the creations of a fresh local&lt;br &gt;
variable. But the compiler derives the fact that in this case clause the&lt;br &gt;
object &quot;o&quot; has been created with the &quot;value&quot; creator. Therefore the&lt;br &gt;
access to the attribute &quot;value&quot; is valid within this clause.&lt;/p&gt;
Inductive types with recursive structure
&lt;p &gt;The full expressive power of inductive types unfolds with recursively&lt;br &gt;
defined inductive types. We can use an inductive type to define natural&lt;br &gt;
numbers.&lt;/p&gt;
&lt;pre &gt;
  case class
    UNARY_NATURAL
  create
    zero
    succ(pred: UNARY_NATURAL)
  feature
    plus alias  &quot;+&quot; (o:UNARY_NATURAL): UNARY_NATURAL = ...
    times alias &quot;*&quot; (o:UNARY_NATURAL): UNARY_NATURAL = ...
    power alias &quot;^&quot; (o:UNARY_NATURAL): UNARY_NATURAL = ...
    ...
  end
&lt;/pre&gt;&lt;p &gt;
The class UNARY_NATURAL is highly inefficient to do arithmetics. But it&lt;br &gt;
is a good vehicle to model natural numbers and use this model to prove&lt;br &gt;
properties of very efficient implementations of natural numbers.&lt;/p&gt;
&lt;p &gt;The class UNARY_NATURAL has tow creators. One to create the number 0 and&lt;br &gt;
one to create the successor of an already created number.&lt;/p&gt;
&lt;p &gt;The recursive structure of the type can be used to define the functions&lt;br &gt;
&quot;plus&quot;, &quot;times&quot; and &quot;power&quot; recursively.&lt;/p&gt;
&lt;pre &gt;
  plus alias &quot;+&quot; (o:UNARY_NATURAL): UNARY_NATURAL =
    inspect Current
    case zero then o
    case succ(p) then succ(p+o)
    end

  times alias &quot;*&quot; (o:UNARY_NATURAL): UNARY_NATURAL =
    inspect Current
    case zero then zero
    case succ(p) then o + p*o
    end

  power alias &quot;^&quot; (o:UNARY_NATURAL): UNARY_NATURAL =
    inspect o
    case zero then succ(zero)
    case succ(p) then Current * Current^p
    end
&lt;/pre&gt;&lt;p &gt;
Recursive functions for inductive types defined in this fashion have the&lt;br &gt;
nice property that the compiler can verify the termination of the&lt;br &gt;
recursion. In order to see this let us look at the recursive branch of&lt;br &gt;
the definition of &quot;+&quot;&lt;/p&gt;
&lt;pre &gt;
   case succ(p) then succ(p+o)
&lt;/pre&gt;&lt;p &gt;
This branch is entered only if the current object has been created with&lt;br &gt;
the &quot;succ&quot; creator using an already existing number, the predecessor of&lt;br &gt;
the current object. The left hand side of the case expression attaches&lt;br &gt;
the predecessor of the current object to the fresh local variable &quot;p&quot;.&lt;br &gt;
The right hand side&lt;/p&gt;
&lt;pre &gt;
   succ(p+o)
&lt;/pre&gt;&lt;p &gt;
uses the predecessor to make the recursive call &quot;p+o&quot;, i.e. it calls the&lt;br &gt;
function &quot;plus&quot; recursively. This recursive call will finally terminate&lt;br &gt;
i.e. end up in a branch &quot;case zero&quot;, because the very first creator of&lt;br &gt;
any UNARY_NATURAL number must have been the &quot;zero&quot; creator. This is the&lt;br &gt;
only way to create a UNARY_NATURAL if no other UNARY_NATURAL is available.&lt;/p&gt;
&lt;p &gt;Another classic inductive type is defined by the class LIST.&lt;/p&gt;
&lt;pre &gt;
  case class
    LIST[G]
  create
    nil
    cons alias &quot;::&quot; (first:G; tail:LIST[G])
  feature
    ...
  end
&lt;/pre&gt;&lt;p &gt;
A list is either empty or is an element (the first element) followed by&lt;br &gt;
another list (the tail of the newly created list).&lt;/p&gt;
&lt;p &gt;If a creator has two arguments, a binary operator can be used as an&lt;br &gt;
alias. All binary operators ending with &quot;::&quot; are right associative.&lt;br &gt;
Therefore the following initialization of variables is well defined&lt;/p&gt;
&lt;pre &gt;
  lst: LIST[INT] :=   1::2::3::nil
  -- parsed as 1::(2::(3::nil))
  -- equivalent to cons(1,cons(2,(cons(3,nil)))
&lt;/pre&gt;&lt;p &gt;
Since lists are very expressive on its own and can serve as models an&lt;br &gt;
extra blog entry will be dedicated to lists.&lt;/p&gt;
Summary
&lt;p &gt;This blog has introduced some basic language elements of Modern Eiffel.&lt;br &gt;
Some next blog entries will concetrate more on lists and on how to prove&lt;br &gt;
assertions within Modern Eiffel.&lt;/p&gt;
&lt;p &gt;Keep in mind that all sorts of mutable structures and imperative&lt;br &gt;
elements are possible in Modern Eiffel. But in order to verify SW&lt;br &gt;
immutable types and especially inductive types are very important.&lt;br &gt;
Therefore this blog will first scrutinize immutable types.&lt;/p&gt;</description>
 <category domain="http://lambda-the-ultimate.org/taxonomy/term/1">LtU Forum</category>
 <pubDate>Wed, 25 Jan 2012 08:57:11 -0500</pubDate>
</item>
<item>
 <title>STEPS 2011 Progress Report (personal computing in 20kLOC)</title>
 <link>http://lambda-the-ultimate.org/node/4436</link>
 <description>The &lt;a href=&quot;http://lambda-the-ultimate.org/node/4432#comment-68904&quot;&gt;recent mention&lt;/a&gt; of the Nile programming language reminded me to post about the &lt;a href=&quot;http://www.vpri.org/pdf/tr2011004_steps11.pdf&quot;&gt;STEPS 2011 Progress Report&lt;/a&gt;.


&lt;blockquote &gt;
The overall goal of STEPS is to make a working model of as much personal computing phenomena and
user experience as possible in a very small number of lines of code (and using only our code). Our total
lines of code‑count target for the entire system “from end‑user down to the metal” is 20,000, which—if we
can do a lot within this limit—we think will be a very useful model and substantiate one part of our
thesis: that systems which use millions to hundreds of millions of lines of code to do comparable things
are much larger than they need to be.
&lt;/blockquote&gt;
...
&lt;blockquote &gt;
Our general approach is to pick an area whose parts seem to be related—for example: 2.5D anti‑aliased
alphaed computer graphics—try to find the mathematical relations that cover the desired phenomena,
design a “problem oriented language” (POL) that is a “runnable math” version of the mathematics,
implement that language, then use it to write the program code for the target area.
&lt;/blockquote&gt;
...
&lt;blockquote &gt;
STEPS is now to the point where it is more fun to use and demonstrate than to talk and write about.
Quite a bit of the original proposal is now working well enough to give all our presentations and write
this entire report for the NSF and Viewpoints Research Institute websites. In the STEPS system, this
document is live: the examples are actually runnable demos; the code shown is changeable and testable,
etc.
&lt;p &gt;
&lt;p &gt;
A large part of the work over the last year has gone into making the test versions more real and usable.
&lt;/blockquote&gt;

Previous discussion of this project on LtU includes:

&lt;ul &gt;
&lt;li &gt;&lt;a href=&quot;http://lambda-the-ultimate.org/node/2021&quot;&gt;Steps Toward The Reinvention of Programming&lt;/a&gt; The NSF grant proposal (2006)&lt;/a&gt;&lt;/li&gt;
&lt;li &gt;&lt;a href=&quot;http://lambda-the-ultimate.org/node/2725&quot;&gt;STEPS Toward The Reinvention of Programming: First Year Progress Report&lt;/a&gt;&lt;/li&gt;
&lt;li &gt;&lt;a href=&quot;http://lambda-the-ultimate.org/node/4325&quot;&gt;Programming and Scaling&lt;/a&gt;, a lecture by Alan Kay&lt;/li&gt;

&lt;/ul&gt;</description>
 <category domain="http://lambda-the-ultimate.org/taxonomy/term/1">LtU Forum</category>
 <pubDate>Tue, 24 Jan 2012 17:45:03 -0500</pubDate>
</item>
<item>
 <title>Non-deterministic versus parallel function application</title>
 <link>http://lambda-the-ultimate.org/node/4435</link>
 <description>&lt;p &gt;Greetings,&lt;/p&gt;
&lt;p &gt;  Ehrhard and Regnier described a functional programming language -- the differential lambda calculus -- which added to the lambda calculus a commutative monoid structure and a differential operation.  One feature of this calculus is that application is linear in the first argument.&lt;/p&gt;
&lt;p &gt;  I am studying a weaker system that adds only the commutative monoid structure, and I insist that application preserves addition in the first argument (which is implied in E.R.&#039;s system).  This means:&lt;br &gt;
    (g+h)*m = g*m + h*m&lt;br &gt;
    0*m = 0&lt;br &gt;
  (where * is application)&lt;/p&gt;
&lt;p &gt;  The above has the feel of non-determinism to it.  Given &#039;g&#039; or &#039;h&#039; applied to &#039;m&#039; the result is &#039;g&#039; applied to &#039;m&#039; or &#039;h&#039; applied to &#039;m.&#039;  &lt;/p&gt;
&lt;p &gt;  However, in general:&lt;br &gt;
    g*(m+n) =/= g*m + g*n&lt;/p&gt;
&lt;p &gt;  So it is not as if &#039;g&#039; makes a non-deterministic choice of &#039;m&#039; or &#039;n.&#039;  While some have called this non-determinism, others have called parallelism. &lt;/p&gt;
&lt;p &gt;Any thoughts on what the correct word describing such an application might be?&lt;/p&gt;</description>
 <category domain="http://lambda-the-ultimate.org/taxonomy/term/1">LtU Forum</category>
 <pubDate>Tue, 24 Jan 2012 13:46:50 -0500</pubDate>
</item>
<item>
 <title>Visual Studio Achievements</title>
 <link>http://lambda-the-ultimate.org/node/4433</link>
 <description>&lt;p &gt;From the it-had-to-happen department, &lt;a href=&quot;http://channel9.msdn.com/Blogs/C9team/Announcing-Visual-Studio-Achievements&quot;&gt;Announcing Visual Studio Achievements Beta&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote &gt;&lt;p &gt;Impress your friends! Earn achievements while you code! Code while you earn achievements!&lt;/p&gt;&lt;/blockquote&gt;
&lt;p &gt;What&#039;s troubling is that the &lt;a href=&quot;http://channel9.msdn.com/achievements/visualstudio&quot;&gt;list of achievements&lt;/a&gt; in fact includes various anti-achievements such as Go To Hell (for using &lt;code &gt;goto&lt;/code&gt;), Potty Mouth (&quot;Use 5 different curse words in a file&quot;), Turtles All The Way Down (&quot;Write a class with ten levels of inheritance&quot;) etc.&lt;/p&gt;
&lt;p &gt;In the grim future of gamified PLT, you&#039;ll not only be tyrannised by your BDFL, your aberrances from the One Microsoft Way will be broadcast to your peers in realtime.&lt;/p&gt;
&lt;p &gt;Also: &lt;a href=&quot;https://twitter.com/#!/search/%23xcodeachievements&quot;&gt;XCode achievements&lt;/a&gt; on Twitter.&lt;/p&gt;</description>
 <category domain="http://lambda-the-ultimate.org/taxonomy/term/1">LtU Forum</category>
 <pubDate>Thu, 19 Jan 2012 14:18:59 -0500</pubDate>
</item>
<item>
 <title>Graphics primitives?</title>
 <link>http://lambda-the-ultimate.org/node/4432</link>
 <description>&lt;p &gt;I want to recreate most of graphics primitives (lines, rectangles, circles, filling, gradients, ...) myself from scratch. From the deepest zero, like composing usefull functions from combinators. What are analogues to combinators or λ-abstractions in graphics creating?&lt;/p&gt;
&lt;p &gt;The first-in-mind thought was &quot;gotoxy, setpixel, getpixel&quot;, but it can deal only with raster canvas. The basic &quot;pendown, penup, moveto&quot; is not so bad, but how to express filling of area with it or draw raster images (or drawing curves, thick lines)? Furthermore, I mentioned only monochrome drawings, what are primitives when dealing with colors? RGB, CMYK, 16-bit color-components? What is the ground found in computer graphics reserch area, which can be extended to something usefull?&lt;/p&gt;
&lt;p &gt;Language to deal with it is haskell (or haskell-like). I expect to recreate canvas-drawing abilities of frameworks like &quot;SVG&quot;, &quot;OpenGL&quot;, &quot;LOGO&quot;, gui-like interfaces, and have extensibility to reimplement all other frameworks (GTK, QT, directx, ..?). (last question is joke, indeed, just wanted to show list of possible uses).&lt;/p&gt;
&lt;p &gt;Maybe there is no unifing ground for all I metioned. Then the question is: what are branches of computer graphics and ground reserch state with this braches?&lt;/p&gt;</description>
 <category domain="http://lambda-the-ultimate.org/taxonomy/term/1">LtU Forum</category>
 <pubDate>Thu, 19 Jan 2012 08:54:54 -0500</pubDate>
</item>
<item>
 <title>crazy PL idea: prescriptive trait inference</title>
 <link>http://lambda-the-ultimate.org/node/4431</link>
 <description>&lt;p &gt;I&#039;ve been working with a type system where type requirements are not actually checked, but added automatically to the program as needed. Such a type system can better support for bottom-up programming, but also allows for lots of small types (like mixins) in a library without the requiring programmers to tediously compose their objects.  As a small example, consider a UI library with various kinds of panels that vary depending on how they manage layout:&lt;br &gt;
&lt;code &gt;&lt;br &gt;
trait Panel { ... }&lt;br &gt;
trait Canvas :: Panel { ... }&lt;br &gt;
trait Dock :: Panel { ... }&lt;/p&gt;
&lt;p &gt;trait Widget(c: Panel) { ... }&lt;br &gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p &gt;This language has no classes, just mixin-like traits.  The :: operator means exclusive class-like inheritance, meaning Canvas and Dock cannot both be extended by the same panel object, while the : operator means normal mixin inheritance as in Scala. Canvas supports manual widget positioning, while dock allows the widget to be docked at the edge or center of the panel. We express this by defining two new kinds of widgets that exist in each panel:&lt;/p&gt;
&lt;p &gt;&lt;code &gt;&lt;br &gt;
trait CanvasWidget(c : Canvas) : Widget(c) { var Position : Point; }&lt;br &gt;
trait DockWidget(c : Dock) : Widget(c) { var Dir : Direction; }&lt;br &gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p &gt;Now, we can define a program using just panel and widget:&lt;br &gt;
&lt;code &gt;&lt;br &gt;
val p = new Panel();&lt;br &gt;
val w = new Widget(c = p);&lt;br &gt;
w.Position = (100, 100);&lt;br &gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p &gt;When this code is compiled, &quot;w&quot; implicitly extends CanvasWidget because Position was accessed on it, which incidentally causes &quot;p&quot; to implicitly extend Canvas. The inference occurs at compile time, p is a canvas from the moment it is created.&lt;/p&gt;
&lt;p &gt;All abstractions exist in a flat space and are somehow uniquely named so the programmer can select them (think wiki&#039;s disambiguation pages). Inference can then occur because the user selected a specific abstraction whose typing requirements are known, as opposed to the other way around where the type determines how a name is resolved. The usability benefits come from the user not having to know about special kinds of widgets and panels; rather they can focus on what they want to do rather than how to enable that. In general, we could then build libraries with hundreds of little traits as an extreme form of &quot;batteries included,&quot; where the user need not be aware of most of these traits as they are applied automatically as needed.   &lt;/p&gt;
&lt;p &gt;Conflicts can arise if inference requires an object to extend two incompatible traits; e.g.,&lt;br &gt;
&lt;code &gt;&lt;br &gt;
val p = new Panel();&lt;br &gt;
val w = new Widget(c = p);&lt;br &gt;
w.Position := (100, 100);&lt;br &gt;
w.Dir := Center;&lt;br &gt;
&lt;/code&gt;&lt;br &gt;
An error occurs because &quot;p&quot; cannot extend both Canvas and Dock, which is necessary to support widget&#039;s access of both position and direction, the error in this case is actually on &quot;p&quot; rather than the accesses. My current implementation is a structured editor which would just hide &quot;Direction&quot; after &quot;Position&quot; was accessed. &lt;/p&gt;
&lt;p &gt;I&#039;m calling this prescriptive trait inference as an alternative to type inference which acts to catch errors rather than build programs; although this might be a bit unfair since implicit coercions driven by type inference can actually cause computation to occur (say in Scala). I want to go further on this design and build a more general language, which involves tackling the following problems:&lt;/p&gt;
&lt;ul &gt;
&lt;li &gt; Supporting trait inference with imperative assignment. Basically, any value assigned to a variable is affected by traits inferred for that variable, without any regard to control flow; e.g.,
&lt;p &gt;&lt;code &gt;&lt;br &gt;
val dict = new Dictionary();&lt;br &gt;
val e, f = new object();&lt;br &gt;
dict[1] := e; dict[2] := f;&lt;br &gt;
dict[some_int].Quack(); // e and f are now inferred to be ducks!&lt;br &gt;
&lt;/code&gt;&lt;/p&gt;
&lt;li &gt; Inference must occur in a modular way. Each encapsulation unit has its own &quot;inference graph&quot; that describes how values flow through it. Private members are elided from this graph to get a nice modular graph that then allows the unit to be used during inference without resorting to whole program analysis.
&lt;li &gt; &quot;Anything goes&quot; presents two new usability problems. First, the type of an object being created is no longer determined solely by its creation site, this can make the program harder to understand without proper tooling that reveals what has been implied. Second, that a programmer can use almost any abstraction in a large universe at any time makes normal auto-completion useless (which depends on types for filtering), the abstractions instead need to be &quot;ranked&quot; somehow.
&lt;/ul&gt;
&lt;p &gt;Ah, this post is way too long; hopefully this doesn&#039;t come off as a brain dump. Anyways, I would appreciate some early feedback before I go off and do a general purpose language (I&#039;m off to Krabi tomorrow, but I can&#039;t stop thinking about this :) ). &lt;/p&gt;</description>
 <category domain="http://lambda-the-ultimate.org/taxonomy/term/1">LtU Forum</category>
 <pubDate>Tue, 17 Jan 2012 06:42:51 -0500</pubDate>
</item>
<item>
 <title>GoingNative 2012 - C++11 Style, Variadic Templates, Concepts, Static If, Memory Model, STL11, VC11 (and beyond) and Clang</title>
 <link>http://lambda-the-ultimate.org/node/4430</link>
 <description>&lt;p &gt;The &lt;a href=&quot;http://channel9.msdn.com/Events/GoingNative/GoingNative-2012&quot;&gt;GoingNative 2012 Conference&lt;/a&gt; is a C++ event focusing mainly on C++11, the latest version of ISO C++. Topics include an updated approach to solving the Concepts problem, static if (a potential solution to the same set of problems associated with template programming), C++11 Memory Model (C++11 threads and shared variables), STL11 implementation magic and tricks, Bjarne&#039;s definition of what &quot;modern&quot; C++ means (Day 1 keynote), variadic templates, compilers, and more. Herb Sutter will keynote Day 2, digging into C++11 and share some thoughts on C++1x, VC11 and beyond. Chandler Carruth will dig into some of the things the clang compiler project is trying to accomplish, especially as it relates to C++ developer productivity.&lt;/p&gt;
&lt;p &gt;For those of you who don&#039;t hate C++ ( :-) ), this should be of interest to you. The event will stream live, so if you can&#039;t make it to Redmond, you can watch the whole affair from wherever you happen to be (assuming you&#039;re Internet-connected, running a modern desktop browser and not living in a timezone where you&#039;re most likely in a sleeping dream state. All content will air on-demand 24 hours after the event and in multiple media formats (WMV, MP4, WebM). For the live streaming, Silverlight 4+ is required (you can&#039;t smooth-stream into HTML5 video and Flash isn&#039;t an option))&lt;/p&gt;
&lt;p &gt;
The Agenda:
&lt;/p&gt;
&lt;p &gt;&lt;strong &gt;Day 1 &amp;ndash; C++11 Today&lt;/strong&gt;&lt;/p&gt;
&lt;p &gt;&lt;em &gt;Registration Opens/Continental Breakfast 8:00-9:30AM&lt;/em&gt;&lt;/p&gt;
&lt;p &gt;&lt;strong &gt;[Keynote ] 9:30-11:00AM PST (1730 - 1900&amp;nbsp;UTC)&amp;nbsp;-- &lt;a href=&quot;http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Keynote-Bjarne-Stroustrup-Cpp11-Style&quot;&gt;Bjarne Stroustrup&lt;/a&gt;&lt;/strong&gt;&lt;a href=&quot;http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Keynote-Bjarne-Stroustrup-Cpp11-Style&quot;&gt;&lt;strong &gt;: &lt;/strong&gt;&lt;strong &gt;C++11 Style&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p &gt;&lt;strong &gt;11:15-12:15PM PST (1915 - 2015 UTC)&amp;nbsp;&amp;ndash; &lt;a href=&quot;http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Threads-and-Shared-Variables-in-C-11&quot;&gt;Hans Boehm&lt;/a&gt;&lt;/strong&gt;&lt;a href=&quot;http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Threads-and-Shared-Variables-in-C-11&quot;&gt;&lt;strong &gt;: &lt;/strong&gt;&lt;strong &gt;Threads and Shared Variables in C++11&lt;/strong&gt;&lt;/a&gt;&lt;br &gt;&lt;em &gt;&lt;br &gt;Lunch 12:15-1:15PM&lt;/em&gt;&lt;/p&gt;
&lt;p &gt;&lt;strong &gt;1:15-2:15PM PST (2115 -&amp;nbsp;2215 UTC)&amp;nbsp;&amp;ndash; &lt;a href=&quot;http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/STL11-Magic-Secrets&quot;&gt;Stephan T. Lavavej: STL11 &amp;ndash; Magic &amp;amp;&amp;amp; Secrets&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p &gt;&lt;strong &gt;2:30-3:30PM PST (2230 - 2330&amp;nbsp;UTC)&amp;nbsp;&amp;ndash; &lt;a href=&quot;http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Variadic-Templates-are-Funadic&quot;&gt;Andrei Alexandrescu&lt;/a&gt;&lt;/strong&gt;&lt;a href=&quot;http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Variadic-Templates-are-Funadic&quot;&gt;&lt;strong &gt;: &lt;/strong&gt;&lt;strong &gt;Variadic Templates are Funadic&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p &gt;&lt;em &gt;Coffee/Snack Break 3:30 &amp;ndash; 4:00PM&lt;/em&gt;&lt;/p&gt;
&lt;p &gt;&lt;strong &gt;4:00 &amp;ndash; 5:15PM PST (0000 - 0115 UTC)&amp;nbsp; - &lt;a href=&quot;http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Interactive-Panel-The-Importance-of-Being-Native&quot;&gt;Panel: The Importance of Being Native &lt;/a&gt;&lt;/strong&gt;&lt;a href=&quot;http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Interactive-Panel-The-Importance-of-Being-Native&quot;&gt;(&lt;strong &gt;Bjarne, Andrei, Herb, Hans&lt;/strong&gt;)&lt;/a&gt;&lt;strong &gt; &lt;/strong&gt;&lt;strong &gt;&lt;/p&gt;
&lt;p &gt;Dinner/Party 7:00PM &amp;ndash; 10PM (The Parlour Billiards and Spirits, Bellevue)&lt;/strong&gt;&lt;/p&gt;
&lt;p &gt;&lt;strong &gt;&lt;br &gt;Day 2 &amp;ndash; C++11 Today and Tomorrow&lt;/strong&gt;&lt;/p&gt;
&lt;p &gt;&lt;em &gt;Continental Breakfast 8:00-9:30AM&lt;/em&gt;&lt;/p&gt;
&lt;p &gt;&lt;strong &gt;[Keynote] 9:30 &amp;ndash; 11:00AM PST (1730 - 1900 UTC)&amp;nbsp;&amp;ndash; Herb Sutter&lt;/strong&gt;: &lt;strong &gt;C++11, VC++11 and Beyond &lt;/strong&gt;[abstract pending]&lt;/p&gt;
&lt;p &gt;&lt;strong &gt;11:15-12:15PM PST (1915 - 2015 UTC) &amp;nbsp;&amp;ndash; &lt;a href=&quot;http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Clang-Defending-C-from-Murphy-s-Million-Monkeys&quot;&gt;&lt;b &gt;Chandler Carruth: Clang: Defending C++ from Murphy&#039;s Million Monkeys&lt;b &gt;&lt;/a&gt;&lt;br &gt;
&lt;br &gt;&lt;em &gt;&lt;br &gt;Lunch 12:15-1:15PM&lt;/em&gt;&lt;/p&gt;
&lt;p &gt;&lt;strong &gt;1:15-2:15PM PST (2115 - 2215 UTC)&amp;nbsp;&amp;ndash; &lt;a href=&quot;http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Static-If-I-Had-a-Hammer&quot;&gt;Andrei Alexandrescu: Static If I Had a Hammer&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p &gt;&lt;strong &gt;2:30-3:30PM PST &amp;nbsp;(2230 - 2330 UTC)&amp;nbsp;&amp;ndash; &lt;a href=&quot;http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/A-Concept-Design-for-C-&quot;&gt;Bjarne Stroustrup and Andrew Sutton: A Concept Design for C++&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p &gt;&lt;em &gt;Coffee/Snack Break 3:30 &amp;ndash; 4:00PM&lt;/em&gt;&lt;/p&gt;
&lt;p &gt;&lt;strong &gt;4:00 &amp;ndash; 5:30PM PST (0000 - 0115 UTC)&amp;nbsp;&amp;ndash; &lt;a href=&quot;http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Interactive-Panel-Ask-Us-Anything-&quot;&gt;Panel: Ask Us Anything! &lt;/a&gt;&lt;/strong&gt;&lt;a href=&quot;http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Interactive-Panel-Ask-Us-Anything-&quot;&gt;(&lt;strong &gt;all speakers&lt;/strong&gt;)&lt;/a&gt;&lt;/p&gt;</description>
 <category domain="http://lambda-the-ultimate.org/taxonomy/term/1">LtU Forum</category>
 <pubDate>Sun, 15 Jan 2012 20:38:36 -0500</pubDate>
</item>
<item>
 <title>Usage of Range Dependencies may not Lead to NP-Complete Problems</title>
 <link>http://lambda-the-ultimate.org/node/4429</link>
 <description>&lt;p &gt;Two years ago I got your comments about &lt;a href=&quot;http://lambda-the-ultimate.org/node/3588&quot;&gt;NP-complete Library Versioning Problem&lt;/a&gt; and &lt;a href=&quot;http://lambda-the-ultimate.org/node/3594&quot;&gt;Proper Library Versioning no longer NP-Complete&lt;/a&gt; and I even demonstrated on OSGi&#039;s range dependencies that situations of this kind are not unlikely to happen in real projects.&lt;/p&gt;
&lt;p &gt;Since then I thought that the root of all evil is the usage of &lt;a href=&quot;http://wiki.apidesign.org/wiki/RangeDependencies&quot;&gt;range dependencies&lt;/a&gt;. Now I think I was wrong. With the help of &lt;a href=&quot;http://wiki.apidesign.org/wiki/RangeDependenciesAnalysed#Avoiding_NP-Completeness&quot;&gt;complete repositories&lt;/a&gt; one can elimiante the NP-Complete problems by encoding all transitive dependencies during compilation.&lt;/p&gt;
&lt;p &gt;I&#039;ve summarized my recent findings into a &lt;a href=&quot;http://wiki.apidesign.org/wiki/RangeDependenciesAnalysed&quot;&gt;proof&lt;/a&gt;. I&#039;ll be glad if LtU audience helps me review &lt;a href=&quot;http://wiki.apidesign.org/wiki/RangeDependenciesAnalysed&quot;&gt;it&lt;/a&gt;. Thanks and happy new year!&lt;/p&gt;</description>
 <category domain="http://lambda-the-ultimate.org/taxonomy/term/1">LtU Forum</category>
 <pubDate>Mon, 09 Jan 2012 05:44:59 -0500</pubDate>
</item>
<item>
 <title>Register Allocation By Model Transformer Semantics -- need for early comments</title>
 <link>http://lambda-the-ultimate.org/node/4428</link>
 <description>&lt;p &gt;Hello,&lt;/p&gt;
&lt;p &gt;I&#039;m drafting a paper on a new method for register allocation. But because of my limited experience, I have no idea whether someone else has done this kind of research before. So I hope to get some early comments here before I decide to submit it to a conference. I will appreciate your interest.&lt;/p&gt;
&lt;p &gt;Here is the abstract of it:&lt;/p&gt;
&lt;p &gt;&quot;Register allocation has long been formulated as a graph coloring problem, coloring the dependency graph with physical registers. Such a formulation does not fully capture the goal of the allocation, which is to minimize the traffic between registers and memory. Minimizing the number of allocated registers, the goal of graph coloring, is an imperfect proxy for the real goal. Linear scan has been proposed as an alternative to graph coloring, but in essence, it can be viewed as a greedy algorithm for graph coloring: coloring the graph vertices not in the order of degrees, but in the order of their occurence in the program. Thus it suffers from almost the same constraints as graph coloring. In this article, I propose a new method of register allocation based on the ideas of model transformer semantics (MTS) and static cache replacement (SCR). Model transformer semantics captures the semantics of registers and the stack. Static cache replacement relaxes the assumptions made by graph coloring and linear scan, aiming directly at reducing register-memory traffic. The method explores a much larger solution space than that of graph coloring and linear scan, thus providing more opportunities of optimization. It seamlessly performs live range splitting, an optimization which is only found in extensions to graph coloring and linear scan. Also, it greatly simplifies the compiler and its semantics-based approach provides possibilities of simplifying the formal verification of compilers.&quot;&lt;/p&gt;
&lt;p &gt;Its full text can be found &lt;a href=&quot;http://www.cs.indiana.edu/~yw21/papers/reg_alloc.pdf&quot;&gt;here&lt;/a&gt;. I also have given a talk at Indiana University in Nov 2011. Here are the slides [&lt;a href=&quot;http://www.cs.indiana.edu/~yw21/slides/reg_alloc.pptx&quot;&gt;PPT&lt;/a&gt;] [&lt;a href=&quot;http://www.cs.indiana.edu/~yw21/slides/reg_alloc.pdf&quot;&gt;PDF&lt;/a&gt;].&lt;/p&gt;</description>
 <category domain="http://lambda-the-ultimate.org/taxonomy/term/1">LtU Forum</category>
 <pubDate>Wed, 04 Jan 2012 16:19:04 -0500</pubDate>
</item>
</channel>
</rss>

