найти положение списка с помощью Lisp - PullRequest
0 голосов
/ 13 марта 2020

Не используя MEMBER, завершите следующее определение рекурсивной функции POS так, чтобы, если L был списком, а E - элементом L, то (POS EL) возвращает позицию первого вхождения E в L, но если L является списком, и E не является элементом L, тогда (POS EL) возвращает 0.

(DEFUN POS (E L)
  (COND ((ENDP L) ... )
        ((EQUAL E (CAR L)) ... )
        (T (LET ((X (POS E (CDR L))))
                ))))

, то есть мой код

(defun pos (E L)   
  (cond ((endp L)  0)                                                                               
        ((equal e (car L))  1)                                                                      
        (T (let ((x   (pos E (cdr L))))                                                         
             (if (zerop x) x                                                                    
               (+ x 1))))) 

Я пытаюсь проверить кодировку с помощью

(POS '(A B) '((K) (3 R C) A (A B) (K L L) (A B))) => 4

но он дает мне ответ 4 и выдает ошибку *** -

READ from # #>: объект не может начинаться с # \)

Я не знаю, что такое # \

1 Ответ

0 голосов
/ 13 марта 2020
(defun pos (el l &optional (acc 1))
  (cond ((null l) 0)
        ((equal el (car l)) acc)
        (t (pos el (cdr l) (1+ acc)))))
...