三. 过程
- lambda形式:((lambda 参数 (过程)) 可选的实际参数)
- 带括号时为形式参数,否则被认为是一个参数list
- 定义函数用define:(define add2 (lambda (x) (+ x 2))),省略lambda:
(define (add6 x) (+ x 6)) - 谓词(procedure?)来测试一个对象实际上是否为过程
- 函数名即操作名:(add2 9) => 11
- (apply 函数名 参数列表)强制调用。
- 过程的套嵌定义遵循词法定界。
- define定义当前定界以下对象。
- (set!)仅改变当前定界中的对象:
(define bump-counter (lambda ()
(set! counter (+ counter 1))
counter))
(bump-counter) => 1
(bump-counter) => 2
(bump-counter) => 3
- 相对define,(let (定义局部变量) (其它代码))绑定局部变量到过程:
(let ((x 2) (y 5)) (* x y)) => 10
- let*内的定义不改变上级定界定义的局部变量
letrec的定义可互交引用?
(letrec ((even?
(lambda(x)
(if (= x 0) #t
(odd? (- x 1)))))
(odd?
(lambda(x)
(if (= x 0) #f
(even? (- x 1))))))
(even? 88)) => #t
letrec帮助局部过程实现递归。- 非标准的(fluid-let)不改变上级定界变量却引作当前定界局部变量——无聊。。。
(display (bump-counter)) (newline)
(display (bump-counter)) (newline)
(display (bump-counter)) (newline))
输出100,101,102,但原counter不变。
No comments:
Post a Comment