Непредвиденная ошибка при использовании оператора cond - PullRequest
2 голосов
/ 10 июля 2019

Впервые на обычном шумихе и у него очень новичок.Моя функция одной переменной должна возвращать абсолютное значение введенной переменной.Это работает, когда переменная выше или равна 0, но не ниже, я подозреваю, что это связано с функцией cond, но я не уверен.

Я пробовал код с скобками и без, но не вижупочему это не удается.Я знаю, что это не лучший способ решения этой проблемы, но я просто пытаюсь привыкнуть к выражению cond на этом этапе.

     (defun abs-x (x)
       (cond ((> x 0) x)
             ((= x 0) 0)
             ((< x 0) (-x))))

Сообщение об ошибке при вводе переменной ниже 0 - '-Х не определено.

Ответы [ 2 ]

7 голосов
/ 10 июля 2019

Используйте

    (- x)
;     ^
;     |
;  The space
;  is important.

вместо (-x).

Это потому, что - является допустимым символом в идентификаторе, поэтому -x является допустимым именем функции. Однако с пробелом между - и x он вызывает функцию -, которая принимает один или несколько аргументов.

0 голосов
/ 13 июля 2019

Короче:

 (defun abs-x (x)
   (cond ((> x 0) x)
         (t (- x))))

Уменьшено количество проверок, поскольку (- 0) также оценивается как 0.

Вместо <= для последней проверки, используйтепроще t - else в общих предложениях lisp cond.

С if это будет:

(defun abs-x (x)
  (if (> x 0)
      x
      (- x)))
...