2013-12-06 3 views
-1

Im просто изучая lisp, меня попросили написать функцию, называемую анализом, которая берет список и возвращает список, состоящий из символов «атом» и «список».Lisp проанализировать список атомов и списки

Например, (анализ «(аб (кд) эф)) должен возвращать (атом атом атом атом список)

Вот что я до сих пор:

(defun analyze(l)     


(and l 
(if (not(null (atom (first l)) 
    ) 
) 

'atom 'list 
) 
     (or (null (rest l)) 
      (analyze (rest l))) 
    ) 
) 

почему-то всегда возвращает T.

+3

Пожалуйста, форматировать код правильно. В настоящее время он не читается. –

+0

Плохое формирование обезвреживает все это, превращая его в хозяйственную работу. – Kaz

ответ

2

Я думаю, ваше намерение было что-то вроде этого:

(defun analyze (l)     
    (if l     ; if list is not empty 
    (cons    ; add 
    (if (atom (car l)) ; 1) a symbol describing the type of (car a) 
     'atom 
     'list) 
    (analyze (cdr l))))) ; 2) do the same with the rest of the list 

Ваш код, правильно отступом, выглядит следующим образом:

(defun analyze (l)     
    (and l 
     (if (not (null (atom (first l)))) 
     'atom 'list) 
     (or (null (rest l)) 
      (analyze (rest l))))) 

так что это and между

  1. л, список - правда, если список не пуст
  2. «атом или» список - как символы, как логически верно
  3. верно, если остальная часть списка пуст, или результат анализа (что всегда верно)

, поэтому он эквивалентен (и t t t ...), число t - количество элементов в вашем списке.

+1

Что будет 'undf' (не атом или список) в Lisp? –

+0

@RainerJoswig Согласовано и исправлено. Благодарю. – uselpa

0

Если у вас есть список и вы хотите создать новый список с тем же количеством элементов, где каждый элемент нового списка каким-то образом рассчитывается из соответствующего элемента в исходном списке, обычный способ - использовать какой-либо вид функции отображения.

Здесь mapcar - это правильная вещь в Common Lisp.

Различие между атом и список не является реальным дихотомии — «противоположен» из атома является против. Есть два толкования для упражнения:

  1. Предположим, что список призван означать все, что не является атомом. Обратите внимание, что nil (что совпадает с (), пустым списком) не является недостатком, а является атомом.

    (defun type-symbol (thing) 
        (if (atom thing) 
         'atom 
         'list)) 
    
  2. Предположим, что атом призван означать все, что не является списком. В этом случае nil будет производить list.

    (defun type-symbol* (thing) 
        (if (listp thing) 
         'list 
         'atom)) 
    

Чтобы использовать это с mapcar:

(defun analyze (list) 
    (mapcar #'type-symbol list)) 
Смежные вопросы