Виджай имеет лучшее решение для схемы. Однако, если вы действительно хотите, чтобы эта работа была изменена, вам необходимо будет использовать set-car!
и set-cdr!
. Это не естественно, на схеме, и требует несколько хаков, чтобы заставить его работать:
Сначала определим hand
и deck
:
(define hand '(dummy))
(define deck '((2 C) (3 H) (K D)))
hand
должен начать работу с существующим элементом так, что у него есть существующий список структуру для изменения. Вы не можете использовать set-car!
и set-cdr!
с nil ('()
).
Теперь напишите 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
не пуста, прежде чем делать что-либо.