Исходный код Lisp представлен некоторыми из тех же структур данных, которые используются в программировании Lisp. Особое значение здесь имеют списки и символы. Когда Лисп оценивает форму, которая имеет форму
(quote something)
, то есть, когда Лисп оценивает форму, которая представляет собой список и чей первый элемент является символом quote
, то он возвращает объект something
без оценки его , Таким образом
(quote 2) ;=> 2
(quote (a b c)) ;=> (a b c)
Теперь, это то, что оценщик (или компилятор, & с.), Когда они получают лисповским объект, чтобы оценить, что происходит, чтобы быть список, первый элемент является символом quote
. Как Lisp программисты, нам все еще нужно написать код для Lisp читатель читать и передавать экзалатору.Мы можем написать длинные формы
(quote 2)
(quote (a b c))
в нашем источнике, и Лиспа читатель будет читать их и передать их компилятором, но мы virtuous programmers, поэтому мы ленивы, и хотят, чтобы избежать некоторых печатать. Таким образом, мы можем ввести
'2
'(a b c)
вместо этого. Компилятор заканчивает получение точно такого же ввода; список, первым элементом которого является символ quote
, вторым значением которого является 2
или (a b c)
.
Теперь мы можем поговорить о вашем коде. Форма
(list 'quote x)
возвращает список, первый элемент которого символ quote
, а второй элемент является значением переменной x
. Это может быть напечатано в
(quote <value-of-x>) ; fill in x's value for <value-of-x>, of course
Теперь Лисп принтер немного умный, и имеет возможность полиграфических вещей, как, что, используя тот же сокращенное, что мы разрешили использовать, когда мы пишем источник , Так что же можно напечатать как
'<value-of-x>
Теперь мы получили достаточно, чтобы Ваш вопрос о коде книги:
Теперь, интересно, функция выше не возвращает список, но просто цитирует все, что я передаю. Так вот, если я называю это
(quote-it east)
было бы просто вернуть 'east
и не ('east)
С 'east
это аббревиатура для (quote east)
, теперь мы видим, что (quote-it east)
делает, по сути, возвращает список. И это список формы, которую вы ожидаете: список, первым элементом которого является символ quote
, вторым элементом которого является символ east
. Если у него было('east)
, он все равно вернул бы список, но он вернул бы список неправильной формы. ('east)
есть, когда мы расширим аббревиатуру, список ((quote east))
; то есть это список одного элемента, и этот элемент - это еще один список, первым элементом которого является символ quote
, вторым элементом которого является символ east
. Это, безусловно, список, но это не тот список, который вы искали.
Теперь мы можем взглянуть на ваш предлагаемый код. Ваша функция quote-it
только случайно срабатывает в случае, если вы звоните (quote-it 'x)
. То есть, вы можете сделать
(quote-it 'x)
;=> x
но обратите внимание, что вы получаете символ назад, и вы получаете символ x
назад. Вы являетесь не, получая список, первым элементом которого является символ quote
и вторым элементом которого является <value-of-x>
.При использовании quote-it
с другими значениями, вы увидите проблему:
(quote-it 2)
;=> x
Вы еще получить символ назад, потому что
(defun quote-it (x)
(quote x)) ; or 'x
принимает аргумент, связывает его с лексической переменной x
, а затем возвращает значение (quote x)
. Какая ценность (quote x)
? Как объяснялось ранее, когда оценщик (или компилятор, & c.) Получает список символов quote
и something
, значение представляет собой литерал something
. Так как тело quote-it
представляет собой список символов quote
и символ x
, значение тела quote-it
является символом x
.
Незначительная коррекция: '' east' - это то же самое, что '(quote east)'. –
@LarsBrinkhoff Это не незначительная коррекция; вот в чем суть ответа! –