我正在尝试使用 Racket 为二十一点游戏制作一整副扑克牌。但是,我有两个问题:
当我使用以下代码时
;This function creates a list of all the card faces. (define faces '(2 3 4 5 6 7 8 9 10 J Q K A)) ;This function creates a list of all card suits. (define suits '(Clubs Diamonds Hearts Spades)) ;make-deck: Creates a new (unshuffled) 52 card deck ; Returns: The deck (a list of cards) ; Parameters: none (define make-deck (letrec ([pair-items (lambda (x y) (cond [(null? x) '()] [(null? y) '()] [(displayln (cons (car x) (cons (car y) (pair-items x (cdr y)))))] ))]) (pair-items faces suits)) )
我明白了
(2 Spades) (2 Hearts . #<void>) (2 Diamonds . #<void>) (2 Clubs . #<void>)
我不知道问题是什么。
我不知道如何重置以将函数
iterator
中的下一个元素faces
与整个函数配对suits
。我用吗let
?
最简单的方法是使用
cartesian-product
来生成卡片列表(您也可以使用for*/list
来迭代faces
和suits
列表以获得相同的效果)。两者均如下所示:您的代码的一个大问题是使用
(cond ... [(displayln ...)])
.displayln
总是返回一个void 值,因为它不是#f
,所以在 a 中总是被视为 truecond
。如果没有cond-clause的test-body部分,真正的test-expr返回的就是计算结果,所以这就是您要添加到函数正在打印的列表中的内容(但不返回)。您可能应该首先将数据的显示与数据的创建分开。cond