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


Автор: ILCDWork 26.8.2011, 10:51
Здравствуйте, помогите, пожалуйста решить следующую задачу. Как-то сложно у меня идет с функционалами.

 Опpеделите на языке ЛИСП функционал, вставляющий перед каждым элементом списка, обладающим определенным свойством, символ *. Проверьте работу функционала для предикатов:
 -неотрицательное число (при вызове используйте лямбда-функцию); 
 -четное число.
В теле функции использование операторов set и setq не допускается!

Очень надеюсь на помощь.

Автор: newbee 26.8.2011, 11:36
Код

(defun asterisk (fnc pair)
 (if pair
  (if (funcall fnc (car pair))
   (cons '* (cons (car pair) (asterisk fnc (cdr pair))))
   (cons (car pair) (asterisk fnc (cdr pair))))))

(defun asterisk (fnc pair)
 (if pair
  (let ((x (cons (car pair) (asterisk fnc (cdr pair)))))
   (if (funcall fnc (car pair)) (cons '* x) x))))

;--------

(print (asterisk 'oddp '(1 2 3 4)))
(print (asterisk (lambda (x) (>= x 0)) '(1 2 0 -5 3 -1)))



Общелисп. Выбирай, какая больше нравится.

Автор: ILCDWork 26.8.2011, 12:50
Пробую запускать на muLisp.

(print (asterisk 'oddp '(1 2 3 4))) - проходит нормально.

(print (asterisk (lambda (x) (>= x 0)) '(1 2 0 -5 3 -1)))
Пишет:
Undefined Function Break: (LAMBDA (X) (>= X 0))
Continue, Break, Abort, Top-level, Restart, System?
Нажимаю C - результат выдается правильный.
Смущает только наличие ошибки.

Автор: newbee 26.8.2011, 13:20
ILCDWork, смотри в своем учебнике или лекциях, как правильно записывать лямбда-функцию. Попробую угадать:

(print (asterisk #'(lambda (x) (>= x 0)) '(1 2 0 -5 3 -1)))

Добавлено через 3 минуты и 10 секунд
Еще нагуглилась такая запись: ((lambda (x) (>= x 0))). Если оба варианта не подойдут, читай лекции.

Автор: _sg 25.4.2014, 15:47
как вариант:
Код

(defun insert-asterisc (p w &aux (a ( car w)) (d ( cdr w)))
  (cond ((null w) nil)
        ((funcall p a) (cons '* (cons a (insert-asterisc p d))))
        ((cons a (insert-asterisc p d)))))
 
> (insert-asterisc #'(lambda (a) (not (minusp a))) '(-1 2 -3 -4 -5 -6 7 0 9))
(-1 * 2 -3 -4 -5 -6 * 7 * 0 * 9)
> (insert-asterisc #'evenp '(-1 2 -3 -4 -5 -6 7 8 9))
(-1 * 2 -3 * -4 -5 * -6 7 * 8 9)

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