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

发布于 2024-10-14 11:14:42 字数 362 浏览 0 评论 0原文

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

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

如果你给它说 (test 10) 错误将是:

过程应用:预期过程,给定:#;参数为:9

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

The beginning of one of my programs results in an error. This is the problem area. I am trying to define a variable as the result of a recursive function.

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

if you were to give it say (test 10) the error would be:

procedure application: expected procedure, given: #<undefined>; arguments were: 9

I assumed this could be done in Scheme?? ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

深白境迁sunset 2024-10-21 11:14:42

在纯 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)))

In pure FP languages computations are done passing parameters to functions, which return some values as a result. You could bind the result of test in the function which called 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))

Variables usually bound once and cannot be changed. A function must return the value, a result of expression, but (define a1 (a1func(- n 1))) is rather a definition, not an expression, so the correct code would be:

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

And since defining variable and immediate returning it is meaningless, a more correct code would be:

(define (test n)
  (define (a1func i)
    (if (= i 1) 0
        (+(/ 1 i) (a1func(- i 1))))) 
  (a1func(- n 1)))
宫墨修音 2024-10-21 11:14:42

如果你的方案实现支持 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)))))))

If your scheme implementation support lisp macros then you can write this:

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

or using named let

(define-macro (test n)
  `(define a1 ,(let a1func ((i (- n 1)))
                 (if (= i 1)
                     0
                     (+ (/ 1 i) (a1func (- i 1)))))))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文