September 28, 2006

Scheme学习笔记(三)

(另一些参考资料:Scheme语言介绍,语言概要()())

三. 过程
  • lambda形式:((lambda 参数 (过程)) 可选的实际参数)
((lambda (x) (+ x 2)) 5) => 7
  • 带括号时为形式参数,否则被认为是一个参数list
((lambda someFriends ; 参数周围没有括号 ! (DisplayLine "hi there " someFriends)) 'mole 'bear 'tiger)
  • 定义函数用define:(define add2 (lambda (x) (+ x 2))),省略lambda:(define (add6 x) (+ x 6))
  • 谓词(procedure?)来测试一个对象实际上是否为过程
  • 函数名即操作名:(add2 9) => 11
  • (apply 函数名 参数列表)强制调用。
  • 过程的套嵌定义遵循词法定界。
五. 词法定界(下篇讲“四”)
  • define定义当前定界以下对象。
  • (set!)仅改变当前定界中的对象:
(define counter 0)
(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)不改变上级定界变量却引作当前定界局部变量——无聊。。。
(fluid-let ((counter 99))
(display (bump-counter)) (newline)
(display (bump-counter)) (newline)
(display (bump-counter)) (newline))
输出100,101,102,但原counter不变。

No comments: