如何在序列中设置值?

时间:2016-04-28 13:21:12

标签: racket sequence

我试图在Racket中编写一个简单的tic tac toe游戏,并且无法弄清楚如何在序列中设置值。

我有以下2d字符序列:

(define playing-board '((#\- #\- #\-)
                        (#\- #\- #\-)
                        (#\- #\- #\-)))

这是我想要做的事情:

(let ([row (sequence-ref playing-board y)])
  (sequence-set? row x #\O)
)

现在考虑一下,即使确实有效,它也只会改变rowplaying-board

2 个答案:

答案 0 :(得分:1)

列表不能像在Racket中那样进行变异,因此您必须选择可以变异的数据结构,例如vector。例如:

Welcome to Racket v6.4.0.15.
-> (define playing-board (vector (vector #\- #\- #\-)
                                 (vector #\- #\- #\-)
                                 (vector #\- #\- #\-)))
-> (define x 0)
-> (define y 1)
-> (let ([row (vector-ref playing-board y)])
     (vector-set! row x #\O))
-> playing-board
'#(#(#\- #\- #\-) #(#\O #\- #\-) #(#\- #\- #\-))

或者,您可以改为返回一个新列表,而不是尝试将其变异。

答案 1 :(得分:1)

Asumu的回答当然是完全正确的。

但是,对于这个问题,我想我可能倾向于使用不可变的 从数字列表到单元格值的哈希值。这为您提供了便利的功能 更新并且可能更好地匹配你的直觉:

#lang racket

(define my-board
  (for/hash ([row (in-range 3)]
             [col (in-range 3)])
    (values (list row col) #\-)))

(hash-ref my-board (list 1 1)) ;; -> #\-
(define updated-board (hash-set my-board (list 1 1) #\X))
(hash-ref updated-board (list 1 1)) ;; -> #\X