Виджей имеет лучшее решение для Схемы. Однако, если вы действительно хотите сделать эту работу путем постоянного изменения списков, вам придется использовать set-car!
и set-cdr!
. Это не естественно в Scheme, и для его работы требуется несколько хаков:
Сначала определите hand
и deck
:
(define hand '(dummy))
(define deck '((2 C) (3 H) (K D)))
hand
должен начинаться с существующего элемента, чтобы иметь некоторую существующую структуру списка для изменения. Вы не можете использовать set-car!
и set-cdr!
с нулем ('()
).
Теперь напишите draw
:
(define (draw from to)
; push the top element of `from` onto `to`
(set-cdr! to (copy to))
(set-car! to (car from))
; pop the top element of `from` off
(set-car! deck (cadr deck))
(set-cdr! deck (cddr deck)))
; also we need to define copy
(define (copy l)
(map (lambda (x) x) l))
Это означает, что последний элемент вашей руки всегда будет пустышкой. Было бы лучше добавить проверку для начального регистра и перезаписать его вместо нажатия:
(define (draw from to)
; push the top element of `from` onto `to` (just overwrite the first time)
(when (pair? (cdr to))
(set-cdr! to (copy to)))
(set-car! to (car from))
; pop the top element of `from` off
(set-car! deck (cadr deck))
(set-cdr! deck (cddr deck)))
Также вы должны проверить, что from
не пусто, прежде чем что-либо делать.