Схема - приложение: не ошибка процедуры

Я кодирую функцию в схеме, но получаю сообщение об ошибке «приложение: не процедура; ожидается, что процедура может быть применена к аргументам». Я предполагаю, что неправильно использовал условные операторы:

(define find-allocations
  (lambda (n l)
    (if (null? l)
        '()
        (cons ((if (<=(get-property (car l) 'capacity) n)
               (cons (car l) (find-allocations (- n (get-property (car l) 'capacity)) (cdr l)))
               '()))
          (if (<=(get-property (car l) 'capacity) n)
              (cons (car l) (find-allocations (n (cdr l))))
              '())))))

Если кто-то может указать на мою ошибку, это будет очень признательно.


person user3352349    schedule 29.10.2014    source источник
comment
возможный дубликат Приложение не является процедурой (процедура сопоставления схемы)   -  person uselpa    schedule 29.10.2014
comment
возможный дубликат application: не процедура в бинарных арифметических процедурах   -  person Joshua Taylor    schedule 29.10.2014
comment
Это не показывает больших усилий по исследованию; поиск в Google по запросу site:stackoverflow.com "application: not a procedure" выдает множество результатов на Stack Overflow, и все они касаются неуместных скобок. Поиск точных сообщений об ошибках является хорошей практикой. Кроме того, разве редактор Racket не выделяет где проблема, как показано в дубликате, на который я ссылаюсь?   -  person Joshua Taylor    schedule 29.10.2014


Ответы (1)


Попробуй это:

(define find-allocations
  (lambda (n l)
    (if (null? l)
        '()
        (cons (if (<= (get-property (car l) 'capacity) n)
                  (cons (car l) (find-allocations (- n (get-property (car l) 'capacity)) (cdr l)))
                  '())
              (if (<= (get-property (car l) 'capacity) n)
                  (cons (car l) (find-allocations n (cdr l)))
                  '())))))

Очень распространенная ошибка при изучении Scheme: писать ненужные скобки! Помните: в схеме пара () означает приложение функции, поэтому, когда вы пишете что-то вроде этого: (f), схема пытается применить f, как если бы это была процедура, в вашем коде у вас была пара мест, где это происходило:

((if (<=(get-property (car l) 'capacity) n) ; see the extra, wrong ( at the beginning

(find-allocations (n (cdr l)))) ; n is not a function, that ( is also mistaken
person Óscar López    schedule 29.10.2014
comment
Простой вопрос удаления скобок, который все еще очень ценится. - person user3352349; 29.10.2014
comment
@user3352349 user3352349 да :) но важно, чтобы вы понимали, почему они были неуместны! - person Óscar López; 29.10.2014