最新公告
  • 欢迎光临28创新网,免费分享网络技术及行业资讯
  • 什么是程序员进行程序设计的基本出发点和最小单位(程序员是做什么的)

    传统的程序设计,概念一大堆。变量、表达式、顺序结构、分支结构、循环结构、函数、类、接口……,等等等等。

    最近学习sicp,彻底颠覆了我的认知。程序完全可以看成符号的变换过程,不需要变量、程序结构等概念。

    1、用lisp语言来表达这种认知。lisp语言是一门及其简洁的语言,只有符号列表以及配对括号,配对括号用于区分符号列表嵌套。例如:

    (+3 4)表示3+4。

    (sub (add a b c) d)表示a, b, c相加结果减去d。

    2、用define定义符号列表的含义。例如:

    (define (add x y) (+ x y))定义了(add x y)就是x+y。

    3、符号列表可以递归使用,解决循环问题。例如:

    (define (f n) (* (f (- n 1)) n))解决了n*(n-1)*(n-2)……的问题。

    4、cond条件符号解决分支问题。例如:

    (define (max a b) (cond ((> a b) a) (else b)))解决了求a, b最大值问题。

    5、符号可以当参数及返回值,方便过程重用。例如:

    (define (f g x y) (cond ((> x y) (g x y)) (else 0)))。该过程表示,x>y时,返回(g x y)内容,否则,返回0。过程g是作为参数传入的,如果计算(f add x y)则表示x>y时,返回x+y值。

    至此,符号列表已经可以解决所有数值问题了。

    而数据则可以看做一个黑盒子,通过构造函数、选择函数、判断函数对数据进行处理。

    1、lisp提供list函数,返回数据列表。例如:(list 1 2 3)返回列表(1 2 3)。car函数返回列表第一项,cdr返回列表剩余项。有了这三个函数,可以构造任何数据结构。例如,学生结构构造如下:

    (define (make-student name age) (list name age))

    (define (name student) (car student))

    (define (age student) (car (cdr student)))

    2、给数据加上类型标记,从而可以对不同数据提供统一的访问接口。例如:

    (add x y),这里x、y不但可以是普通数值,也可以是复数。

    有了构造函数、选择函数、类型判断函数、类型标记,对数据也可以处理了。不需要特别的数据定义语法。

    总之,lisp语言不是一门实用语言,但对我们理解程序的基础是什么,澄清不必要的概念非常有帮助。是我们重新认识什么是程序的利器。

    在此基础上,再去看其它语言各种语法的本质,就清晰多了。