Лисп, добавь новый список в db в цикле "for", зачем возвращать NIL? - PullRequest
4 голосов
/ 22 января 2012

Интересно, как я могу напечатать в LISP каждое новое значение из цикла "for" в новом списке, который каждый раз создает путем вызова функции.

Я создал функцию:

(defun make (id name surname) (list :id id :name name :surname surname) )

Здесь я создал глобальную переменную:

(defvar *db* nil)

И здесь я определил функцию добавления каждого нового значения для сохранения его в БД:

(defun add (cd) (push cd *db*))

Итак, я могу добавлять все новые данные в БД, вот так:

(add (make 0 "Oleg" "Orlov" ) )

Чтобы посмотреть содержимое моей БД, я могу использовать:

*db*

Итак, мне интересно, как поместить каждый новый список записей в db с помощью цикла "for", я печатаю значения в цикле "for" в lisp следующим образом:

 (loop for i from 1 to 10 do ( ... ))

Если я использую:

 (loop for i from 0 to 10 do (add (make i "Oleg" "Orlov") ) )

Если вы прочитаете db с помощью *db*, вы увидите, что все записи evelen были добавлены, но после вызова последней строки вы получите результат NIL в ответ.

Почемупоймать результат NIL, а не T и что это значит?

Спасибо, с наилучшими пожеланиями!

1 Ответ

5 голосов
/ 22 января 2012

Каждая форма в Лиспе оценивает что-то.

Если форма, которую вы вводите, не возвращает значение, она по умолчанию оценивается как NIL (в противном случае она оценивается как значение (я))это возвращается).Ваш цикл на самом деле не возвращает само значение;он просто выполняет 10 присваиваний (каждое из промежуточных выражений возвращает значение, но вы не собираете и не возвращаете их).Следовательно, этот код вернет NIL.

. Если вы еще этого не сделали, ознакомьтесь с главой 3 Практического общего лиспа , в которой Питер Сейбел шаг за шагом шаг за шагом.через создание простой базы данных.Это может дать вам некоторое представление об основах работы Lisp.На конкретный вопрос, который вы задаете (почему формы возвращают NIL по умолчанию и что это означает конкретно в контексте Common Lisp), дан ответ в главе 2 той же книги

Что касаетсякак вы бы явно заставили ваш loop выдавать список элементов, добавленных в *db*, попробуйте следующее

(loop for i from 1 to 10
      for elem = (make i "Oleg" "Orlov")
      do (add elem)
      collect elem)
...