Использование Lisp: определите функцию, которая принимает список и число и возвращает true, если число присутствует в списке - PullRequest
0 голосов
/ 27 февраля 2019

Я новичок в lisp и у меня проблема, я пытаюсь найти номер в списке, но он не работает.Я еще не сделал оператор return

(defun num (x 'y)
    (if (member x '(y)) 't nil))

(write (num 10 '(5 10 15 20)))

Мой вывод просто выводит nil вместо выполнения функции, и я запутался в том, что я делаю неправильно.

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

От вас почти наверняка ожидают не просто использовать member, но и написать функцию, которая делает то, что вам нужно (очевидно, в реальной жизни вы просто используете member, потому что это то, для чего она нужна).

Так.Чтобы узнать, есть ли объект в списке:

  • , если список пуст, это не так;
  • , если заголовок списка равен объекту;
  • в противном случае он находится в списке, если он находится в конце списка.

И вы превращаете это в функцию очень просто:

(defun num-in-list-p (n l)
  ;; is N in L: N is assumed to be a number, L a list of numbers
  (cond ((null l)
         nil)
        ((= n (first l))
         t)
        (t
         (num-in-list-p n (rest l)))))
0 голосов
/ 28 февраля 2019

Вы можете использовать встроенную функцию положения, которая будет возвращать индекс числа, если оно есть в списке:

(position 1 '(5 4 3 2 1))

Если вы хотите определить свою собственную функцию:

CL-USER> (defun our-member(obj lst)
   (if(zerop (length lst))
      nil
      (if(equal(car lst)obj)
      T
     (our-member obj (cdr lst)))))
OUR-MEMBER
CL-USER> (our-member 1 '(5 4 3 2 1))
T
CL-USER> (our-member 99 '(1 2 3 4 5))
NIL

Мы можем создать функцию под названием «наш член», которая будет принимать объект (в вашем случае число) и список (в вашем случае список чисел) в качестве аргумента.В этой ситуации наш «базовый случай» будет состоять в том, равна ли длина списка нулю или нет.Если это так, и мы до сих пор не нашли соответствия, мы вернем ноль.В противном случае мы проверим, равна ли машина списка (первый элемент в списке) объекту, который мы передали.Если это так, мы вернем T (true).Однако, если это не так, мы будем снова вызывать функцию, передавая объект и cdr списка (все, что находится за машиной списка), снова до тех пор, пока в списке не останется элементов.Как видите, первый пример вызова этой функции возвращает T, а второй пример вызова возвращает NIL.

Что делает эту полезную функцию хорошим примером, так это то, что она, по сути, показывает вам, как работает функция-член, и что происходит внутри.

0 голосов
/ 27 февраля 2019

Решение

(defun member-p (element list)
  "Return T if the object is present in the list"
  (not (null (member element list))))

Шаблон not / null эквивалентен (if (member element list) t nil), но более распространен.

На самом деле вам не нужна эта отдельная функция, member достаточно хорош.

Суффикс -p обозначает предикат , ср.integerp и upper-case-p.

Ваш код

  1. Вы не можете цитировать лямбда-список элементов,поэтому вам нужно заменить defun num (x 'y) на defun num (x y)
  2. Вам не нужно указывать t
  3. Цитировать '(y) не имеет смысла, заменить его на y.
  4. Вам не нужно write вызова функции, REPL сделает это за вас.

См. Также

...