Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Lisp
Перезагрузить страницу Написать функцию, осуществляющую замену элементов в списке W списка Y
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Lass Lass вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.04.2007
По умолчанию Написать функцию, осуществляющую замену элементов в списке W списка Y - 01.05.2007, 17:18

у меня такая задача "написать функцию, осуществляющую замену элементов в списке W списка Y на соответствующие элементы списка X. Напр: если Y=(a b), X=(1 2), W=((a b) a (c d)) то функция возвращает список ((1 2) a (c d))" Нашла вроде такое решение:
(DEFUN SUBSTRING2 (LAMBDA (OLD NEW LST)
; Функция возвращает выражение, являющееся результатом ;
; замены всех вхождений OLD на NEW в LST (на какой бы ;
; глубине они не находились) ;
(COND ( (EQUAL OLD LST) NEW )
( (ATOM LST) LST )
( T (CONS (SUBSTRING2 OLD NEW (CAR LST))
(SUBSTRING2 OLD NEW (CDR LST))) )
)
))

Мне надо это все дело на классическом лиспе, вот я не знаю в классическом лиспе можно ли использовать lambda и equal? Lambda вроде точно нельзя, помогите переделать задачку на классический лисп, буду очень признательна....
Ответить с цитированием
  (#2 (permalink)) Старый
Alexey Dejneka Alexey Dejneka вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2004
По умолчанию 01.05.2007, 17:45

В "классическом" Лиспе может не быть DEFUN, но не LAMBDA; в Вашем примере, скорее всего, просто неправильный синтаксис - обычно DEFUN сам вписывает LAMBDA. EQUAL можно определить самостоятельно.
Код:
(defun my-equal (tree1 tree2)
  (cond ((atom tree1)
         (eql tree1 tree2))
        ((atom tree2)
         nil)
        ((my-equal (car tree1) (car tree2))
         (my-equal (cdr tree1) (cdr tree2)))
        (t
         nil)))

(defun substring2 (old new tree)
 ;; Функция возвращает выражение, являющееся результатом
 ;; замены всех поддеревьев OLD на NEW в TREE
  (cond ((my-equal old tree) new)
        ((atom tree) tree)
        (t (cons (substring2 old new (car tree))
                 (substring2 old new (cdr tree))))))
В MY-EQUAL можно заменить EQL на EQ, если ее нет в Вашей реализации (они отличаются только для чисел и знаков).
Ответить с цитированием
  (#3 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 01.05.2007, 18:29

Есть и диалект, в котором именно
(defun имя (lambda (аргументы) тело))
Ответить с цитированием
  (#4 (permalink)) Старый
Lass Lass вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.04.2007
По умолчанию 01.05.2007, 22:09

спасибо вам большое, то, что требовалось!)) вопрос решен
Ответить с цитированием
  (#5 (permalink)) Старый
Lass Lass вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.04.2007
По умолчанию 06.05.2007, 21:54

еще про классический лисп, задача: вывести минимальный элемент списка, если список пустой или в нем встречаются символы - вывести сообщение об ошибке
Решение:

Код:
;вспомогательные функции
;----------------------- Удаление символов ------------------------
(defun del_sym (L)
  (cond
    ((null L) L)
    ((atom (car L))
         (cond
        ( (numberp (car L))  (cons (car L) (del_sym (cdr L))) ); Оставляем числа 
        ( t               (del_sym (cdr L)) )                ; Отрываем символы
      ))
    (t (cons (del_sym (car L)) (del_sym (cdr L))) )
 ))
;----------------------- Удаление подсписков --------------------
(defun del_sub (L)
(cond 
((null L) nil)
((atom (car L)) (append (list (car L)) (del_sub (cdr L))))
(t (del_sub (cdr L)))))
;----------------------- Минимальный элемент в одноуровневом списке--

(defun minp (L)
(cond 
((null L) nil)
((null (cdr L)) (car L))
((< (car L) (minp (cdr L))) (car L))
(t (minp (cdr L)))))


;---------------------------------------------------
(defun min (L)
(setq L1 (del_sym L))
(setq L2 (del_sub L1))
(if (and (/= (length L) 0) (= (length L) (length L2)))
 (progn (setq L3 (minp L)) (princ "Минимальный элемент списка ")(princ L3)(princ) )
 (princ "Список не удовлетворяет условию")))


вот надо этот if заменить на cond и вроде progn не входит в классический лисп, помогите переделать, у меня опять ниче не получается(((
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
_sg _sg вне форума
Member
 
Аватар для _sg
 
Сообщений: 525
Сказал(а) спасибо: 5
Поблагодарили 42 раз(а) в 38 сообщениях
Регистрация: 23.01.2007
По умолчанию 06.05.2007, 22:25

Цитата:
вот надо этот if заменить на cond и вроде progn не входит в классический лисп, помогите переделать
(if (= 2 2) (+ 2 2) (- 2 2))
4
(cond ((= 2 2) (+ 2 2)) ((- 2 2)))
4
(cond ((= 2 2) (princ "min ") (princ "elt")) ((princ "bad")))
min elt
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Напишите функцию (drop L N), которая удаляет N элементов с конца списка L balbec Lisp 9 29.05.2011 18:12
Написать функцию для возвращения массива из элементов annie С/С++ 1 16.01.2011 04:41
Написать программу преобразования списка которая реверсирует n элементов списка Ma3day Prolog 4 14.11.2010 14:07
Написать функцию, формирующую два списка imported_Андрюша Lisp 2 19.10.2010 21:36
Написать функцию удаляющию из списка данные petrovich_495 Lisp 19 03.04.2008 21:22
Необходимо написать функцию для нахождения глубины списка ff-uu Lisp 2 24.03.2008 21:23
Написать функцию которая меняет порядок элементов в списке Alexandr_14 Lisp 5 17.01.2008 13:36
Написать функцию, ищущую минимум в заданном списке списков Zanoza Lisp 4 08.05.2007 21:56
Среди элементов списка выбрать тот, который встречается в списке imported_Pill Lisp 9 19.04.2007 19:12
Написать функцию, удаляющую из исходного списка подсписки K@trin Lisp 10 19.03.2007 17:58
Описать функцию, которая вычитает из элементов списка заданное число costa Lisp 4 18.11.2006 21:09
Написать функцию для подсчета длины списка Glider Lisp 1 19.03.2006 06:39



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов