编译原理 ML语言的初次接触(龙书)

ML语言支持嵌套的函数声明。也就是说将函数作为参数,并把函数当作值返回。

在这里插入图片描述

直接上代码

fun main()
{
    let
        fun fib0(n) =
            let
                fun fib1(n) =
                    let
                        fun fib2(n) = fib1(n-1) + fib2(n-2)
                    in
                        if(n >= 4) then fib2(n)
                        else fib0(n-1) + fib0(n-2)
                    end
            in
                if n >= 2 then fib1(n)
                else 1
            end
    in
        fib0(4)
    end;
}

如果这段代码没看懂,希望下面这段话能够帮到你。
对于ML语言,函数是可以嵌套定义的,(这就和我们之前学过的c和java都不一样),所以可以咋一看不好理解。函数都是由函数名函数体组成,ML语言的函数体由“ let——in——end ”共同组成。
下面这张图片可以帮你更好的理解上面的代码:
在这里插入图片描述

当你看懂上面这张图片,我们就可以分析这个main函数的执行过程。
当我们看一个函数时,首先要看函数体的三个部分的in部分(注意不是先看let部分) ,in中的代码一般是仅声明要调用哪个函数,然后再去let中去调用这个函数。

完整分析过程如下:
1.先进入main函数,然后看红色的in部分:fib0( 4 );
2.然后去main()的let块去找fib0函数(图中绿色部分),进入fib0函数,同样这个函数的in部分(绿色的in):满足if条件,执行fib1( 4 );
3.去fib0函数的let部分找fib1函数(蓝色部分),进入fib1函数,先看in部分(蓝色的in),满足if语句,执行fib2函数,然后去fib1函数的let部分。此时执行fib1(3) + fib1(2);

先算fib1(3),,我们再去找fib1函数,然后是fib1的in部分,满足else语句。执行fib0(2)+fib0(1);

先求fib0(2),找到fib0函数,满足if语句,执行fib1(2);
找fib1函数,进入蓝色in部分,满足else,执行fib0(1)+fib0(0);

先求fib0(1),找到fib0函数,进入绿色in部分,满足else,结束这个fib0(1)函数;
再求fib0(0),找到fib0函数,同样满足else,结束这个fib0(0)函数;

再求上面剩下的fib0(1),找到fib0函数,满足else,结束这个fib0(1)函数;

注意,上面还剩下一个函数没有处理,fib1(2),进入fib1,满足else,接着执行fib0(1)+fib(0),因为上面的步骤已经执行过这句代码,不再赘述。

至此,本文结束。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值