EUC(Erlang User Conference)2012上Joe Armstrong的演讲主题是: A Few Improvements to Erlang》,很惊喜!!!因为Joe Armstrong提到的问题,我一直保持关注,而且他提到的前面两种方法我都实践过, : )
 
Note:下面的截图来自Joe Armstrong的演讲稿,下载地址: http://www.erlang-factory.com/upload/presentations/594/armstrong_erl2.pdf

第一种方法:多加一个参数

当时解决问题的思路就是:"如果要达到我们的目标,要把尾递归要执行的当前方法作为参数传进去"
 
我写的第一篇,没有好的思路纯粹是在Shell中试出来的: [Erlang 0050]用fun在Erlang Shell中编写尾递归 (2012-03-24 22:08)

 

第二种方法:Y Combinator

第一种方法总是感觉怪异,主要是感觉语法噪音过多,于是一直关注寻找看是否有别的解决方案,找到了Y Combinator的方法
 
 
 

 

Erlang 未来的解决方案

通过引入一个新的关键字def(类似Haskell的define),新的解决方案将是下面这样的:
 

  
  Joe Armstrong紧接着解释了,上面解决方案只是表面现象,根源上这是由于 Forms and Expressions的分歧造成的:Erlang Shell是一个Expression计算器;而我们的erlang模块是有Form序列构成的,编译器会把这些Form序列编译成目标文件(object file).Forms和Expressions的差异见下图:
 

 
     换言之,在模块文件中和在Erlang Shell中的代码行为是不一致的,def的引入就是在语法层面做了小小的改动,让我们的Erlang代码在 shell, modules, and escript中表现尽量一致.这个目前依然在进行中的项目被Joe Armstrong成为 erl2 地址:https://github.com/joearms/erl2 之前总结微软.net framework演变历程的时候发现语言和框架发展日趋完善对项目级开发的各种支持也愈发完善,Erlang的这个变化应该也属于这一类.
 
 
按照Joe Armstrong的描述,erl2除了解决了上面的问题之外还提供了一种元编程的方式,来解决项目代码的各种定制,之前
What is Erlang II?
An erlang generator - running the command
erl2 File.erl2 creates one or more erlang modules.
Don’t mess with Erlang. Write a program that writes programs.
erl2 programs create erl1 programs
erl3 programs create erl2 programs
Metaprograming!
 
 不过我还是想发自心底的想问前辈:什么时候把Unicode的问题统一了啊?
 
更多精彩,点击这里:
 
 
看来要继续努力了,加油!