Применение номера не допускается (Схема)

Я немного работаю с пакетом SCMUTILS, который реализует MIT SCHEME. Я запускаю его из Emacs, и у меня возникают проблемы при использовании функции, вы можете мне помочь?

Мой код:

(define ((((delta eta) f) q) t)
  (let ((fmas (f (+ q (* 0.001 eta))))
         (efe (f q)))
       (/ (- (fmas t) (efe t)) 0.001)))


(define ((G q) t)
       (dot-product (q t) (q t)))


(((((delta  test-path) G)  test-path) 5))

Где тестовый путь:

(define (test-path t)
 (up (+ (* 4 t) 7)
     (+ (* 3 t) 5)
     (+ (* 2 t) 1)))

И я получаю эту ошибку:

Loading "mecanica"...
;Application of a number not allowed 2501.2500000000273 (())

В чем может быть проблема?

Сначала я подумал, что эта схема не может разделить структуру типа test-path на число, поэтому я добавил скалярное произведение, чтобы сделать функцию, возвращающую число; но это не сработало.

Я попытался напечатать выражение в функции delta-eta, и при выполнении этой части возникает ошибка:

(/ (- (fmas t) (efe t)) 0.001)))

А если вычесть частное, ошибки нет.

Наверняка я что-то упускаю. Надеюсь, вы можете помочь. Спасибо!


person aramirezreyes    schedule 01.04.2015    source источник
comment
Я не могу заставить это работать самостоятельно в моей реализации схемы. Каково определение up, efe, dot-product и fmas? Ошибка проста. В какой-то момент вы делаете (some-var ...), где some-var преобразуется не в процедуру, а в число.   -  person Sylwester    schedule 02.04.2015
comment
test-path — это функция, но когда вы вызываете delta, ей присваиваются параметры eta и q, а затем вы их складываете и умножаете.   -  person angus    schedule 02.04.2015
comment
Я думал, что scmutils — это пакет, который нужно запускать внутри схемы MIT (не emacs) в Unix. , как часть книги SICMechanichs.   -  person Will Ness    schedule 02.04.2015
comment
@Sylwester Извините, ответ ниже показывает код яснее. Скалярное произведение и выше — это процедуры, включенные в пакет SCMUtils. Это пакет, предназначенный для работы с книгой «Структура и интерпретация классической механики».   -  person aramirezreyes    schedule 04.04.2015
comment
@WillNess scmutils может запускаться из emacs. См. мои комментарии в этом вопросе.   -  person xdavidliu    schedule 23.12.2019


Ответы (1)


Предположим, это

(define ((((delta eta) f) q) t)
  (let ((fmas (f (+ q (* 0.001 eta))))
         (efe (f q)))
       (/ (- (fmas t) (efe t)) 0.001)))

эквивалентно этому

(define (delta eta)
  (lambda (f)
    (lambda (q)
      (lambda (t)
        (let ((fmas (f (+ q (* 0.001 eta))))
              (efe (f q)))
          (/ (- (fmas t) (efe t)) 0.001))))))

Затем (((((delta test-path) G) test-path) 5)) умножает 0.001 и test-path на (* 0.001 eta). А также внутри G он ожидает q как процедуру, однако fmas извлекает процедуру из G, передавая число G. Таким образом, это попытается применить рассчитанное число, проходящее t.

person Takashi Kato    schedule 03.04.2015