Схема бинарного дерева поиска ошибок (R5RS)

Я совершенно новичок в Схеме и функциональных языках в целом. Я пытаюсь создать двоичное дерево поиска. Формат узла представляет собой список из трех элементов, первый из которых представляет собой значение в узле, второй - левый дочерний узел, а третий - правый дочерний узел. У меня есть функция "make", которая создает пустое дерево: ( () () ()). У меня также есть функция вставки. Вот код:

;Inserts a number into the tree
(define (insert t x)
  (cond ((null? (car t))
      (list x (make) (make)))
      ((< x (car t))
       ((list (car t) ((insert (cadr t)  x)) (caddr t))))
      ((> x (car t))
       ((list (car t) (cadr t) ((insert (caddr t) x)) )))

  )
)

;Makes a new empty tree
(define (make)
  (list (list) (list) (list))
)

Чтобы проверить это, я запускаю следующие строки:

> (define b1 (make))
> (define b2 (insert b1 1))
> b2
(1 (() () ()) (() () ()))
> (define b3 (insert b2 2))

Затем я получаю следующую ошибку:

application: not a procedure;
expected a procedure that can be applied to arguments
given: (2 (() () ()) (() () ()))
arguments...: [none]

Я проверил и перепроверил мои скобки... и запустив его в режиме отладки, я вижу, что он заканчивается неудачей в конце вставки 2 в дерево. Пока все работает как запланировано. Это причина глупой синтаксической / логической ошибки с моей стороны?

1 ответ

Решение
((list (car t) ((insert (cadr t)  x)) (caddr t)))

Внешняя пара скобок - проблема здесь. (list (car t) ((insert (cadr t) x)) (caddr t)) дает вам список. Обернув вокруг него еще пару скобок, вы пытаетесь применить этот список, как если бы он был функцией, которую вы не можете - таким образом, появляется сообщение об ошибке.

Другие вопросы по тегам