在 前一个blog里,我这样写道:“今天的object bootcamp再度证明,一切反动派都是纸老虎……嗯,一切面向对象都是语法糖。”读者 dongbin提出了一个很有趣的问题:

“一切面向对象都是语法糖”是否意味着所有面向对象编程语言都可以形式化的转换为函数式编程语言呢?比如LISP。那么可否通过直接在LISP之上添加语法糖来得到更简洁,强大的语言呢?

首先,确实可以“ 直接在LISP之上添加语法糖”,在SICP第三章(还是第四章?)就做了这样的事情。这个exercise的效果是,你可以直观地看到:所谓“面向过程”和“面向对象”,其实就是同样的一组lambda,用不同的语法糖表现出来而已,背后是完全一样的事情。这并不是说语法糖不重要,而是说你可以(并且应该)根据不同的情况选择最方便的语法糖,而不是让某一种语法糖(譬如“面向对象设计原则”)绑住手脚。

但另一个问题是,并非“ 所有面向对象编程语言都可以形式化的转换为函数式编程语言”。问题的根源是丘奇代数(Church Calculus)理论:一切可有效计算的函数(包括定值函数)都可以归约为lambda运算。但含有内部状态的函数不是一个可有效计算的函数,因为在不同时间它给出的值不同。所以,在有内部状态存在的情况下,面向对象程序通常是不能用(严格的)函数式语言描述的。(但赋值操作并不等价于内部状态。有赋值操作的程序很多时候也可以归约为函数,在《重构》书中有很多这样的例子。)

更加有趣的问题接踵而来:对于一个web应用而言,很多时候我们可以有效地将其可变状态限制在首尾两端。也就是说,web层是有状态的(当前用户session),其他的状态都持久化地保存在数据库里,而web应用本身——或者至少是“业务逻辑”的部分——很多时候可以是完全无状态的,也就是说可以将其归约为函数。这样做的好处不仅仅是优雅。函数是不存在并发问题的,因此无状态的web应用可以最方便地实现web-farm的集群部署,从而获得线性的scalability。

另一个有趣的现象是Java5引入的静态导入(static import)特性。以前经常说“static helpers are evil”,但static import引入的只能是static helper。从某种意义上,静态导入正是面向对象借鉴函数式编程走出的一步。

西行漫记(7):再论语法糖相关推荐

  1. Java 中的语法糖,真甜。

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 我们在日常开发中经常会使用到诸如泛型.自动拆箱和装箱.内部 ...

  2. Jvm 系列(十一)Java 语法糖背后的真相

    语法糖(Syntactic Sugar),也叫糖衣语法,是英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语.指的是,在计算机语言中添加某种语法,这些语法糖虽然不会对语言 ...

  3. C#语法糖(Csharp Syntactic sugar)大汇总

    首先需要声明的是"语法糖"这个词绝非贬义词,它可以给我带来方便,是一种便捷的写法,编译器会帮我们做转换:而且可以提高开发编码的效率,在性能上也不会带来损失.这让java开发人员羡慕 ...

  4. python数列求和-加强版_ES6深入浅出-3 三个点运算 新版字符串-1.函数与对象的语法糖...

    主要讲的内容 时间充裕的话就讲,模板字面量 默认参数值 首先讲es6之前,我们是怎么做的.例如我们要写一个求和的函数, 请两个参数的和,但是如果有的人就是穿一个参数呢? 那么b没有传值,b的值是多少呢 ...

  5. Java的12个语法糖【转】

    本文转载自公众号  Hollis 原创: 会反编译的 Hollis 侵权删 本文从 Java 编译原理角度,深入字节码及 class 文件,抽丝剥茧,了解 Java 中的语法糖原理及用法,帮助大家在学 ...

  6. Kotlin 中的 run、let、with、apply、also、takeIf、takeUnless 语法糖使用和原理分析

    这些Kotlin的语法糖函数经常用,但也很容易搞混,所以转载一下,若混了可以回来再看 转载自公众号:纸上浅谈 正文: 在 Kotlin 有一些可以简化代码的语法糖,比如 run.let.with.ap ...

  7. Java8 Lambda不仅仅只是语法糖

    前端时间,项目升级到jdk1.8,尝试了下Lambda写法:     public static void main(String[] args) {         List<String&g ...

  8. 浅析java中的语法糖

    概述 编译器是一种计算机程序, 它主要的目的是将便于人编写.阅读.维护的高级计算机语言所写的源代码程序, 翻译为计算机能解读.运行的低阶机器语言的程序, 即可执行文件.而 javac 就是java语言 ...

  9. 不了解这12个语法糖,别说你会Java!

    作者:Hollis 微信公众号:Hollis 本文从 Java 编译原理角度,深入字节码及 class 文件,抽丝剥茧,了解 Java 中的语法糖原理及用法,帮助大家在学会如何使用 Java 语法糖的 ...

最新文章

  1. python基础语法第10关作业-Python基础作业一
  2. jQuery-easyui和validate表单验证实例
  3. SpringMVC-HelloWorld
  4. Qt 6的Qt 3D会是什么样?
  5. pyplot交互地画多个plot
  6. python怎么输入一个数字并调用_Python3 实例(一)
  7. 题解-ZeroJudge-c686 高斯符號
  8. 双击硬盘盘符打不开文件的处理方法
  9. python 创建二维list,Python创建二维数组(关于list的一个小坑)
  10. 如何把你的Linux系统变得更加安全
  11. Mysql + keepalived 实现双主热备读写分离【转】
  12. ubb码转换的java类库 ubb2html_asp ubb代码转换成html代码
  13. 三种常用的BIOS升级方法
  14. 云服务器功能检验方法
  15. C++ 动态申请二维数组与二维数组传参
  16. python爬取问卷星内容_Python Selenium 问卷星自动填写
  17. tex排版,论文中图片转为eps格式,(pdf,visio转pes)eps图显示不完全
  18. 多项式嵌套乘法及matlab实现
  19. amd处理器安装安卓虚拟机
  20. 《The One!团队》第八次作业:ALPHA冲刺(五)

热门文章

  1. 四招搞定心仪的offer
  2. Linux中使用iptables记录网络访问日志
  3. 2022P气瓶充装考试练习题及答案
  4. c++ string最大长度_关于C++ std::string类内存布局的探究
  5. 孤狼电商店群全套教程:店群基础+2.0精细化蓝海+深度蓝海+裂变课程2.0
  6. 2020前端开发者的面试(2),不定时更新
  7. JavaScript轻应用UI介绍
  8. PHP 获取两个日期的相隔天数
  9. 互联网公司常用的DevOps 工具,你都认识吗?
  10. 【观世界】物理-事理-人理