Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
6 / 6 / 4
Регистрация: 09.11.2011
Сообщений: 126
1

Для чего нужен такой синтаксис?

03.08.2019, 21:18. Показов 1738. Ответов 2

Здравствуйте.

Читаю книгу - Грэм. Ansi Common lisp

Задача - "Что делает следующая функция?", глава 2, задача 5
Lisp
1
2
3
4
5
6
7
(defun mystery (obj lst)
  (if (null lst)
      nil
      (if (eql (car lst) obj)
          0
          (let ((index (mystery obj (cdr lst))))
            (and index (+ index 1))))))
Мне непонятно, зачем в строке 7 and, без and работает прекрасно?


Что делает функция ясно - возвращает индекс искомого элемента в списке.
PS.
Я поменял синтаксис, в оригинале используются в качестве аргументов и переменных (x y z)
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.08.2019, 21:18
Ответы с готовыми решениями:

Чего Английский такой нудный, нафиг он нужен такой синтаксис?
Вот, у них конкурсы проходят в школах, кто знает как писАть слово. Их имена уже достали со своим...

Для чего нужен var и что такое сложный синтаксис?
Для чего нужен var и что такое сложный синтаксис?

Такой вопрос для чего нужен этот C# Express что на ном можно написать...
Visual C# 2005 Express Edition ~431 МБ (452 135 268 байт) :bravo:...

Для чего делать ТАКОЙ объем видеопамяти при ТАКОЙ разрядности?
Не понимаю, зачем нужно 4 гига пямяти при разрядности шины в 128 бит? (например GForce 550 GTX...

2
4509 / 4217 / 356
Регистрация: 12.05.2012
Сообщений: 2,967
04.08.2019, 08:00 2
Лучший ответ Сообщение было отмечено gnuvse как решение

Решение

(and index ...) — проверка на то, что элемент в списке есть, и из глубины рекурсии будет возвращен 0, к которому мы сможем на каждом шаге прибавлять 1 (... (+ index 1)).

без этой проверки при отсутствии элемента функция вернет ошибку:
Lisp
1
2
1+: NIL is not a NUMBER
   [Condition of type SIMPLE-TYPE-ERROR]
в качестве варианта:
Lisp
1
2
3
4
5
6
7
8
9
(defun index (a w)
  (when w (if (eql (car w) a) 0
              (let ((z (index a (cdr w))))
                (and z (1+ z))))))
 
> (index 7 '(0 1 2 3 4 5))
NIL
> (index 3 '(0 1 2 3 4 5))
3
без проверки:
Lisp
1
2
3
4
5
6
7
8
(defun index (a w)
  (when w (if (eql (car w) a) 0
              (1+ (index a (cdr w))))))
 
> (index 3 '(0 1 2 3 4 5))
3
> (index 7 '(0 1 2 3 4 5))
; Evaluation aborted on #<TYPE-ERROR expected-type: NUMBER datum: NIL>.
Lisp
1
2
3
4
5
6
The value
  NIL
is not of type
  NUMBER
when binding SB-KERNEL::X
  Condition of type TYPE-ERROR
2
Модератор
Эксперт Python
28592 / 15456 / 3053
Регистрация: 12.02.2012
Сообщений: 25,338
Записей в блоге: 4
04.08.2019, 17:46 3
Цитата Сообщение от gnuvse Посмотреть сообщение
без and работает прекрасно?
- на первый взгляд - да. Но приглядимся внимательнее:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(defun mystery (obj lst)
  (if (null lst)
      nil
      (if (eql (car lst) obj) 0  (+ 1 (mystery obj (cdr lst))))))
 
==> MYSTERY
 
(mystery 'e '(q w z e a))
==> 3         ;; все прекрасно (пока элемент есть в списке)
 
(mystery 'u '(q w z e a)) ;; а если нет - беда
 
PLUS: Один из аргументов (NIL) имеет нечисловой тип
 
==> ERRSTATE
Производится попытка прибавить 1 к Nil...

Спасти ситуацию можно так:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
(defun mystery (obj lst &optional (pos 0))
  (cond ((null lst) nil)
        ((eql (car lst) obj) pos)
        (t (mystery obj (cdr lst) (+ pos 1)))))
 
==> MYSTERY
 
(mystery 'u '(q w z e a))
==> NIL
 
(mystery 'e '(q w z e a))
==> 3
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.08.2019, 17:46

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Для чего нужен Seed() и для чего его override?
Привет, ребята. Прочитал много разных статей про Seed(). И так и не могу понять зачем он нужен на...

Для чего такой кабель? usb-ethernet
Имеется такой кабель, для чего его можно приспособить?

Для чего используется сопротивление в такой схеме?
Добра! неоднократно видел, чтобы резистор ставился в разрыв линии между контроллерами (выделено...

Для чего такой ноутбук, с такими характеристиками?
Здравствуйте. Я в поисках ноутбука и вот остановился на ASUS N76VJ....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.