Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите в лиспе! / 6 сообщений из 6, страница 1 из 1
22.11.2012, 23:18
    #38049676
SavaMargo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите в лиспе!
Помогите, пожалуйста!
Так могу функцию написать, а с помощью функционалов не получается(((

Напишите функцию, удаляющую повторные вхождения элементов в список
> (del_rep_list '(1 2 2 3 4 4 4 5))
(1 2 3 4 5)

Фильтр, выделяющий из заданного списка элементы заданного типа (числа, строки, атомы...)
> (fltr 'numberp '(1 a 2 3 'bc (1 2)))
(1 2 3)
...
Рейтинг: 0 / 0
23.11.2012, 01:45
    #38049772
Selznn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите в лиспе!
SavaMargo,

SelznnНапишите функцию, удаляющую повторные вхождения элементов в список
Делал что-то похожее для лабы, длинный код, правда, но работает, делал так:

;Delete all elements in lst (except the first) which are equal to the first one.
;Ex (3 nil 3 3 1 3 1 2 nil) -> (3 nil 1 1 2 nil)
(defun del_rep_el (lst)
(cond
((null lst) nil)
((equal (length lst) 1) lst)
(t (del_rep_el_helpf (list (car lst)) (cdr lst)))
)
)

;help function for del_rep_el function
(defun del_rep_el_helpf (left right)
(let
((right (del_frst_eq_ord right)))
(cond
((null right) left)
((and
(equal (car left) (car right))
(equal (length right) 1))
left)
((equal (car left) (car right))
(del_rep_el_helpf
(append left (list (cadr right)))
(cddr right)
)
)
(t
(del_rep_el_helpf
(append left (list (car right)))
(cdr right)
)
)
)
)
)

;Delete first equal ordered elements saving only the one of these in lst
;Ex: (3 3 3 2 3 3 2 1) -> (3 2 3 3 2 1)
(defun del_frst_eq_ord (lst)
(cond
((null lst) nil)
((equal (length lst) 1) lst)
((equal (car lst) (cadr lst)) (del_frst_eq_ord (cdr lst)))
(t lst)
)
)

;Functional executes fn on lst and appends the car of result with
;executing oneself on the cdr of result
(defun mymap (fn lst)
(setq res (funcall fn lst))
(cond
((null lst) nil)
(t (append
(list (car res))
(mymap fn (cdr res))
)
)
)
)


Синтаксис тут не подсвечивается, так что за оформление извините.
...
Рейтинг: 0 / 0
23.11.2012, 10:53
    #38050073
Abstraction
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите в лиспе!
А нельзя проще? Для первого задания - взять список и его же, сдвинутый на 1 элемент, как-то так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
(defun phase-diff lst slst acc
  (cond (null slst)
    (append acc (car lst))
    ((cond (equal (car lst) (car slst))
      (phase-diff (cdr lst) (cdr slst) acc)
      (phase-diff (cdr lst) (crd slst) (append acc (car lst)))
    )
  ) 
)

(defun del_rep_list lst
  (phase-diff lst (cdr lst) ())
)

Для второго, собственно, надо только написать предикат, дальше проблем не вижу.
...
Рейтинг: 0 / 0
23.11.2012, 12:31
    #38050288
k0rvin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите в лиспе!
Интересно какое окружение у автора.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
(defun del-rep-list (list)
  (if (null list)
      nil
    (let ((x  (car list))
          (xs (cdr list)))
      (cons x (del-rep-list (remove x xs))))))

(defun del-rep-list-2 (list)
  (do ((result nil))
      ((null list) (nreverse result))
    (destructuring-bind (x &rest xs) list
      (push x result)
      (setf list (remove x xs)))))

(defun del-rep-list-3 (xs)
  (let ((table  (make-hash-table))
        (result  nil))
    (dolist (x xs)
      (setf (gethash x table) x))
    (maphash #'(lambda (key value)
                 (push key result))
             table)
    (nreverse result)))
...
Рейтинг: 0 / 0
23.11.2012, 12:33
    #38050294
k0rvin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите в лиспе!
AbstractionДля второго, собственно, надо только написать предикат, дальше проблем не вижу.

Предикат писать не надо, надо написать функцию-фильтр.
...
Рейтинг: 0 / 0
24.11.2012, 12:22
    #38051575
Mozok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите в лиспе!
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите в лиспе! / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]