> 1 <
Автор | Сообщение |
diver92
3 сообщений |
#5592 2012-01-25 16:33 GMT+3 часа(ов) |
Доброго времени суток!
Есть у меня такое задание: Дан список произвольной структуры, каждый атом встречается по одному разу. Написать функцию, которая для каждого атома определяет его уровень вложенности и строит соответствующий список: (A ((B) C)) —> ((A 1) (B 3) (C 2)) Собственно, проблема в том, чтобы правильно построить функцию. Как ни старался, дошел вот только до этого: (DEFUN ATD (LST) ( loop for i in LST collect (LIST (FINDATOM i) (DEPTH i)) ) ) (DEFUN DEPTH (X) (COND ( (atom X) 0 ) ( T ( (lambda (e1 e2) (if (> e1 e2) e1 e2) ) ( 1+ (DEPTH (car X) ) ) (DEPTH (cdr X) ) ) ) ) ) (DEFUN FINDATOM (LST) (COND ( (atom LST) LST ) ( T (FINDATOM (car LST)) ) ) ) Но, как уже ясно, это работает неправильно. Нужна помощь. |
|
bokunopico![]()
54 сообщений |
#5593 2012-01-25 17:31 GMT+3 часа(ов) |
(defun f (lst &optional (n 0)) |
|
diver92
3 сообщений |
#5594 2012-01-25 17:52 GMT+3 часа(ов) |
Цитата Большое спасибо! А что такое &optional (n 0) ? Это таким образом обозначаются необязательные параметры? И что значит выражение `((,lst ,n)) ? |
|
bokunopico![]()
54 сообщений |
#5595 2012-01-25 18:01 GMT+3 часа(ов) |
> Это таким образом обозначаются необязательные параметры?
Да. > И что значит выражение `((,lst ,n)) Можно заменить на (list (list lst n)), но вариант выше короче. ![]() CL-USER> (setf c 3) |
|
> 1 <