不定式(一) 函数不定式

来源:互联网 发布:再度重相逢网络歌手 编辑:程序博客网 时间:2024/04/20 13:37

 

且以打印自然数序列为例来说明函数不定式,
列举1000以内的斐波那契序列并打印出来。
//方式一:直接列举并打印
public  void  fibo(){
    int lo =1, hi =1;
    while(hi<1000){
         System.out.print(hi);
         hi = lo + hi;
         lo = hi – lo;
    }
}
public shared(String[] args){
      fibo();
}
//方式二:列举与打印分离
public  void  fibo( void[int]  handler){
       int lo =1, hi =1;
       while(hi<50){
           handler(hi);
           hi = lo + hi;
           lo = hi – lo;
        }
}
public shared(String[] args){
           fibo( x ? System.out.print(x) );
}
方式一是传统中最常见的做法,方式二中使用了Yes语言独特的语法——函数不定式,它们都能完成同样的目标,但当需求发生变化,如 “再打印这一序列中的偶数”,二者的优劣就显示出来了,按方式一则需重写一个fibo函数,但按方式二,仅需在主函数中增加一句: fibo( x? System.out.print(x%2==0? x:""));  这与时下流行的IOC思想一致,能最大限度地实现代码重用。
那么究竟何为“函数不定式”呢?Yes语言规范中,“不定式”是指“对象的具体类型对程序员而言是不确定的,编译器通过上下文分析自动将该对象转为程序员期待的类型”。而“函数不定式”是Yes语言不定式规范中的一种。
以  x?System.out.print(x)  为例,Yes语言的编译器将其编译为一个类,这个类型对程序员而言是不确定的,事实上他根本不在意这个类型,他关注的只是这一份代码是否能完成它期待的功能(最终编译器将代码编译到该类中一个方法中)。在这里程序员仅关注这个方法的签名(不含方法名)是否能满足需求——即"void[int]"。