список в списке учебника по LISP - PullRequest
0 голосов
/ 10 июня 2019

Я читаю Программирование в Emacs Lisp

Here is another list, this time with a list inside of it:

     '(this list has (a list inside of it))

Я запутался с вложенным списком, почему у него нет префикса, заключенного в кавычки как

 '(this list has  '(a list inside of it))

если у него нет префикса `, почему он не анализирует a как функцию?

Ответы [ 2 ]

4 голосов
/ 10 июня 2019

's-expression является сокращением для (quote s-expression): все, что находится внутри s-выражения , считается датумом и не оценивается.

Итак,

'(this list has (a list inside of it))

- это аббревиатура:

(quote (this list has (a list inside of it)))

, которая содержит следующий список:

(this list has (a list inside of it))

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

Это легко проверить, написав:

'(this list has '(a list inside of it))

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

(this list has (quote (a list inside of it)))
2 голосов
/ 10 июня 2019

Это одна из небольших трудностей в Лиспе: список - это данные, а также может быть программой. Если вы хотите, чтобы список был данными в программе на Лиспе, вам нужно заключить его в кавычки.

Списки как таковые: их можно прочитать с помощью READ

(this list has (a list inside of it))
(this list has no list inside of it)
(+ 1 2)
(1 2 +)
(1 + 2)
(quote (this list has (a list inside of it)))
(quote (this list has (quote (a quote list inside of it))))
(quote quote)

Действительные формы Lisp: их можно оценить с помощью EVAL

(+ 1 2)
Evaluates to -> 3

(quote (+ 1 2))
Evaluates to -> (+ 1 2)

(quote (this list has (a list inside of it)))
Evaluates to -> (this list has (a list inside of it))

(quote quote)
Evaluates to -> quote

Это также допустимая форма Lisp:

(quote (this list has (quote (a quoted list inside of it))))

Оценивается:

(this list has (quote (a quoted list inside of it)))
...