singlepost

Лисп. Спискоразрушающие функции. << На главную или назад  

Помогите с задачкой. Задача такая: удалить из начала списка указанное количество элементов. При этом надо использовать спискоразрушающие функции. Я сделал вот так:

(DEFUN F (LIST N)
(COND ((= N 0) LIST)
(T ((lambda(result) (RPLACA(RPLACD LIST(cdr result)) (car result)))
(F (cdr LIST)(- N 1))))))

Только когда вводишь например:
(F "(1 2 3) 4) – т.е. удалить 4 элемента он говорит, что NIL- bad argument type. Как от этого избавиться, просто чтобы он NIL давал?

И объясните пожалуйста, что за функция lambda, я до конца не понимаю и можно ли здесь обойтись без нее?

31 ответов в теме “Лисп. Спискоразрушающие функции.”

  1. 17
    Владимир Гордеев ответил:

    //paste.lisp.org/display/90617

    Чёрт, ты лучше прекрати говорить "я не могу разобраться", и начни говорить "сделайте мне лабу, я не шарю". Так ведь честнее.

    Так хотя бы никто не станет кормить тебя лямбдами.

  2. 16
    Сергей Босалаев ответил:

    Вроде усвоил. Спасибо большое.

  3. 15
    Жека Кирпичев ответил:

    См. тж. //en.wikipedia.org/wiki/Lambda_calculus

  4. 14
    Сергей Босалаев ответил:

    Если не хочешь отвечать – не отвечай, сам разбирусь.

  5. 13
    Жека Кирпичев ответил:

    Покажи, в каких источниках ты читал про lambda, и укажи на непонятные места в объяснениях.

    На javas?1?ript умеешь писать? function(x) {return x+5;} – это абсолютно то же самое, что и (lambda (x) (+ x 5)).

  6. 12
    Алексей Злобин ответил:

    Берёт и работает… Сформулируй внятно вопрос и сам поймёшь ответ.

  7. 11
    Сергей Босалаев ответил:

    Это я прочитал… А как работает не улавливаю никак…

  8. 10
    Леонид Максимов ответил:

    ок, ок. лямбда – это безымянная функция. теперь понятно?

  9. 9
    Сергей Босалаев ответил:

    Не понимаю я как переделать, прочитал про lambda везде. Не знаю как поправить без него или разобратся как с ним работает.

  10. 8
    Сергей Босалаев ответил:

    Помогите, пожалуйста.

  11. 7
    Леонид Максимов ответил:

    можно без lambda, тем же defun. но это то же самое, только писать больше.

  12. 6
    Сергей Босалаев ответил:

    Помогите, пожалуйста, это лабораторная, никак не могу разобратся, особенно с lambda. И поставил проверку(NULL LIST) он мне вообще стал NIL возвращать.

  13. 5
    Сергей Босалаев ответил:

    Может можно без lambda?

  14. 4
    Сергей Босалаев ответил:

    Просто надо использовать спискоразрушающие функции. Так то без них вот так и все:
    (DEFUN D (X K)
    (COND ( (= K 0)X)
    ( (> K 0) (D (cdr X) (- K 1) ) ) ) )

  15. 3
    Сергей Босалаев ответил:

    Сделал по примеру, а до конца не догоняю, что за lambda и можно ли без нее вообще обойтись?

  16. 2
    Роман Труба ответил:

    Рекурсию юзай.
    Первая и последняя строки верны, средняя бредятина какая-то.
    И конечно он тебе выдаст bad argument, если из списка 3 элементов ты пытаешься удалить 4.
    На определенном шаге функция попытается вызвать cdr для NIL и выдаст тебе ошибку.
    Сделай проверку типа (NULL LIST)

  17. 1
    Жека Кирпичев ответил:

    А, извиняюсь, как ты умудрился сделать "вот так", не понимая, что значит lambda? Смею предположить, сделал не сам?

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.