我有一个移动过程,通过传递一个对:(cons source dest)来对棋盘上的棋子应用一个合法移动,因此(cons 1 2)会将棋盘上位置1的棋子移动到位置2。
我正在尝试创建一个过程,使其应用之前做过的相同移动。我尝试了
(move (reverse move)),这会传入(cons 2 1),从而将棋子移回原位。
不幸的是,reverse对对子不起作用。我不能将其转换为列表,因为这将不得不更改很多代码以适应末尾的null。
有人能想出什么办法吗?顺便说一下,我使用的是MIT Scheme。
回答:
你需要为此实现自己的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)