作者自述CSE语言设计思想(三)----用CSE模拟LISP语言(上)

在接下来几篇博客中,我将通过用CSE脚本模拟LISP语言,来介绍CSE的函数式编程(Functional programming,FP)特性。

 

什么是函数式编程

从一个问题开始,到底什么是函数式编程?有人说像Lisp、Haskell、ErLang那样的编程就是函数式编程,当然,这是保守的回答,没有错,但也没说明问题实质。

Wikipedia对函数式编程的定义是:

Functional programming is a programming paradigm thattreats computation as the evaluation of mathematical functions and avoids stateand mutable data. It emphasizes the application of functions, in contrast tothe imperative programming style, which emphasizes changes in state.

函数式编程是一种编程范式,在这种编程方式中,我们更多的使用函数运算。函数式运算的特点是没有状态和可变量,一个函数有输入值和输出值,函数运算不会产生任何副作用(side effect)。与之相对的是Imperative Programming,就是我们通常说的命令式编程。

我举一个例子:

double oneThird =0.3333;
printf("I should get one third: %f\n",oneThrid * total);

三分之一是分成比例,该比例乘以总数是你该得份量,当我们用“oneThrid * total”表示时,引入了两个潜在风险(或称BUG),其一,oneThird是变量,当你前后做两次“oneThrid* total”计算时,如果oneThird变量被修改了,其它线程可能意外修改它,但你不知道,以为它没发生变化,这导致后一次计算值与前一次不一样,这就是边际效应。另一个风险是oneThird的来源,无论你怎么预先定义这个“分成比例”都是不准确的,上面我们预置0.3333,如果分1万个苹果,3人各拿0.3333*10000 = 3333个,结果多出1个,如果觉得0.3333不够精确,小数点后再添一个3,但分10万个苹果,同样也会多1个。

大家看到问题出在哪了吗?预置常量不足以表达1/3的数据本原,要改用动态计算的方式,即“1除以3”,改成如下语句:

printf("I shouldget one third: %f\n",(1.0/3) * total);

这时,total取任意值,计算机都尽它的能力(视浮点精度而定)让结果准确,不像上面分1万个苹果差1个,分10万个差1个,这种变化就是从命令式编程走向函数式编程。

有人对函数式编程做了总结,参见David Mertz写的文章:CharmingPython: Functional programming in Python,FP至少具备如下7个特征:

  • 函数是“首类”(first-class),你可以像对待数据一样对待函数,比如将函数作为一种数据传递给另一个函数。
  • 递归被用作主要控制结构,在某些FP语言中,甚至没有其他的可成构造“循环”的手段。
  • FP通常重点关注列表处理(比如LISP语言),常用递归子列表作为循环替代品。
  • FP是可避免副作用(或称边际效应)的纯功能性语言。这不同于命令式语言中,常用变量记录或传递中间状态。
  • FP不欢迎或禁止使用“语句”,所有东西都是可计算的表达式,换句话说,都是函数加参数,即便定义变量或函数也是如此。
  • FP关注计算什么甚过如何进行计算。
  • FP编程习惯使用高阶函数,换句话说,某函数对另一些函数做操作,该函数又被别的函数操作。

 

CSE与函数式编程

与其理解把CSE看成一门脚本语言,还不将它看成一个语言族,其表达能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值