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