Vijay は、Scheme に最適なソリューションを提供します。ただし、リストを永続的に変更してこれを機能させたい場合はset-car!
、 andを使用する必要がありますset-cdr!
。これは Scheme では不自然であり、動作させるにはいくつかのハックが必要です:
最初に と を定義hand
しdeck
ます。
(define hand '(dummy))
(define deck '((2 C) (3 H) (K D)))
hand
変更する既存のリスト構造があるように、既存の要素から開始する必要があります。andを nil ( )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
また、何かを行う前に、それが空でないことを確認する必要があります。