ошибка lisp: "должно быть лямбда-выражение" - PullRequest
0 голосов
/ 10 июля 2020

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

 (defun new (vi n res)(
(cond ( (= vi nil) ((cond ((= 0 res) t) )))
 (    (= 2 n) (new (cdr vi) 1 (* (car vi) 4)) ) 
      ((= 1 n) (new (cdr vi) 0 (+ (res) (* (car vi) 2)) ))  
      ((= 0 n) (new (cdr vi) -1 (+ (res) (car vi ))  ))
       ((= vi nil) (nil))
      ((= -1 n) (new (cdr vi) -1 (- res (car vi)) )) )))

но у него есть эта ошибка: (COND ((= VI NIL) ((COND ((= 0 RES) T)))) ((= 2 N) (NEW (CDR VI) 1 (* (CAR VI) 4))) ((= 1 N) (NEW (CDR VI) 0 (+ (RES) (* (CAR VI) 2)))) ((= 0 N) (NEW (CDR VI) -1 (+ (RES) (CAR VI)))) ((= VI NIL) (NIL)) ((= -1 N) (NEW (CDR VI) -1 (- RES (CAR VI))))) должно быть лямбда-выражением

1 Ответ

1 голос
/ 10 июля 2020

Вы помещаете дополнительные () вокруг cond, что заставляет lisp думать, что он должен быть вызываемым, удаление лишних () решит проблему.

 (defun new (vi n res)
    (cond ((= vi nil) (cond ((= 0 res) t) ))
          ((= 2 n) (new (cdr vi) 1 (* (car vi) 4))) 
          ((= 1 n) (new (cdr vi) 0 (+ (res) (* (car vi) 2))))  
          ((= 0 n) (new (cdr vi) -1 (+ (res) (car vi ))))
          ((= vi nil) (nil))
          ((= -1 n) (new (cdr vi) -1 (- res (car vi))))))
...