0

我正在阅读一本关于编程语言的教科书,其中一个练习是在 Scheme 中创建一个函数来翻转列表中的元组。这是我的代码:

; invert : Listof(List(Int,Int)) -> Listof(List(Int,int))
; usage: (invert '((a 1) (a 2) (1 b) (2 b))) -> ((1 a) (2 a) (b 1) (b 2))
(define invert
  (lambda (lst)
    (if (null? lst)
      '()
      (cons
        (flip (car lst))
        (invert (cdr lst))))))
; flip : List(Int,Int) -> List(Int,int)
; usage: (flip '(a 1)) -> (1 a)
(define flip
  (lambda (tuple)
    (if (not (eqv? (length (tuple)) 2))
      (eopl:error 'flip
        "Tuple is not length 2~%")
      (cons (cdr tuple) (car tuple)))))

我尝试在 chez-scheme 中测试我的程序。当我在用法注释中使用测试用例时,出现此错误:Exception: attempt to apply non-procedure (a 1). 我以前从未使用过 Scheme,所以我非常感谢任何帮助和建议。谢谢!

4

1 回答 1

2

您有一些错误flip,这应该可以解决它们:

(define flip
  (lambda (tuple)
    (if (not (= (length tuple) 2))
        (eopl:error 'flip "Tuple is not length 2~%")
        (list (cadr tuple) (car tuple)))))

尤其是:

  • 报告的具体错误是因为这个表达式:(tuple). 我们不能用 包围变量()除非它们是我们打算调用的过程。
  • 我们应该=用于比较数字,而不是eqv?.
  • 在这个表达式中:(cons (cdr tuple) (car tuple))有两个问题,用于构建我们使用的两个元素的列表list,而不是cons。对于访问我们使用的第二个元素,而cadr不是cdr- 您应该阅读一些关于如何使用cons和用于构建列表的信息。carcdr

请注意,如果我们使用map;有一个更简单的方法来解决这个问题。为简单起见,我将跳过错误检查:

(define (invert lst)
  (map (lambda (tuple) (list (cadr tuple) (car tuple)))
       lst))
于 2019-11-10T18:33:51.910 回答