На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > ;;Lisp programma !?? , Lisp
      Здравствуйте (или ВСЕМ ПРИВЕТ !!!), ВЫ могли-бы мне помочь в составлении программы и в разъяснении некоторых нюансов ?!?
      Всё по порядку:
      1. "Как бы сказать помягче ???": В какой реализации Lisp-a можно сделать данную ПРОГУ ??!?
      2. я приведу 3-и функции:
      ; ---------------------------- ;
      (DEFUN POSITION (LAMBDA (X LST)
      ; Функция POSITION возвращает положение атома X ;
      ; в одноуровневом списке LST (первый элемент имеет ;
      ; номер 1). Если элемента в списке нет, то функция ;
      ; возвращает 0 ;
      (COND ( (NULL LST) 0 )
      ( (EQ X (CAR LST)) 1 )
      ( (MEMBER X LST)
      (+ 1 (POSITION X (CDR LST))) )
      ( T 0 )
      )
      ))
      ; ----------------------- ;
      (DEFUN SORTING (LAMBDA (L)
      ; Сортировка неупорядоченного списка L ;
      (COND ( (NULL L) NIL )
      ( T (INSERT (CAR L) (SORTING (CDR L))) )
      )
      ))
      ; ----------------------- ;
      (DEFUN INSERT (LAMBDA (A L)
      ; Функция INSERT добавляет элемент A в упорядоченный ;
      ; список L так, чтобы сохранилась упорядоченность ;
      (COND ( (NULL L) (LIST A) )
      ( (< A (CAR L)) (CONS A L) )
      ( T (CONS (CAR L) (INSERT A (CDR L))) )
      )
      ))
      ; -------------------------- ;

      P.S.: Моя задача была сделать программу на LISP-е, которая бы выполняла поиск со всавкой.
      Скажите ПОЖАЛУЙСТА КАК эти функции соединить, чтобы реализовать эту прогу(или совмещать вместе их "Опасно для жизни")!?!?!
      Да и Если можно, приведите пожалуйста пример по вводимым входным данным.
      Потому что, когда я пытался сделать ПРОСТУЮ сортировку СПИСКА в Common LISP-е:
      ; -------------------------- ;
      (DEFUN SORTING (LAMBDA (L)
      ; Сортировка неупорядоченного списка L ;
      (COND ( (NULL L) NIL )
      ( T (INSERT (CAR L) (SORTING (CDR L))) )
      )
      ))
      ; -------------------------- ;
      (SORTING '(5 4 3 2 1 6))
      ; -------------------------- ;
      Он на меня ругался "CELL-ERROR,UNDEFINED FUNCTION и др."
      Но после того как устанавливал вместо "DEFUN" "DEFINE" "мата" становилось меньше.
      ПРОСВЕТИТЕ МЕНЯ КТО-НИБУДЬ!!!!
      ЗАРАНЕЕ БОЛЬШОЕ СПАСИБО!!!
        Тебе повезло парниша, попал ты куда надо. Я честно сказать еще "вчера" приходил сюда спрашивать по лиспу задачки. Нашлись добрые люди. Теперь настала моя очередь продолжить этот цикл, и надеюсь, что ты последуешь этой доброй традиции. Можешь кстати посмотреть мои задачки... "Ученая блоха" и "all-permutations" с заголовками Этот...Лисп.

        Вот решение твоей задачи такой какой я её понял, правда не понял
        Цитата CompilR @
        которая бы выполняла поиск со всавкой

        Что это значит?

        ExpandedWrap disabled
          (defun search (lst el inserter)
              (cond ((null lst) nil)
                    (t (search_r lst el inserter '()))
              )
          )
          (defun search_r (lst el inserter res)
              (cond ((null lst) (reverse res))
                    (t(search_r (cdr lst) el inserter (cons (car lst)
                                                            (cond ((equal (car lst) el) (cons inserter res))
                                                                  (t res)
                                                            )
                                                      )                              
                      )
                    )
              )
          )
          (defun ts()
              (search '(1 2 3 5) '3 '(4 1 2))
          )


        Работает это все в XLisp... Но у меня досовская, а такую врагу не пожелаешь..
        Ну, надеюсь на тесное сотрудничество...

        P. S. ты случаем не из ИжГТУ?

        Добавлено
        Кстати, тут есть хороший человек, Alexey Dejneka, он тут похоже ас по Лиспу, мне по двум задачкам помог, большое ему спасябо...
          В Common Lisp определение функции записывается так:

          ExpandedWrap disabled
            (DEFUN SORTING (L)
              ;; Сортировка неупорядоченного списка L
              (COND ((NULL L) NIL)
                    (T (INSERT (CAR L) (SORTING (CDR L))))))


          В Scheme можно писать примерно так, как Вы написали, но нужно сделать множество
          мелких изменений (s/defun/define/, s/null/null?/, s/t/#t/, s/nil/'()/ и т.д.)

          Еще две проблемы. В Common Lisp уже есть функция POSITION, и переопределять ее нежелательно. Назовите ее как-нибудь типа MY-POSITION. Также нельзя сравнивать числа на равенство с помощью EQ: пользуйтесь EQL. С этими изменениями программа работает.

          И, если компилятор сильно не постарается, POSITION будет работать квадратичное время от длины списка.
          Сообщение отредактировано: Alexey Dejneka -
            ЕЩЁ РАЗ (ВСЕМ) ЗДРАВСТВУЙТЕ!!!
            БОЛЬШОЕ СПАСИБО ВСЕМ КТО ОТКЛИКНУЛСЯ!!!!
            СПАСИБО ЗА ПРЕДОСТАВЛЕННУЮ мне ПОМОЩЬ !!!!!!
            /********************************************/
            Извените "конечно", но у меня по выше изложенному материалу появились некоторые вопросы.
            ВЫ могли-бы на них ответить???!?
            /********************************************/

            Вопросы:
            1.Скажите пожалуйста как задавать и выводить данные из функции....(в Ufasoft Common Lisp-е v3.2.7)
            Ну например:
            Если вернуться к сортировки неупорядоченного списка.
            ;;-----------------------------------------;;
            (DEFUN SORTING (L)
            ;; Сортировка неупорядоченного списка L
            (COND ((NULL L) NIL)
            (T (INSERT (CAR L) (SORTING (CDR L))))))
            ;;-----------------------------------------;;
            "как - бы я посоветовался со знающими людьми(в нашей группе по Лиспу)". Мне сказали, что выводить данные нужно с помощью (*PRINT*)
            Посмотрите пожалуйста, так ИЛИ НЕ ТАК нужно это делать:
            (PRINT(SORTING '(1 2 3 5 4))) //и в ответе машина напишет что-то вроде этого(1 2 3 4 5)?????
            %(ну т.е. как правильно записать запрос системе и самое главное получить на него ответ)
            P.S.
            Если ЭТО возможно, то поправте меня....
            2.Вот например из первого моего сообщения
            производится ПОИСК позиции "атома" "...(POSITION (X LST)",т.е существует 2-а положения
            1) когда он проверяет список и находит позицию
            2) и когда "атом" отстутсвует(он возвращает "nil")
            Можно-ли как-нибудь сделать, так чтобы после проверки списка и НЕнахождения позиции атома...
            Функция переходила-бы сразу к функции (INSERTION-вставки)
            Сделать как-нибудь ссылку или что-то в этом роде. ИЛИ чтобы не нагружаться сделать всё по порядку(я с точки зрения составления программы).
            ***************************
            Да. Кстати по поводу СОРТИРОВКИ: когда я применил данный способ записи *DEFUN SORTING (L)* вместо *(DEFUN SORTING(LAMBDA (L))* ПРОГА наконецтаки начала распознавать(DEFUN).
            Вот ещё попробывал данную структуру и уменя получилось(вместо DEFUN поставил DEFINE)
            /----------------------------------------/
            (define position(lambda (x lst)
            (cond((null lst) 0)
            ((eq x(car lst)) 1)
            (t(+ 1(position x(cdr lst))))))) // ну соответственно спросил(данный запрос подошёл)
            //*(PRINT(position 5 '(1 5 4 6 2 3)))*
            /----------------------------------------/
            В других случаях это не сработало...
            СПАСИБО ЗА ВНИМАНИЕ !!!!!
              Цитата
              Скажите пожалуйста как задавать и выводить данные из
              функции....


              Как правило, реализация CL включает в себя REPL -
              цикл "чтение-вычисление-печать". Так что Вы просто вводите
              выражение, система его считывает, вычисляет и распечатывает
              результат. Если Вам нужно получить не только конечный результат,
              но и, скажем, промежуточные данные, можно использовать PRINT или
              FORMAT.

              CL-USER> (sort (list 5 3 2 8 7) #'>)
              (8 7 5 3 2)
              CL-USER> (defun sorting (l)
              (format t "Processing ~S...~%" l)
              (cond ((null l) nil)
              (t (insert (car l) (sorting (cdr l))))))

              SORTING
              CL-USER> (sorting '(5 3 2 8 7))
              Processing (5 3 2 8 7)...
              Processing (3 2 8 7)...
              Processing (2 8 7)...
              Processing (8 7)...
              Processing (7)...
              Processing NIL...
              (2 3 5 7 8)

              (подчеркнут вводимый текст)

              Цитата
              (в Ufasoft Common Lisp-е v3.2.7)

              Запустил я Ufasoft Common Lisp...

              Вы знаете, язык Common Lisp - это стандарт, у которого существует
              множество реализаций. Для Windows я обычно рекомендую
              LispWorks (www.lispworks.com).

              Цитата
              Можно-ли как-нибудь сделать, так чтобы после проверки
              списка и НЕнахождения позиции атома... Функция переходила-бы
              сразу к функции (INSERTION-вставки)


              Ничего не понял. Какой результат Вы хотите получить? Функция,
              которая возвращает положение элемента в списке, если он есть, или
              обновленный список, если его нет?

              ExpandedWrap disabled
                (defun find-position-or-insert (item list)
                  (let ((position (position item list)))
                    (if position
                        position
                        (insert item list))))


              Цитата
              когда я применил данный способ записи *DEFUN SORTING (L)*
              вместо *(DEFUN SORTING(LAMBDA (L))* ПРОГА наконецтаки начала
              распознавать(DEFUN)


              Неудивительно.

              Цитата

              (define position(lambda (x lst)
              ...
              (PRINT (position 5 '(1 5 4 6 2 3)))


              Я не знаю, как Ufalisp относится к DEFINE, но повторяю еще раз:
              POSITION - это стандартная функция, которая уже есть в системе.
              Переопределять ее, тем более несовместимым образом (как Вы
              делаете), значит напрашиваться на большие неприятности. Если
              Ufalisp ваш DEFINE не понял и просто проигнорировал, то POSITION,
              естественно, продолжал работать как раньше. Кстати, та строка
              напечатала 1 (как полагается по стандарту) или 2 (как работает
              Ваш POSITION)?
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0274 ]   [ 15 queries used ]   [ Generated: 6.05.24, 14:35 GMT ]