2015-04-01 2 views
1

Я немного работаю с пакетом 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))) 

И если я достаю фактор- часть, нет никакой ошибки.

Наверняка у меня что-то не хватает. Надеюсь, ты поможешь. Благодаря!

+0

Я не могу заставить это работать на своем собственном в моей реализации Схемы. Каково определение 'up',' efe', 'dot-product' и' fmas'? Ошибка проста. В какой-то момент вы выполняете '(some-var ...)' где 'some-var' не разрешается процедуре, а скорее число. – Sylwester

+0

'test-path' - это функция, но когда вы вызываете' delta', он присваивается параметрам 'eta' и' q', а затем вы добавляете и умножаете их. – angus

+0

Я думал, что [scmutils] (https://www.google.com/?q=scmutils) - это пакет, который должен быть запущен внутри схемы MIT (а не emacs) в Unix, как часть книги SICMechanichs. –

ответ

0

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

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

+0

Это упростило структуру для меня, спасибо! – ARamirez

Смежные вопросы