TheSwamp

Code Red => AutoLISP (Vanilla / Visual) => Topic started by: drawdraw on November 17, 2020, 08:52:12 PM

Title: Can make this codes shorter ? using apply, mapcar or recursive ?
Post by: drawdraw on November 17, 2020, 08:52:12 PM
Code - Auto/Visual Lisp: [Select]
  1. (setq lst2 '())
  2. (setq lst '(10000.0 2000.0 3000.0 3000.0 2000.0))
  3. (defun haha (m)
  4.   (repeat (- (length m) 1)
  5.     (setq n (+ (car m) (cadr m)))
  6.     (setq lst2 (cons n lst2))
  7.     (setq m (cddr m))
  8.     (setq m (cons n m))
  9.     )
  10.   (setq lst2 (reverse lst2))
  11.   )
  12.  
  13. (haha lst)
  14. ; Return value: (12000.0 15000.0 18000.0 20000.0)

I have written the above codes, I want to add the first 2 values in the list and form a new list, but I think maybe it could be made shorter by using apply, mapcar or recursive method.
Could anybody help ?


EDIT (John): added code tags.

Title: Re: Can make this codes shorter ? using apply, mapcar or recursive ?
Post by: Tharwat on November 18, 2020, 02:42:23 AM
Hi,
Here is one way with foreach function.
Code - Auto/Visual Lisp: [Select]
  1. (defun Acum:Sum (m / a b r)
  2.   (setq a (car m))
  3.   (foreach b (cdr m)
  4.     (setq a (+ a b)
  5.           r (cons a r)
  6.     )
  7.   )
  8.   (reverse r)
  9. )
  10.  
  11. (Acum:Sum '(10000.0 2000.0 3000.0 3000.0 2000.0))
Title: Re: Can make this codes shorter ? using apply, mapcar or recursive ?
Post by: drawdraw on November 18, 2020, 03:12:57 AM
Great ! Tqvm !!!  :smitten:
Title: Re: Can make this codes shorter ? using apply, mapcar or recursive ?
Post by: Tharwat on November 18, 2020, 03:22:14 AM
Good to know.  :wink:
Title: Re: Can make this codes shorter ? using apply, mapcar or recursive ?
Post by: bruno_vdh on November 18, 2020, 05:13:17 AM
Hello, for exemple

mapcar method
Code: [Select]
(defun Acum:Sum (l / r)
  (setq r (car l))
  (mapcar '(lambda (x) (setq r (+ x r))) (cdr l))
)
recursive method
Code: [Select]
(defun Acum:Sum (l / rec)
  (defun rec (x l)
    (if l
      (cons (setq x (+ x (car l))) (rec x (cdr l)))
    )
  )
  (rec (car l) (cdr l))
)
Title: Re: Can make this codes shorter ? using apply, mapcar or recursive ?
Post by: drawdraw on November 18, 2020, 11:53:04 PM
Wow ! your codes is really amazing and inspiring ! thank you so much !!!   :smitten: :smitten:
Title: Re: Can make this codes shorter ? using apply, mapcar or recursive ?
Post by: Lee Mac on November 19, 2020, 10:40:46 AM
Just to provide some more variation:
Code - Auto/Visual Lisp: [Select]
  1. (defun f1 ( l ) (reverse (f2 (reverse l))))
  2. (defun f2 ( l ) (if (cdr l) (cons (apply '+ l) (f2 (cdr l)))))
Code - Auto/Visual Lisp: [Select]
  1. _$ (f1 '(10000.0 2000.0 3000.0 3000.0 2000.0))
  2. (12000.0 15000.0 18000.0 20000.0)
Title: Re: Can make this codes shorter ? using apply, mapcar or recursive ?
Post by: drawdraw on November 19, 2020, 07:33:18 PM
wow ! wow ! wow !  :smitten: :smitten: :smitten:
brain numbed !
Tqvm !
Title: Re: Can make this codes shorter ? using apply, mapcar or recursive ?
Post by: VovKa on November 19, 2020, 08:00:14 PM
Code: [Select]
(defun f (l)
  (if (cdr l)
    (cons (+ (car l) (cadr l)) (f (cons (+ (car l) (cadr l)) (cddr l))))
  )
)
Title: Re: Can make this codes shorter ? using apply, mapcar or recursive ?
Post by: Lee Mac on November 20, 2020, 06:55:50 AM
Very good VovKa  :-)
Title: Re: Can make this codes shorter ? using apply, mapcar or recursive ?
Post by: bruno_vdh on November 23, 2020, 04:48:33 AM
Wow ! your codes is really amazing and inspiring ! thank you so much !!!   :smitten: :smitten:

Thanks, the codes that follow are too.
Kudos to VovKa for their code, which inspired me to make this slight optimization.
Code: [Select]
(defun f (l / x)
  (if (cdr l)
    (cons (setq x (+ (car l) (cadr l))) (f (cons x (cddr l))))
  )
)

or longer for those who don't like setq
Code: [Select]
(defun f (l)
  (if (cdr l)
    ((lambda (x) (cons x (f (cons x (cddr l)))))
      (+ (car l) (cadr l))
    )
  )
)