FantasySoft兄的贴在这里

hehe,其实我是偷懒没用那些复杂的函数来当op,直接把+传进去吧了。Scheme里面,数据和函数都是一回事,没有区别的。

如果op是个复杂的函数,还是需要先吧这个函数定义出来,再传进去。
比如现在我们op操作符不再是加法这么简单,而是要算x和y的平方和是多少,即:
x^2 + y^2 = ?

如何用scheme来做呢?

首先我们的Foo的定义不用变,还是
(define (Foo op x y)
  (op x y))

然后,我们来定义新的op,叫sum-sq
(define (sum-sq x y)
  (+ (* x x) (* y y)))

最后来看看结果是不是正确:
(Foo sum-sq 3 4)
得25

运算过程嘛,就是
(Foo sum-sq 3 4)

->

((lambda (op x y)
   (op x y))
 sum-sq
 3
 4)

->

((lambda (op x y)
   (op x y))
 (lambda (x y)
   (+ (* x x) (* y y)))
 3
 4)

->

((lambda (x y)
   (+ (* x x) (* y y)))
 3
 4)

->

(+ (* 3 3) (* 4 4))

->25

别看我写那么复杂,其实是从DrScheme的Stepper上面copy过来的,呵呵

再说说scheme的语法吧,scheme的表达式都是用括号括起来的。括号左边第一个就是该表达式的运算符,后面的都是参数。在scheme里面调函数,就是(函数体 参数1 参数2 ...)。如果你要在函数里面调函数,就要用无数的括号来括你的表达式....这括号一多,看起来就头晕了...也算是Lisp/scheme一个不太方便的地方吧.