Схема применяется к списку, включающему элементы с цитатой

Я работаю над проектом схемы, и я столкнулся с проблемой с кавычками. Когда я использую (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)). поскольку + добавляет только цифры, вы получили сообщение об ошибке.

Если вы хотите читать числа из файла, то читайте их как числа, и все должно быть хорошо.

Другие вопросы по тегам