Ваша программа имеет много несоответствий.
Во-первых, аргумент функции должен быть списком целых чисел, но иногда вы используете его как список списков, например, когда пишете:
(abs (first (rest (first list-of-int)))))
на самом деле (first list-of-int)
должен возвращать целое число (первый элемент списка), но затем вы применяете к нему rest
, который является оператором, примененным к непустому списку, возвращает список без первогоэлемент.И это является причиной сообщения об ошибке («остальные ожидают непустой список, но получил 1»).
Если вы хотите второй элемент списка, вы можете сделать (first (rest list))
, или, лучше(second list)
.Это основные операторы языка.
Во-вторых, во второй ветви cond
вы проверяете, является ли первый элемент списка числом, но эта проверка не повторяется в третьемветвь, даже если вы используете как первый, так и второй элемент в качестве чисел.Таким образом, тест бесполезен, поскольку он применяется только в определенных случаях к определенным элементам списка.Вы должны применять ко всем или ни к одному из элементов, чтобы быть последовательными.
В-третьих, в последней ветви cond, в последних двух строках, вы снова проверяете, пустой ли список, но на этом этапесписка программ, конечно, не пустой, так как вы протестировали по крайней мере два элемента!
Вот возможное решение (без проверки, являются ли все элементы числами):
(define (spiraling? list-of-int)
(if (or (empty? list-of-int) (empty? (rest list-of-int)))
true
(let ((first-element (first list-of-int))
(second-element (second list-of-int)))
(if (or (< first-element 0 second-element)
(> first-element 0 second-element))
(spiraling? (rest list-of-int))
false))))