Ошибка схемы говорит «попытка применить не-процедуру» при переключении кортежей в списке - PullRequest
0 голосов
/ 10 ноября 2019

Я работаю над учебником по языкам программирования, и одним из упражнений было создание функции в 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-схеме. Когда я использую тестовый пример в комментарии об использовании, я получаю эту ошибку: Exception: attempt to apply non-procedure (a 1). Я никогда раньше не работал со Scheme, поэтому буду очень признателен за любую помощь и совет. Спасибо!

1 Ответ

2 голосов
/ 10 ноября 2019

У вас есть несколько ошибок в 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, car и cdr используются для построения списков.

Обратите внимание, что есть более простой способ решить эту проблему, если мы используем map;Для простоты я пропущу проверку ошибок:

(define (invert lst)
  (map (lambda (tuple) (list (cadr tuple) (car tuple)))
       lst))
...