程序设计语言中的语法糖

语法糖是什么呢?按我现在的理解,如果一门语言没有某个语法,照样可以通过其它更通用的方式来表达某种语义。这种语法的引入,只不过是 让表达语义更方便了。那么这个语法,就叫语法糖。

Scheme 中有两个关键字 lambda, let ,我目前的理解是,他们就是语法糖。

lambda

lambda 用来定义一个匿名函数。有时候,一个函数我们只在一个地方用一次,完全没必要给它定义一个名字,这时候,我们就用 lambda 定义 一个匿名函数。

如果没有 lambda ,那么我们定义函数时,会使用下面这种方式:

(define (pi-sum a b)
  (define (pi-term x)
    (/ 1.0 (* x (+ x 2))))
  (define (pi-next x)
    (+ x 4))
  (sum pi-term a pi-next b))

其中像 pi-term 和 pi-next 这样的小函数,完全可以通过 lambda 定义一个匿名函数。

(define (pi-sum a b)
  (sum
    (lambda (x) (/ 1.0 (* x (+ x 2))))
    a
    (lambda (x) (+ x 4))
    b))

let

let 用来定义局部变量,其实没有局部变量,我们也可以表达相应的语义,只不过有了 let ,定义起来更方便了。由于之前没有函数式语言 编程的经验,完全不知道没有局部变量要怎么办,所以还是看一个例子。

计算

f(x,y) = x(1+xy)^2 + y(1-y) + (1+xy)(1-y)

我们可以通过

a = 1 + xy
b = 1 - y
f(x, y) = xa^2 + yb + ab

来定义这个函数,这里面的 a, b 就相当于局部变量,那么在没有局部变量语法的情况下,我们怎么定义这个函数呢?

办法就是定义一个内部函数,将形式参数设定为 a, b,然后将 1 + xy 和 1-y 作为实际参数传递进去:

(define (f x y)
  (define (f-helper a b)
    (+ (* x (square a))
       (* y b)
       (* a b)))
  (f-helper (+ 1 (* x y))
            (- 1 y)))

而如果引入 let 这个语法糖后,定义起来就变得直观,容易多了:

(define (f x y)
  (let ((a (+ 1 (* x y)))
        (b (- 1 y)))
    (+ (* x (square a))
       (* y b)
       (* a b))))

从这里可以看出,let 作用域内分两部分,一部分定义局部变量,另一部分是函数体。

通过对 SICP 这部分的学习,我明白了,什么是本质上的东西,什么是语法糖。本质上的东西是对函数及求值方式的定义,他们形式简单,功能强大, 大部分语义都可以通过这些定义出来。只是为了方便,我们引入了语法糖,来更容易地表达语义。

关于 lambda 这个词的来源,书中也有介绍,这是历史原因,源于 Alonzo Church 的 lambda 演算。lambda 演算为研究函数定义, 函数应用提供了坚实的数学基础。我还隐约记得在程序设计语言课上,老师教我们用 lambda 演算定义自然数,加法等运算法则,true/false, if/else 等等。你可以看出,这些本质的东西,可以表达非常非常多的东西,功能异常强大。

注:这是我学习 SICP 后的总结与思考,例子也都来自于此书。

时间: 2024-10-01 23:01:42

程序设计语言中的语法糖的相关文章

C#十种语法糖

语法糖 指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用.通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会.需要声明的是"语法糖"这个词绝非贬义词,它可以给我们带来方便,是一种便捷的写法,编译器会帮我们做转换,而且可以提高开发编码的效率,在性能上也不会带来损失. 一.自动属性 以前:手写私有变量+公有属性现在:声明空属性,编译器自动生成对应私有成员字段. 写法:输入prop ,连续按两次tab键,自动生成属性. 1 /// <s

深入理解java虚拟机(十二) Java 语法糖背后的真相

语法糖(Syntactic Sugar),也叫糖衣语法,是英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语.指的是,在计算机语言中添加某种语法,这些语法糖虽然不会对语言的功能产生任何影响,却能使程序员更方便的使用语言开发程序,同时增强程序代码的可读性,避免出错的机会.但是如果只是大量添加和使用语法糖,却不去了解他,容易产生过度依赖,从而无法看清语法糖的糖衣背后,程序代码的真实面目. 总而言之,语法糖可以看做是编译器实现的一些"小把戏",这些"小

语法糖(Syntactic sugar)

语法糖(Syntactic sugar),是由Peter J. Landin(和图灵一样的天才人物,是他最先发现了Lambda演算,由此而创立了函数式编程)创造的一个词语,它意指那些没有给计算机语言添加新功能,而只是对人类来说更“甜蜜”的语法.语法糖往往给程序员提供了更实用的编码方式,有益于更好的编码风格,更易读.不过其并没有给语言添加什么新东西. 也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用.通常来说,使用语法糖能够增加程序的可读性,减少程序

Java语法糖1:可变长度参数

先抄一段定义: 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用.Java 中最常用的语法糖主要有泛型.变长参数.条件编译.自动拆装箱.内部类等.虚拟机并不支持这些语法,它们在编译阶段就被还原回了简单的基础语法结构,这个过程成为解语法糖. 简而言之就是语法糖就是为了方便编程,但不影响语言本身功能的情况下做的一种语法处理.虽然没有对语言本身有

【转载】游戏并发编程的讨论 &amp; Nodejs并发性讨论 &amp; 语法糖术语

知乎上这篇文章对于游戏后端.性能并发.nodejs及scala等语言的讨论,很好,值得好好看. https://www.zhihu.com/question/21971645 经常了解一些牛逼技术人员的分享,比闭门造车或者停留在陈旧技术固步自封,要好多了. 下面是一些摘录: 用C++开发,1000并发是基本. C++的优点是与硬件近,所以处理图形时速度快很多, 如果是处理业务,其实主要是看选用的算法的时间复杂度. 各语言之间的执行效率差别没那么大,同样用过C++跟JAVA,相比较的话JAVA的学

语法糖(Syntactic sugar )

https://en.wikipedia.org/wiki/Syntactic_sugar In computer science, syntactic sugar is syntax within a programming language that is designed to make things easier to read or to express. It makes the language "sweeter" for human use: things can be

C#语法糖,甜过初恋

偶然翻看了n年前自己写的几篇技术博文,真真切切切切实实实实在在有恍如隔世之感.当年那么晦涩枯燥的汇编代码亦能写的行云流水般,如今却几乎看不懂了,让美貌与智慧为化身的作者君那颗强大的玻璃心飘过一丝蛋蛋的忧伤.于是乎,不仅感叹计算机语言技术的发展速度,以及对生产效率带来的影响,其中C#的语法糖具有相当突出的代表性.语法糖比那些貌美如花嗲的掉渣的程序员鼓励师实用多了. 趁月落乌啼夜黑风高好下手,赶紧把当前的C#语法糖整理和汇总一下,第一温故知新,第二备忘,第三给需要的人参考,不足之处欢迎批评斧正,和谐

Java中的10颗语法糖

语法糖(Syntactic Sugar):也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用.通常来说,使用语法糖能够增加程序的可读性,减少程序代码出错的机会. 相对于C#及许多其他JVM来说,Java在现代编译语言之中属于“低糖语言”.尤其是JDK1.5之前的版本,“低糖”语法也是java语言被怀疑已经“落后”的一个表现方面. 在Javac的源码中,解语法糖的过程由desugar()方法触发,在com.sun.tools.javac.comp.Tr

Java中有哪些语法糖?

不要你写汇编,Java句句是糖 不能同意上面的这句话,要说为什么,首先要定义下面要讲的"语法糖". 语法糖指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,并没有给语言添加什么新东西,但是更方便程序员使用.通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会.语法糖_百度百科 从上面可以看出,就Java语言而言,语法糖并没有给class级别的代码新增其他特性,而是借助编译器,实现了基于编译器的新语法.这种新语法方便易用,可读性好易维护,所以称之为"糖