Почему возвращается ошибка: несвязанный символ, почему я запускаю алгоритм сравнения массивов? - PullRequest
0 голосов
/ 28 мая 2019

Учитывая список списков, в котором первый элемент списка является именем, а остальные элементы являются целыми числами, я пытаюсь построить алгоритм, который сравнивает сходство двух подсписков путем суммирования разницы междуэлементы в каждой позиции в списке.Я использую оператор let в этом алгоритме, и когда я пытаюсь его запустить, возвращается следующая ошибка:

Ошибка: выполнить: несвязанный символ: "arr2" [похожи-массивы,(скоро)]

Почему это происходит?

Код:

(define (get-list name arr)
  (if (eq? name (car (car arr)))
      (cdr (car arr))
      (get-list name (cdr arr))))
(define (similarity-arrays name1 name2 arrs result)
  (let ((arr1 (get-list name1 arrs))
       ((arr2 (get-list name2 arrs))))
        (if (= (length arr1)(length arr2))
          (let ((x1 (car arr1))
                (x2 (car arr2)))
                  (if (= 0 (length arr1))
                    result
                    (similarity-arrays
                      (cdr arr1)
                      (cdr arr2)
                      (+ result (- (car arr1)(car arr2))))))
          #f)))
(define dust
  (list (list 'akko 11 3 7 5 4 1 9 8 10 6 2)
        (list 'Alex 9 7 11 3 6 1 5 4 10 2 8)
        (list 'Aron 11 4 1 2 6 3 7 9 8 10 5)
        (list 'carter 7 3 8 2 5 4 11 9 10 6 1)
        (list 'Connery 10 2 6 4 5 1 7 3 9 11 8)
        (list 'Embryo 11 8 9 6 7 4 2 3 1 10 5)
        (list 'Jaycee 9 1 11 7 10 8 4 2 5 6 3)
        (list 'jeeelm 11 8 5 2 1 6 7 3 9 10 4)
        (list 'Jodast 10 7 4 6 5 1 11 9 8 3 2)
        (list 'KingDolphin 11 4 7 2 6 3 5 9 8 10 1)
        (list 'Knowledge 11 8 2 9 3 1 5 6 4 10 7)
        (list 'ruben 11 1 6 4 7 3 9 5 8 10 2)
        (list 'SickLizard 11 6 7 2 8 3 9 10 5 4 1)
        (list 'XIN 11 3 4 1 8 5 7 9 6 10 2)
        (list 'ZIPF 10 7 11 5 9 3 6 2 4 8 1)))

(similarity-arrays 'Jodast 'Akko dust 0)

Ответы [ 2 ]

4 голосов
/ 28 мая 2019

Одна вещь, которую вам нужно улучшить, это отступ вашего кода. Если код имеет правильные отступы, легче обнаружить синтаксические ошибки. Если ваш код выглядит следующим образом, значит, у вас проблема с отступом.

(define (similarity-arrays name1 name2 arrs result)
  (let ((arr1 (get-list name1 arrs))
       ((arr2 (get-list name2 arrs))))       ; <- wrong indentation, wrong syntax
        (if (= (length arr1)(length arr2))
          (let ((x1 (car arr1))
                (x2 (car arr2)))
                  (if (= 0 (length arr1))    ; <- wrong indentation
                    result
                    (similarity-arrays
                      (cdr arr1)
                      (cdr arr2)
                      (+ result (- (car arr1)(car arr2))))))
          #f)))

Это будет правильно код с отступом:

(define (similarity-arrays name1 name2 arrs result)
  (let ((arr1 (get-list name1 arrs))
        ((arr2 (get-list name2 arrs))))      ; <- wrong syntax
    (if (= (length arr1) (length arr2))
        (let ((x1 (car arr1))
              (x2 (car arr2)))
          (if (= 0 (length arr1))
              result
              (similarity-arrays
               (cdr arr1)
               (cdr arr2)
               (+ result (- (car arr1) (car arr2))))))
        #f)))

Лучше всего не код отступа вручную -> используйте редактор / IDE для этого.

3 голосов
/ 28 мая 2019

Правильный синтаксис let:

(let ([binding expression]
      [binding2 expression2]
      ...)
  body ...)

Если бы вы правильно отформатировали его, вы бы увидели, что вместо binding2 у вас есть (arr2 (get-list name2 arrs)) без выражения.Сообщение об ошибке указывает на отсутствие привязки arr2.Поэтому я правильно отформатирую ваш код:

(define (similarity-arrays name1 name2 arrs result)
  (let ([arr1 (get-list name1 arrs)]
        [(arr2 (get-list name2 arrs))])
    (if (= (length arr1)(length arr2))
        (let ([x1 (car arr1)]
              [x2 (car arr2)])
          (if (= 0 (length arr1))
              result
              (similarity-arrays
               (cdr arr1)
               (cdr arr2)
               (+ result (- (car arr1)(car arr2))))))
        #f)))

Теперь от R6RS нет различия между () и [].Они имеют в виду то же самое.Разница лишь в том, что ошибки легче обнаружить.Вы заметили это?

Во многих реализациях я уверен, что вы получите ошибки во время компиляции.Например.Racket пометил это как неправильный синтаксис перед запуском, просто нажав «проверить синтаксис».

...