Карта неправильно применяет функцию к списку списков

У меня возникли проблемы с использованием карты.

Я определяю бинарные деревья как списки, и у меня есть несколько функций для работы с ними. Я должен придумать несколько тестовых случаев, а затем запустить их. У меня есть несколько предопределенных деревьев. Однако, чтобы сэкономить время, я хочу запустить тестовые случаи как пакет с картой.

Например, у меня есть следующие деревья:

(define ctree0 '()) ;  0 nodes

(define ctree1 '("Apple" () ())) ; 1 node

(define ctree4 '("Candy" ("Artichoke" ("Apple" () ()) ()) ("Doughnut" () ()))) ; 4 nodes

У меня есть следующая функция:

(define empty?
  (lambda (t)
    (null? t)
    )
  )

Чтобы сэкономить время, я определил список списков:

(define ctrees '(ctree0 ctree1 ctree4))

а затем попытался запустить следующее:

(map empty? ctrees)

который произвел:

(#f #f #f)

Правильный результат должен быть (#t #f #f), и это то, что я получаю, когда проверяю их по отдельности).

Как я могу это исправить? Я пробовал играть с удалением передней кавычки, которая подавляла оценку, но тогда я, очевидно, получаю ошибки о том, что список не может быть оценен.


person Chris Chambers    schedule 20.10.2013    source источник


Ответы (1)


Чтобы сэкономить время, я определил список списков:

(define ctrees '(ctree0 ctree1 ctree4))

Вы этого не сделали; вы определили список из трех символов: ctree0, ctree1 и ctree4. Чтобы определить список списков, вы должны потерять кавычки:

(define ctrees (list ctree0 ctree1 ctree4))

После этого изменения (map empty? ctrees) выдает ожидаемый результат.

person user4815162342    schedule 20.10.2013
comment
Идеальный. Я знал, что есть что-то в отношении списков списков, чего я не понимал. Спасибо! - person Chris Chambers; 21.10.2013
comment
@ChrisChambers Другой способ написать это - использовать оператор обратной кавычки, который поддерживает выборочную оценку: (define ctrees `(,ctree0 ,ctree1 ,ctree4)) (обратите внимание на , перед символами, требующими оценки). - person user4815162342; 21.10.2013