返回函数的Scheme写函数

时间:2013-03-22 08:12:42

标签: lambda scheme

我无法定义一个函数,根据给定的参数“flag”,它返回Scheme中的函数:

    (define con-func
  (lambda(f a flag)
    (cond (= flag 0) (lambda (x) (f (+ x a)))
          (= flag 1) (lambda (x) (f (- x a)))
          (= flag 2) (lambda (x) (f (* x a)))
          (= flag 3) (lambda (x) (f (/ x a)))
          (else (lambda (x) f x)))))

我收到错误消息:lambda: bad syntax in: lambda <br /> 我究竟做错了什么? 谢谢!

3 个答案:

答案 0 :(得分:4)

不,您添加的括号位于错误的位置。 cond子句的格式为(test result ...),因此括号中的第一个表达式应该是您的测试,然后是结果。

(define (con-func f a flag)
  (cond ((= flag 0) (lambda (x) (f (+ x a))))
        ((= flag 1) (lambda (x) (f (- x a))))
        ((= flag 2) (lambda (x) (f (* x a))))
        ((= flag 3) (lambda (x) (f (/ x a))))
        (else f)))

当然,在这种情况下,由于您针对一堆常量测试了相同的值,因此您可以简化为使用case

(define (con-func f a flag)
  (case flag
    ((0) (lambda (x) (f (+ x a))))
    ((1) (lambda (x) (f (- x a))))
    ((2) (lambda (x) (f (* x a))))
    ((3) (lambda (x) (f (/ x a))))
    (else f)))

答案 1 :(得分:0)

您要返回的lambda已经“关闭”fa的值。为什么不关闭operator的值。像这样:

(define (con-func f a flag)
  (let ((operator 
         (case flag
          ((0) +)
          ((1) -)
          ((2) *)
          ((3) /)
          (else (lambda (a b) a)))))
    (lambda (x) (f (operator x a)))))

答案 2 :(得分:-1)

我错过了一个括号..

正确的语法是:

    (define con-func
  (lambda(f a flag)
    (cond (= flag 0) ((lambda (x) (f (+ x a))))
          (= flag 1) ((lambda (x) (f (- x a))))
          (= flag 2) ((lambda (x) (f (* x a))))
          (= flag 3) ((lambda (x) (f (/ x a))))
          (else (lambda (x) f x)))))