Lambda 返回函数的Scheme write函数

Lambda 返回函数的Scheme write函数,lambda,scheme,Lambda,Scheme,我在定义一个函数时遇到问题,该函数根据给定的param“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) (la

我在定义一个函数时遇到问题,该函数根据给定的param“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:lambda
我做错了什么?
谢谢

我少了一个括号

正确的语法是:

    (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)))))

我少了一个括号

正确的语法是:

    (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)))))

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

(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)))
当然,在这种情况下,由于您是针对一组常量测试相同的值,因此可以简化为使用
案例

(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)))

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

(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)))
当然,在这种情况下,由于您是针对一组常量测试相同的值,因此可以简化为使用
案例

(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)))

您返回的lambda已经“关闭”了
f
a
的值。为什么不关闭
运算符的值呢。像这样:

(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)))))

您返回的lambda已经“关闭”了
f
a
的值。为什么不关闭
运算符的值呢。像这样:

(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)))))

由于括号位置错误,因此无论发生什么情况,函数都将始终返回0。很抱歉更正您的错误,Chris,但函数工作正常。不是真的。我刚刚在Racket中测试了你的函数,括号的位置不正确,结果与我提到的完全一样。因为你的括号位置错误,你的函数无论如何都会返回0。很抱歉纠正你的错误,Chris,但是函数工作正常。不是真的。我刚刚在Racket中测试了你的函数,括号的位置不正确,结果和我提到的一模一样。