3

我有一个移动程序,通过传递一对将合法移动应用于棋盘上的棋子:(cons source dest)所以(cons 1 2)从棋盘的位置1取一个棋子并将其移动到位置2。

我正在尝试制定一个应用它之前所做的相同动作的程序。我试着做

(move (reverse move)) 将通过 (cons 2 1) 从而将棋子向后移动。

不幸的是,反向对成对不起作用。我无法将其转换为列表,因为这将不得不更改大量代码以适应最后的空值。

有人能想到什么吗?顺便说一句,我正在使用 MIT 计划。

4

3 回答 3

1

您需要为此实现自己的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)
于 2012-12-02T15:04:08.717 回答
0

如果您将自己限制在成对的 `(a . b) 上,那么翻转它们就很容易了。像这样简单的东西

(define reverse-pair
  (lambda (p)
    (cons (cdr p) (car p))))

会做的。从您的上下文来看,我认为您不会处于您拥有'(1 2 3 4 . 5)并且需要扭转这种情况的位置,因此您应该对上述情况没问题。

于 2012-12-02T14:00:33.863 回答
0

如果 reverse 函数对 pair 不起作用,那么编写你自己的 reverse-pair 函数。我不记得它的方案语法,但我认为你已经有了工具,因为你基本上需要知道如何从对中读取两个值(你已经在你的“移动”函数上做了一些事情)和那么如何基于该数据构建一个新的元组。

我不明白你为什么认为这会使事情复杂化太多。就新函数之外的代码而言,它看起来与您使用“反向”函数建议的原始版本相同。

于 2012-12-02T13:49:23.557 回答