Scheme 访问和更改使用“定义”创建的值`

Scheme 访问和更改使用“定义”创建的值`,scheme,racket,Scheme,Racket,我在做一个游戏,我有这个: (define b "black piece") (define w "white piece") (define (board) (lambda (matrix) (list ((b w b w b w b w) (w b w b w b w b) (b w b w b w b w) (w b w b w b w b) (b w b w b w b w)

我在做一个游戏,我有这个:

(define b "black piece") (define w "white piece")

(define (board)
 (lambda (matrix) 
   (list ((b w b w b w b w) 
          (w b w b w b w b) 
          (b w b w b w b w) 
          (w b w b w b w b) 
          (b w b w b w b w) 
          (w b w b w b w b) 
          (b w b w b w b w) 
          (w b w b w b w b)))))
board
制作一个包含8行8列黑白片的列表

如何访问和更改板的元素?如何使用递归实现过程矩阵?

首先注意几点:
(定义f(λ(x)l))


(定义(f x)l))

但是,您正在将它们与
(定义(板)(lambda(矩阵)l))

这与
(定义板(lambda()(lambda(矩阵)l))

区别很重要。我列出的前两个函数将f绑定到一个函数,该函数接受一个参数并返回l。我猜这就是你想做的。在第二个例子中,您将board绑定到一个函数,该函数不接受任何参数,并返回一个函数,该函数接受一个参数matrix(它似乎与matrix无关),然后返回一个l

第二期,
(列表((b w…)
将不起作用,因为它将尝试评估
(b w…)
。您需要在功能应用程序位置为电路板的每一行设置一个列表,如so
(list(list)(list b w…)(list w b…)
,以便您的代码能够编译

关于你的问题。包含在球拍/球座中,当您知道列表中的索引时,用于引用列表中的元素。
(列表参考2(列表“a”b“c”d))
将返回'c'。索引从0开始。由于您有一个列表列表,因此需要应用列表引用两次以检索“b”或“w”

至于改变它,你不能。从R6R开始,对(组成列表)是不可变的。在可能的情况下,推荐的做法是返回一个带有更改的新列表。您可以使用这个有点低效的
列表集版本
,它会在索引处返回一个包含新值的列表副本

(define (list-set lis idx val)
  (map (lambda (e i)
    (if (= i idx) val e))  
    lis  
    (iota (length lis))))
但是,在这种情况下,我建议切换到更适合当前任务的不同数据结构,因为您可能希望O(1)访问板中的元素。查看哪些行为与列表非常相似,但用于不断查找和更新。有一个内置的
向量ref
向量集操作,您应该使用它而不是我上面的函数

如果这是一个更大问题的一部分,并且您已经在任何地方使用列表,您可以使用
vector->list
list->vector
函数来回移动。此外,您可以使用,但不能使用

中提供的多维数组库更好,但这可能比您想要的更复杂

问题的第二部分是如何递归地构建董事会。这是一个使用地图的版本

(require (lib "1.ss" "srfi"))
(define (board)
  (map (lambda (x)
         (map (lambda (y)
                (if (odd? (+ x y)) b w))
              (iota 8)))
       (iota 8)))
这是一个递归版本

(define (board)
  (letrec ((board-helper
            (lambda (x)
          (if (eq? x 8) '()
          (cons (row-helper x 0) (board-helper (+ 1 x))))))
       (row-helper
        (lambda (x y)
          (if (eq? y 8) '()
          (cons (if (odd? (+ x y)) b w) (row-helper x (+ 1 y)))))))
    (board-helper 0)))

谢谢这正是我所需要的,两个版本,一个使用地图更有效?我想做一个科纳内游戏。。。。这是棋盘,接下来我要做一个自动电脑播放器。我对这个计划知之甚少,所以有点困难。嗯,你帮了我很多,主要是为了了解解决问题的方法。再次感谢,新年快乐!