Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LISP > Где_ошибка


Автор: camakob 25.2.2009, 13:32
Здравствуйте, товарищи !
В первый раз в жизни столкнулся с XLISP. Нашел в сети маленькую программку, запускаю на выполнение, она не работает. Подскажите в чем дело.

Определите функцию, которая меняет местами первый и последний эле-менты списка, оставляя остальные на своих местах.

(defun swap-first-last (list)
  (let ((copy (copy-list list)))
    (rotatef (car copy) (car (last copy)))
    copy))

Ругается на copy-list. 

Автор: kosmonaFFFt 25.2.2009, 13:52
Видимо нету такой функции в xlisp, только что проверил на sbcl - прекрасно работает.
Я бы сделал так:
Код

(defun swap-first-last (list)
           (let ((first-element (first list))
                 (last-element (first (last list)))
                 (last-list (last list)))
             (progn
               (rplaca last-list first-element)
               (rplaca list last-element))))

но эта функция изменяет переданный ей список...

Автор: camakob 25.2.2009, 18:26
Спасибо за ответ, но в helpe функция есть:

Copy-list

Syntax : (copy-list <list>)

Copy the top level of a list. In file common.lsp
    <list>        the list

Returns : a copy of the list (new cons cells in top level)

Добавлено через 12 минут и 20 секунд
И если не сложно, еще одна маленькая задача:
Определите функцию (summa_digits n), результатом которой является сум-ма цифр натурального числа n.

Для  цифр, заданных списком, я нашел программку в книге "Мир Лиспа"(Хювенен, Сеппянен), а вот для цифр натурального числа мозгов не хватает, точнее мозгов хватает, но мозги пытаются программировать как в Паскале, но как говорят в Одессе, тут две большие разницы, то есть до недавнего времени я не подозревал, что есть такие языки программирования, все с ног на голову. 

Автор: VH_ 25.2.2009, 21:15
Действительно, в Help функция (copy-list) есть, но в примечании указано: "In file common.lsp", то есть в файле common.lsp, содержащем функции, определяемые для совместимости с Common LIsp. Вероятно, этот файл следует загрузить.
Код

(defun F (N)
 (if (< N 10) N
  ((lambda (reminder)
    (+ reminder (F (/ (- N reminder) 10))))
   (rem N 10))))

«...все с ног на голову...» - скорее наоборот, с головы на ноги: исключение лишнего.

Автор: kosmonaFFFt 25.2.2009, 21:16
Писать за тебя не буду, ибо занят щас, но есть мысль - 
замутить строковое представление числа например с помощью
Код

(princ-to-string number)

потом нагуглить про работу со строками и создать список символов строки, выкинув оттуда
десятичную запятую, если она есть, а потом с этим списком можно сделать что угодно...
Создание списка символов строки можно вывести в отдельную функцию, а мб его можно
и не создавать и работать со строкой как с массивом...
Примерно так.
З. Ы. Пока писал все это VH_ уже все сделал, причем намного лучше, чем я предлагал... smile

Автор: VH_ 25.2.2009, 22:04
«...выкинув оттуда десятичную запятую, если она есть...» - «...сумма цифр натурального числа n...»

Автор: camakob 25.2.2009, 22:07
Спасибо за помощь товарищи, будем грызть гранит, правда еще меня ждут программирование(громко сказано) на Прологе, тоже первый раз сталкиваюсь, раньше слышал, что есть такой язык.

Автор: kosmonaFFFt 26.2.2009, 15:26
Цитата(VH_ @ 25.2.2009,  22:04)
«...выкинув оттуда десятичную запятую, если она есть...» - «...сумма цифр натурального числа n...»

Мда... Еще со школы натуральные с рациональными (вроде так называются) путал...

Автор: _sg 25.4.2014, 07:02
как ввариант:
Код

(defun sn (n)
  (apply #'+
         (mapcar #'parse-integer
                 (map 'list #'string (write-to-string n)))))

> (sn 54321)
15

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)