Схема - определить переменную как результат функции? - PullRequest
0 голосов
/ 26 января 2011

Начало одной из моих программ приводит к ошибке.Это проблемная зона.Я пытаюсь определить переменную как результат рекурсивной функции.

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

, если вы дадите ей, скажем, (test 10) ошибка будет:

применение процедуры: ожидаемая процедура, учитывая: #<undefined>;аргументы были: 9

Я предполагал, что это можно сделать на схеме ??идеи?

Ответы [ 2 ]

1 голос
/ 26 января 2011

В чистых языках 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)))
0 голосов
/ 29 января 2011

Если ваша реализация схемы поддерживает макросы 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)))))))
...