Scheme - 将变量定义为函数的结果?

时间:2011-01-26 05:18:02

标签: function functional-programming scheme

我的某个程序的开头会导致错误。这是问题所在。我试图将变量定义为递归函数的结果。

(define (test n)
  (define (a1func i)
    (if (= i 1) 0
        (+ (/ 1 i) (a1func (- i 1))))) 
  (define a1 (a1func (- n 1))))

如果您说它(test 10),则错误将是:

  

程序申请:预期程序,给定:#<undefined>;争论是:9

我认为这可以在Scheme中完成?想法?

2 个答案:

答案 0 :(得分:1)

在纯FP语言中,计算通过将参数传递给函数来完成,这些函数返回一些值作为结果。您可以在调用test的函数中绑定test的结果:

(define (test n)
  (define (a1func i)
    (if (= i 1) 0
        (+ (/ 1 i) (a1func (- i 1))))) 
  (a1func (- n 1)))

(define (calltest x)
  (define (r (test (+ 2 x))))
  (- r 4))

变量通常绑定一次,不能更改。函数必须返回值,表达式的结果,但(define a1 (a1func(- n 1)))是一个定义,而不是表达式,所以正确的代码是:

(define (test n)
  (define (a1func i)
    (if (= i 1) 0
        (+(/ 1 i) (a1func(- i 1))))) 
  (define a1 (a1func(- n 1)))
  a1)

由于定义变量并立即返回它是没有意义的,更正确的代码将是:

(define (test n)
  (define (a1func i)
    (if (= i 1) 0
        (+(/ 1 i) (a1func(- i 1))))) 
  (a1func(- n 1)))

答案 1 :(得分:0)

如果你的方案实现支持lisp宏,那么你可以这样写:

(define-macro (test n)
  (define (a1func i)
    (if (= i 1) 0
        (+ (/ 1 i) (a1func (- i 1)))))  
  `(define a1 ,(a1func (- n 1))))

或使用名为let

(define-macro (test n)
  `(define a1 ,(let a1func ((i (- n 1)))
                 (if (= i 1)
                     0
                     (+ (/ 1 i) (a1func (- i 1)))))))