Как я могу использовать результаты списка для дальнейших расчетов - PullRequest
1 голос
/ 27 марта 2019

как новичок в шутке, я застрял с общей проблемой: я хочу запросить данные, сгенерировать сумму по ним и рассчитать дальнейшие результаты с этими результатами.

Например, я суммирую 33 77 и хочу поделить результат:

(defun sum (L)
  (reduce '+ L))
(/ 999 (sum '(33 77)))

Без дивизии я получаю правильную сумму. Когда я пытаюсь продолжить, я получаю сообщение об ошибке, что числовая функция получила аргумент.

Тип запроса (type-of '(sum '(33 77))) говорит, что это CONS

Как правильно обрабатывать результаты для дальнейшего расчета?

1 Ответ

2 голосов
/ 27 марта 2019
(type-of '(sum '(33 77)))

Оценка вышеизложенного состоит вначале в оценке '(sum '(33 77)) и вызове функции type-of с результатом оценки.

'(sum '(33 77)) - это то же самое, что и (quote (sum (quote (33 77)))), за исключением того, что апостроф представляет собой синтаксис читателя ', который превращает последующее, скажем x, в (quote x).

Форма quote является самооценочной, то есть значение, к которому она относится, является точным значением, которое было указано, здесь (sum '(33 77)).

Это значение представляет собой данные, представляющие код: оно буквально представляет собой список, построенный во время чтения, который содержит символ sum, за которым следует другой элемент, список, первым элементом которого является quote, за которым следует другой список, содержащий 33 и 77, буквальные числа.

Поскольку значением вашего выражения является список, а списки построены с помощью цепочек cons-ячеек, обычно type-of возвращает cons.

Если вы удалите один уровень цитат:

(type-of (sum '(33 77)))

Затем оценка (sum '(33 77)) следует обычной оценке вызовов функций, сначала оценивая аргумент '(33 77), список литералов и вызывая sum с ним. Ваша функция возвращает сумму 110, и это значение, которое дается при вызове type-of. В этом случае вы должны получить числовой тип.

...