2016-04-28 71 views
0

我試圖在Racket中編寫一個簡單的tic tac腳趾遊戲,並且無法弄清楚如何在一個序列中設置一個值。如何設置序列中的值?

我有個字符的後續2D序列:

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

這裏就是我想要做的事:

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

現在想想,即使沒有工作,這將只更改rowplaying-board

回答

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

阿蘇姆的答案當然是完全正確的。

對於這個問題,我想我可能傾向於使用從數字列表到單元格值的不可變 散列。這給你一個方便的功能 更新,並可能更好地匹配你的直覺:

#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