一切都是数据:
类似lisp,scheme,emacs lisp 这类函数式语言,很重要的一个概念就是函数就是数据
其实一切都是表达式,所有的表达式都有值,也就是一切都是数据
在racket里面,定义函数,定义变量的语法分别为(define (fun-name vars ...) (fun-body...))
(define var var-value)
可以看到是几乎一样的.
scheme文法,语义
数据驱动编程:
**函数抽象 | 闭包 | :** |
无状态: 一直听到说函数式语言是无状态的,但按我的理解,在整个程序当中,其实任何语言都是有状态的 函数式语言所谓的无状态,应该是粒度控制在函数体内的无状态.也就是: 无论调用一个函数多少次,只要使用相同的参数,总会得到相同的结果。 这个在函数式语言里面是可以做到的.
尾递归:
### 条件表达式与函数 ### 下面是racket的条件表达式/条件函数
(cond
[question answer]
...
[question answer])
或
(cond
[question answer]
...
[else answer])
设计条件函数的几个步骤
过程 | 目标 | 任务 |
---|---|---|
数据分析 | 确定函数所要处理的所有不同情况 | 枚举所有可能的情况 |
例子 | 对于每种情况提供一个例子 | 对于每种情况至少选择一个例子 |
语句cond | 阐明一个条件表达式 | 写出cond表达式的框架 |
语句value | 对于每个cond子句给出答案 | 处理逻辑 |
其实这几条,都是很简单但是平时编程的时候也容易忽略的,导致一些低级错误的发生,这里最主要的其实还是分析数据
数据分析和设计: 在开始函数设计之前,先必须了解如何在程序设计语言中表示问题的信息。为做到 这一点,需要搜索问题以获得相关对象的描述,然后基于分析结果设计数据表示。
名字约定,类型约定: 将数据类型定义好,函数的作用,函数的输入,输出表达清楚. 例如:
(check (make-student 'Wilson 'Frize 'Harper) )
输出预期:'Wilson
;; process-student : student symbol -> ??? (define (process-student a-student a-teacher) ...)
(define (process-student a-student a-teacher)
... (student-last a-student) ...
... (student-first a-student) ...
... (student-teacher a-student) ...)