# 1 # не является символом или лямбда-выражением - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь создать алгоритм Евклида в LISP.Мой код:

(defun euklid( x y)
   (cond
     ((= x y) x)
     ((> x y) (euklid((- x y) y)))
     )

Я получаю ошибку In the form (#1=(- X Y) Y), #1# is not a symbol or lambda expression. Как я могу исправить эту ошибку?Я знаю, что ошибка в моем коде.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

В формуле вашей функции вы забыли один важный факт, что в вашем коде порядок входов важен.

Этот код делает порядок ввода несоответствующим:

;; correct version:

(defun euklid (x y)
  (let ((x (max x y))
        (y (min x y)))
    (cond
      ((= x y) x)
      ((> x y) (euklid (- x y) y)))))

ПервыйЯ исправил:

(defun euklid (x y)
   (cond
     ((= x y) x)
     ((> x y) (euklid (- x y) y))))

Но я понял, что порядок входов связан с этой функцией:

(euklid 3 9)
;; returns NIL!

(euklid 9 3)
;; returns 3

Привязки min / max к y, x, соответственно, делает порядок вашего ввода неуместным, и я думаю, что такое поведение требуется от функции, как euklid, не так ли?

0 голосов
/ 29 мая 2018

Переменные считывателя

Синтаксис #1=... ( sharpsign-equal ) означает, что ваша среда Lisp связывает любые данные, представленные ..., спеременная читателя номер 1. Синтаксис #1# ( sharpsign-sharpsign ) ссылается на данные, которые ранее были связаны с той же переменной читателя.

Таким образом, ваш LispОкружающая среда говорит, что форма (- X Y) не является символом или лямбда-выражением, но делает это с помощью переменной считывателя, которая указывает на подвыражение, содержащее ошибки в вашей функции.

Не символ или лямбда-выражение

При нормальных правилах оценки (без специального оператора, без части макроса) список, подобный (f x y ...), является вызовом функции, где f - вызываемая функция, а x, y, ... являются аргументами.Единственными возможными значениями, которые могут отображаться как f, являются символы, как в (mod 10 3), или буквенные лямбда-выражения, как в ((lambda (x y) (mod x y)) 10 3).Если вам нужно во время выполнения определить, какие функции вызываются, используйте funcall (например, (funcall (alexandria:compose #'/ #'+) 10 20)).

Здесь вы ввели (- X Y), который не является ни символом, ни лямбда-выражением.Вам нужно написать вместо:

(euklid (- X Y) Y)
...