2017-02-18 17 views
-2

Я думаю об этом. Как проверить строку одиночной кавычки в списке? (не строка двойной кавычки) Функция stringp, typecase и т. д.. Использует только двойные кавычки.lisp - одиночная строка цитаты в списке

Я хочу, чтобы make (f '((3 a) (2 b) (1 c))) должен был вернуть шесть. Нецелое число следует игнорировать.

Я пробовал этот код.

(defun f (lst) 
       (typecase lst 
       (integer (+ (f (first lst)) (f (rest lst)))) 
       (list 0)) 
      ) 

Мне нужно проверить строку с одним кадром в списке. Однако stringp, typecase он не работает, как я хочу.

что мне решить решить эту проблему?

+1

Это хорошее введение Лиспа: https://www.cs.cmu.edu/~dst/LispBook/ Он также объяснит символы и как их использовать. –

ответ

2

Когда вы пишете '((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 символ.