Я нуб в Racket, и я пытаюсь понять, как печатать элементы одного списка по вертикали, таким образом:
(печать '(1 2 3 4))
1
2
3
4
Т
Я пытаюсь с if и cond, таким образом:
(define (delete x lst)
(cond [(member x lst)(append(reverse(rest(member x(reverse lst))))(rest(member x lst)))]
[else "Error"]
))
(define (printv lst)
(cond [(< 0 (length lst)) ((printf "~a ~%" (first lst))(printv (delete (first lst) lst)))]
[else "T"]))
Но я получил эту ошибку в тот момент, когда список становится пустым
application: not a procedure;
expected a procedure that can be applied to arguments
given: #<void>
arguments...:
Помощь приветствуется
Чем вы, это работает :), но у вас есть идеи, почему я получаю сообщение об ошибке при достижении '() в моем коде?
Без понятия. Я недостаточно долго смотрел на ваш код, чтобы попытаться понять, что он делает.
Вы должны использовать встроенные процедуры, чтобы сделать вашу жизнь проще. И почему вы хотите удалить элементы? просто перебрать список. Попробуй это:
(define (printv lst)
(for-each displayln lst)
(displayln "T"))
Спасибо!, я не знаю функцию "для каждого"
Просто удаление лишних скобок устраняет вашу проблему:
(define (printv lst)
(cond [(< 0 (length lst))
(printf "~a ~%" (first lst))
(printv (delete (first lst) lst))]
[else "T"]))
Некоторые подсказки:
Выполнение length
на каждой итерации делает вашу функцию экспоненциальной. Например. удвоение списка для отображения квадратов времени, которое требуется. Лучший способ проверить, пуст ли список, — использовать (empty? lst)
Как вы получаете rest
списка, используя delete
, пожалуй, самое сложное, что я видел. Поскольку вы знаете, что удаляете первый элемент, вы можете просто заменить его на (rest lst)
.
Просто печать с переводом строки имеет функцию: displayln
Все вместе:
(define (printv lst)
(cond [(empty? lst) "T"]
[else
(displayln (first lst))
(printv (rest lst))]))
Версия чистой схемы:
(define (printv lst)
(cond [(null? lst) "T"]
[else
(display (car lst))
(newline)
(printv (cdr lst))]))
(begin (for-each (lambda (elem) (display elem) (newline)) lst) (display #\T) (newline))
?