Ваш код с правильным отступом выглядит так:
(define (divisible_or_not list-sum lst)
(if (odd? list-sum lst)
(lambda (list-sum lst)
(cond
((null? lst)
0)
((pair? (car lst))
(+(list-sum (car lst)) (list-sum (cdr lst)))
(else
(+ (car lst) (list-sum (cdr lst))))))
('divisible_by_2)
('not_divisible_by_2))))
Структура вашей программы выглядит следующим образом:
(if ...
(lambda (...) ...))
Другими словами, если ваш тест пройден успешно, вы возвращаете анонимную функцию, а если тест не пройден, вы ничего не возвращаете (в Схеме в этом случае значение не определено).
Внутри вашей лямбды код представляет собой список из трех выражений: cond
, формы ('divisible_by_2)
и формы ('not_divisible_by_2)
.
Прежде всего, не используйте подчеркивания для разделения слов в Лиспе / Схеме, используйте тире, например так: divisible-by-2
.
Во-вторых, из лямбды возвращается только значение последнего выражения, поэтому промежуточное значение cond
, поскольку оно не имеет побочных эффектов, в основном работает даром. Вторая форма, ('divisible_by_2)
, выглядит как вызов функции, но выдает ошибку. Если вы хотите вернуть символ, просто заключите его в кавычки без скобок: 'divisible-by-2
.
Поскольку у вас уже есть промежуточная функция, вы можете связать ее с именем:
(define tree-count (sum tree)
(cond ...))
Я назвал его tree-count
, потому что вы также вернетесь в car
ваших списков.
Если у вас есть эта функция, вам нужно только применить ее:
(if (even? (tree-count tree))
'divisible-by-2
'not-divisible-by-2)