1. Arithmetic and Arithmetic
> (+ 1 2 3 4)
10
> (string-append "hello " "world")
"hello world"
> (string-length "hello world")
11
> (number->string 42)
"42"
> (string->number "42")
42
Lisp中的bool是#true,#false
> (string->number "hello world")
false
> (and true false)
false
> (and #true #false)
false
> (not (or #true #false))
false
它也支持算术运算:
> (> 10 9)
true
> (< 10 9)
false
> (>= 10 10)
true
> (string=? "hello" "world")
false
甚至是复杂的运算:
(and (or (= (string-length "hello world") (string->number "11"))
(string=? "hello world" "good morning"))
(>= (+ (string-length "hello world") 60) 80))
我们甚至可以操作图片(载入库2htdp/image):
备注:以下为截屏,因为代码中不允许有照片
也可以自己创建一些图形(图形也只是数据的集合):
备注:第三个图形应该是红色圆在蓝色方块上面,但是不知道为什么没显示.
而empty-scene生成一个栅格表,place-image将图片放入栅格表中:
备注:也不知道为什么栅格表无法显示
2. Inputs and Output
Lisp中函数的语法如下:
(define (FunctionName InputName) BodyExpression)
一个简单的实例(输出4):
(define (y x) (* x x))
(y 2)
我们可以编写一个火箭升空的函数:
备注:
「费曼」技巧:将难点分而化之,切成小知识块,再逐个对付,之后通过向别人清楚地解说来检验自己是否真的理解。当然,依旧会有你解决不了的问题,这时候不要强迫自己——很多时候当你之后回过头来再看这个问题时,一切豁然开朗。
这时,将引入一个操作:animate
1. animate开启一个时钟,并且计算时钟的滴答数
2. 时钟每秒滴答28次
3. 每滴答一次,animate都将当前的滴答数传递给函数作为参数
所以:
(animate create-rocket-scene)
在一秒内的操作是:
(create-rocket-scene 0)
.
.
.
.
(create-rocket-scene 28)
这就相当于我们在看一个动画:火箭的动画.
3. Many Ways To Compute
Lisp中条件表达式语法如下:
(cond
[ConditionExpression1 ResultExpression1]
[ConditionExpression2 ResultExpression2]
....
[ConditionExpressionN ResultExpressionN])
如果ConditionExpression1为真,则返回ResultExpression1,否则继续测试ConditionExpression2,如果都为假,则产生一个错误:
(define (sign x)
(cond
[(> x 0) 1]
[(= x 0) 0]))
(sign 10)
(sign -5)
(sign 0)
输出:
1
cond: all question results were false
>
这时候,更新我们的火箭程序:
运行指令:
> (animate create-rocket-scene.v2)
则可以看到火箭从上往下飞......
但是火箭本身具有大小的,所以优化后的程序为:
4. One Program, Many Definitions
Lisp中定义一个变量的语法如下:
(define Name Expression)
所以,我们完全可以重写之前的火箭程序:
5. One More Definition
但实际上火箭不可能以均匀的速度飞行的,这里我们引入了:d(t) = v * t - 1 / 2 * a * t * t的物理公式.则程序修改如下:
; properties of the "world"
(define WIDTH 100)
(define HEIGHT 1000)
;properties of the descending rocket
(define VELOCITY 20)
(define DECELERATION 1)
;various other constants
(define MTSCN (empty-scene WIDTH HEIGHT))
(define ROCKET '火箭的图形')
(define ROCKET-CENTER-TO-BOTTOM
(- HEIGHT (/ (image-height ROCKET) 2)))
(define X 50)
;functions
(define (create-rocket-scene.v6 t)
(cond
[(<= (distance t) ROCKET-CENTER-TO-BOTTOM)
(place-image ROCKET X (distance t) MTSCN)]
[(> (distance t) ROCKET-CENTER-TO-BOTTOM)
(place-image ROCKET X ROCKET-CENTER-TO-BOTTOM MTSCN)]))
(define (distance t)
(- (* VELOCITY t) (* 1/2 DECELERATION (sqrt t))))