Схема применяется к списку, включающему элементы с цитатой
Я работаю над проектом схемы, и я столкнулся с проблемой с кавычками. Когда я использую (apply + '(1 2 '3)), ракетка выдает ошибку, с другой стороны (+ 1 2 '3) работает нормально. В какой-то момент в проекте мне нужно иметь возможность сделать что-то вроде (apply + '(1 2 '3)), так как я беру значения из данного файла и у меня нет свободы использования (+ 1 2 '3), Я попытался написать функцию добавления, которая добавляет все значения в список, но она тоже не сработала. Как я могу решить эту проблему? Благодарю.
2 ответа
'x
это сокращение от (quote x)
, В ранних выпусках это был макрос для читателя, а сегодня некоторые процедуры печати (quote x)
как 'x
для удобства. Даже если принтер решит распечатать его как сокращенное наименование, он по-прежнему представляет собой список из двух элементов, поэтому (car ''x)
является quote
,
(+ '1 '2 '3)
работает нормально, потому что все аргументы оцениваются. +
оценивается по процедурному объекту #<+>
(просто процедурное представление реализации глобальной переменной +
), '1
оценивает его данные, число 1
и так далее. В конце концов применение процедуры происходит по аргументам (1 2 3)
, Числа самооценки, так что если вы не цитировали их 1
оценили бы до 1 и так далее, и вы получите тот же результат. Не все значения самооценки.
С (apply + '(1 2 3))
все 3 аргумента получают оценку. apply
а также +
как для процедурных объектов и '(1 2 3)
к списку (1 2 3)
, Процедура #<+>
применяется с аргументами (1 2 3)
С (apply + '(1 2 '3))
все 3 аргумента оцениваются. apply
а также +
как для процедурных объектов и '(1 2 '3)
к списку (1 2 (quote 3))
, Оценщик смотрит только на внешнюю цитату, поэтому 3
все еще цитируется, и теперь это часть данных. Процедура #<+>
применяется с аргументами (1 2 (quote 3))
, Это не будет работать с #<+>
умеет только добавлять номера, а не списки. Можно ожидать нарушения договора, ошибки какого-то рода.
При оценке результатом являются данные. Если у вас есть больше кавычек, кроме внешней, это уже не команда языка, а список с символом quote
и второе значение. Это не обрабатывается специально, как цитаты.
Проблема здесь заключается в значении цитаты '
, Выражение "означает" произвести значение, которое печатается как ".
Например '3
производит значение 3, так как значение 3 печатается как 3.
В '(1 b)
Вы получаете список, первый элемент которого является номером 1, а второй элемент - символом b.
Теперь вам нужно знать еще одну вещь о цитате. Цитата читательская аббревиатура. когда '<something>
читается, читатель выдает форму (quote <something>). This means that
'(1 ' б)produces the list
(1 (цитата б)). This is a list whose second element is the list
(цитата б), where
цитата - это символ кавычки.
В вашем примере вы пытались (apply + '(1 2 '3))
, Значение произведено '(1 2 '3)
это список (1 2 (цитата 3)). поскольку +
добавляет только цифры, вы получили сообщение об ошибке.
Если вы хотите читать числа из файла, то читайте их как числа, и все должно быть хорошо.