Когда вы пишете '((3 a) (2 b) (1 c))
, есть no string: ни одна кавычная строка (в Lisp отсутствует такая вещь), ни строк с двумя кавычками. У вас есть это значение:
(quote ((3 a) (2 b) (1 c)))
QUOTE
является специальным оператором, который предотвращает оценку своего подчиненным. То, что внутри цитаты, является литералом, постоянными данными, которые читаются, но не оцениваются.
Здесь у вас есть список списков, каждый из которых содержит числа в первом положении, и символа в качестве второго элемента. В частности, нет строки.
Символ - это объект, который имеет имя (строку). Каждое появление того же символа x
относится к тому же объекту . Здесь ниже, все x
указывает на тот же символ:
((3 x) (2 x) (1 x))
В вашем коде, вам нужно только проверить, существует ли целое и использовать ноль что-нибудь еще: поплавки, струны, символы, векторы, hash- таблицы, примеры Клоса, ....
большая проблема в вашем коде, что вы проверить, если переменная list
(плохое имя, так как вы не уверены, если это список) является целое, но то вы начинаете принимать первые и rest этого целого: что гарантировано потерпеть неудачу!
(defun f (form)
(typecase form
;; cons cell: recurse
(cons (+ (f (first form))
(f (rest form))))
;; integer: form is the value
(integer form)
;; anything else: zero
(t 0)))
Если ваши данные всегда следовать той же схеме (список пар с одним номером, один символ), вы можете просто перебирать каждую пару и просуммировать номер:
(loop for (number symbol) in list sum number)
1. В том же package, если вы не unintern символ.
Это хорошее введение Лиспа: https://www.cs.cmu.edu/~dst/LispBook/ Он также объяснит символы и как их использовать. –