我有一个移动程序,通过传递一对将合法移动应用于棋盘上的棋子:(cons source dest)所以(cons 1 2)从棋盘的位置1取一个棋子并将其移动到位置2。
我正在尝试制定一个应用它之前所做的相同动作的程序。我试着做
(move (reverse move)) 将通过 (cons 2 1) 从而将棋子向后移动。
不幸的是,反向对成对不起作用。我无法将其转换为列表,因为这将不得不更改大量代码以适应最后的空值。
有人能想到什么吗?顺便说一句,我正在使用 MIT 计划。
我有一个移动程序,通过传递一对将合法移动应用于棋盘上的棋子:(cons source dest)所以(cons 1 2)从棋盘的位置1取一个棋子并将其移动到位置2。
我正在尝试制定一个应用它之前所做的相同动作的程序。我试着做
(move (reverse move)) 将通过 (cons 2 1) 从而将棋子向后移动。
不幸的是,反向对成对不起作用。我无法将其转换为列表,因为这将不得不更改大量代码以适应最后的空值。
有人能想到什么吗?顺便说一句,我正在使用 MIT 计划。
您需要为此实现自己的reverse-pair
过程,它可以像这样简单:
(define (reverse-pair p)
(cons (cdr p) (car p)))
或者这个,有点花哨但可读性较差:
(define (reverse-pair p)
`(,(cdr p) . ,(car p)))
无论哪种方式,它都按预期工作:
(reverse-pair '(1 . 2))
=> '(2 . 1)
如果您将自己限制在成对的 `(a . b) 上,那么翻转它们就很容易了。像这样简单的东西
(define reverse-pair
(lambda (p)
(cons (cdr p) (car p))))
会做的。从您的上下文来看,我认为您不会处于您拥有'(1 2 3 4 . 5)
并且需要扭转这种情况的位置,因此您应该对上述情况没问题。
如果 reverse 函数对 pair 不起作用,那么编写你自己的 reverse-pair 函数。我不记得它的方案语法,但我认为你已经有了工具,因为你基本上需要知道如何从对中读取两个值(你已经在你的“移动”函数上做了一些事情)和那么如何基于该数据构建一个新的元组。
我不明白你为什么认为这会使事情复杂化太多。就新函数之外的代码而言,它看起来与您使用“反向”函数建议的原始版本相同。