初探微软多范型语言Nemerle

开发 开发工具
Nemerle是一种多范型语言,提供了与C#近似的语法和强大的元编程系统;Nemerle是微软的研究项目之一,目前最新版本是0.9.7。

Nemerle是微软的研究项目之一,由 Wrocław 大学的Kamil Skalski、Michał Moskal、Prof. Leszek Pacholski、Paweł Olszt等人发明.

Nemerle是一种多范型语言(面向对象和函数式),完全支持编译器宏(后来更多的是Lisp的变种,而不是C++),以及许多其他的东西。Nemerla与VS2010里发布的F#不同,后者是纯函数式语言。

Nemerle提供了与C#近似的语法和强大的元编程系统。有关meta-program可以参考:http://en.wikipedia.org/wiki/Metaprogramming

你可以在http://nemerle.org/Main_Page下载它的***发布,在发布包中还带有与visual studio的集成的IDE,可以很方便地学习Nemerle这种多范型语言,***版本是0.9.7。

最传统的"Hello,World"

  1. using System.Console;     
  2. class Hello {     
  3.   static Main () : void {     
  4.     WriteLine ("Hello, world!");     
  5.   }     
  6. }    

Nemerle语言具有与C#近似的语法,无疑这使得学习曲线大幅下降。这里有几个与C#版"Hello,World"不同的地方:

1. void等返回类型都写到了右边的冒号后面

2. 在使用using的时候,引用的不单可以是命名空间(namespace),还可以引用类的成员,这样使得我们的WriteLine()函数都可以直接的使用。

多范型语言

  1. using System;  
  2. using System.Console;  
  3. using Nemerle.Utility;  
  4. using System.IO;  
  5. module Program  
  6. {  
  7.     class LineCounter  
  8.     {  
  9.         public static Main():Void  
  10.         {  
  11.             def sr=StreamReader(@"c:\test.rb");    //  (1)     
  12.             mutable line_no = 0;                   //  (2)  
  13.             mutable line = sr.ReadLine ();  
  14.             while (line != null) {                         
  15.                 WriteLine (line);  
  16.                 line_no = line_no + 1;                
  17.                 line = sr.ReadLine ();     
  18.              };                                      
  19.              WriteLine ("Line count: {0}", line_no);  
  20.         }  
  21.     }  

这里和C#不同的地方,首先我们通过关键字def定义了一个值sr,我们并没有声明它的类型,编译器会根据上下文自动赋予类型,我们称之为类型推断(Type Inference)。而且new关键字也不需要了。后面的方法与C#完全一样,不再赘述。

在(2)的地方,我们用mutable(即:可变的)声明了一个值line_no,它很像C#里的变量,必须初始化才能使用,并且还可以改变它的值。它与(1)处的"@"C:\test.rb"不同,后者是一个不可变的值。

我们前面提过Nemerle是种多范型的语言,所以我们可以在需要的地方采用函数式编程,其他地方采用面向对象编程,无疑更具备灵活性。

上面的代码可以修改成

  1. using System;  
  2. using System.Console;  
  3. using Nemerle.Utility;  
  4. using System.IO;  
  5. module Program  
  6. {  
  7.  class FunctionalLineCounter   
  8.  {     
  9.     public static Main () : void     
  10.     {    
  11.         def sr = System.IO.StreamReader (@"C:\test.rb");       
  12.         def read_lines (line_no : int) : int   
  13.         {    
  14.             def line = sr.ReadLine ();         
  15.             if (line == null)             
  16.               line_no           //here          
  17.               else {           
  18.               System.Console.WriteLine (line);            
  19.               read_lines (line_no + 1)                 
  20.                }       
  21.          };      
  22.         System.Console.WriteLine ("Line count: {0}", read_lines (0));     
  23.     }   
  24.   }  

这段程序从"//here"处结束并返回结果,而参数的累加结果正是***输出的line_no的值.

文本文件有多少行,read_lines()函数就要执行几次,像使用while循环一样,只不过稍微换了一种思路。这时候可能您会考虑到使用递归而影响效率的问题,事实是当一个函数主体在调用另一个函数后执行完毕,没有创建任何新的堆栈,这被称作尾端调用(Tail Call),所以这段代码和while循环在效率上一样的。Nemerle尤其注重将循环写成递归的深入的理解.

强大的宏

使用 Nemerle 宏(macros)可以产生新的语法。在Nemerler IDE中,添加一个macro project,并在你的程序里引用这个macro project.

  1.  
  2. using Nemerle.Compiler;  
  3. namespace Macro  
  4. {  
  5.     macro forp (i, n , m , body) //(1)  
  6.     syntax("forpermutation","(",i,"from", n,"to",m,")",body) //(2)  
  7.     {  
  8.         <[ for ($i = $n; $i <= $m; $i++) $body ]>  
  9.     }  
  10.    

在(1)处,我们定义了一个宏 forp,带有四个参数,参数默认类型是Expr,即表达式。 接下来,我们通过syntax定义了调用这个宏的语法,然后在<[...]>里定义宏的内容。

这个宏可以这样被调用

  1. mutable i=0;     
  2. forpermutation(i from 3 to 4) printf("%d\r\n",i);   

这样我们就创造了一个新的语法。奇怪的是,我将from换成in,Nemerle则会报错,文档中并未给出原因,个人觉得应该避免用关键字来定义语法。

 

【编辑推荐】

  1. Java以外的选择 Scala编程语言简介
  2. 函数式编程语言F#:基于CLR的另一个头等编程语言
  3. 浅析.NET平台编程语言的未来走向
  4. 新型的编程语言:eC
  5. 程序员如何选择合适的编程语言
责任编辑:佚名 来源: JavaEye
相关推荐

2009-08-11 08:55:28

Spec#微软

2013-10-11 10:17:21

微软开源市场

2024-01-10 09:50:58

AI 写作功能CoWriterChatGPT

2022-09-15 12:41:43

微服务后端前端

2012-02-09 10:58:35

Java

2023-11-08 13:17:00

Python解释型语言

2009-07-10 10:19:06

Java ME多模搜索

2022-07-11 09:46:43

Kubernetes开源Linux

2018-04-25 09:06:32

Chrome浏览器语言

2019-12-17 11:40:44

Node.js模块前端

2023-08-28 06:52:29

2012-02-09 09:00:54

汇编语言

2013-12-10 11:16:53

内存数据库TechEd2013

2022-09-30 15:28:05

BERT语言模型自然语言

2011-07-21 09:25:41

2020-11-14 16:05:44

Python微软

2014-03-28 10:43:32

iPad

2018-02-27 09:32:13

神经网络自然语言初探

2009-02-24 08:48:02

D语言C++编译器

2022-03-28 13:34:26

Go泛型部署泛型
点赞
收藏

51CTO技术栈公众号