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


Автор: BCworm 25.5.2009, 08:07
Привет всем. Нашел здесь код и попробовал переделать под свои нужды. Есть исходный список  из отрицательных и положительных чисел. Мне необходимо функция которая перед каждым отрицательным числом ставит символ *. 
Код подправил вот так

Код

 (defun myfunc (a x)
 (cond ((null x) nil)
 ((< (car x) 0) (cons a (myfunc a (cdr x))))
 (T (cons (car x) (myfunc a (cdr x))))))


Здесь в качестве параметров передается значение (символ) на который будет заменен отрицательный элемент и собственно переменная связанная с листом а мне нужно чтоб в качестве параметра передавалась только переменная-лист
(myfunc x) и в результате работы перед каждым отрицательным элементом должен быть знак * т.е вместо -1 должно стоять *-1 вот собственно как-то так.

Помогите а?


Автор: _sg 22.12.2012, 23:09
Код

(defun cons* (n)
  (intern (concatenate 'string "*" (write-to-string n))))

(defun *minus (w)
  (cond ((null w) nil)
        ((minusp (car w)) (cons (cons* (car w)) (*minus (cdr w))))
        ((cons (car w) (*minus (cdr w))))))

> (*minus '(-1 0 1))
(*-1 0 1)

Автор: Catstail 14.1.2013, 14:32
Или так:

Код

(defun task (lst)
  (iter (for i in lst) (when (minusp i) (collect '*)) (collect i))) 

==> task

(task '(1 2 3 -1 7 -8))

==> (1 2 3 * -1 7 * -8)


Автор: _sg 25.4.2014, 16:47
Код

(defun insert-asterisc (w &aux (a ( car w)) (d ( cdr w)))
  (when w (if (minusp a)
              (cons '* (cons a (insert-asterisc d)))
              (cons a (insert-asterisc d)))))

> (insert-asterisc '(-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)