Re: Lisp Function Problem

Liste des GroupesRevenir à cl scheme 
Sujet : Re: Lisp Function Problem
De : Nobody447095 (at) *nospam* here-nor-there.org (B. Pym)
Groupes : comp.lang.lisp comp.lang.scheme
Date : 08. Aug 2025, 00:30:15
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <1073cu3$be2l$1@dont-email.me>
References : 1
User-Agent : XanaNews/1.18.1.6
B. Pym wrote:

Write a Function 'total' that takes an orderd list ie.
((itemA quantityA costA)(itemB quantityB costB)....)
but returns a list giving the total cost plus the overall cost.
 
Eg:
 
LISP>(total'((book 2 10)(pen 3 2)(notepad 1 12)))
((BOOK 20)(PEN 6)(NOTEPAD 12)(TOTAL 38))
 
Thank you for your time
 
 
Here are 3 quite different solutions... one recursive, one iterative,
and one obscure. I won't do ALL your homework, so you will have to
figure out yourself how they work, which shouldn't be very hard.
Disclaimer: I'm quite new to Lisp myself, so there may be better and
more elegant solutions.
 
;;; 1
(defun total (lst)
   (labels ((total-rec (sublst subtot)
                       (if sublst
                         (let* ((sub (car sublst))
                                (sum (* (cadr sub) (caddr sub))))
                           (cons `(,(car sub) ,sum)
                               (total-rec (cdr sublst) (+ subtot sum))))
                         `((total ,subtot)))))
     (total-rec lst 0)))
 
;;; 2
(defun total (lst)
   (let ((total 0)
         (ret))
     (dolist (elt lst (nreverse (push `(total ,total) ret)))
       (let ((subtotal (* (cadr elt) (caddr elt))))
         (push `(,(car elt) ,subtotal) ret)
         (incf total subtotal)))))
 
;;; 3
(defun total (lst)
   (append
     (mapcar #'(lambda (e) (list (car e) (* (cadr e) (caddr e)))) lst)
     `((total ,(apply #'+ (mapcar #'(lambda (elt) (* (cadr elt) (caddr
elt))) lst))))))

Gauche Scheme

(define (proc purchases)
  (define grand-total 0)
  (define (calc item quan price)
    (let1 total (* quan price)
      (inc! grand-total total)
      (list item total)))
  (append
    (map: calc purchases)
    (list (list 'total grand-total))))

(proc '((book 2 10) (pen 3 2) (notepad 1 12)))
  ===>
((book 20) (pen 6) (notepad 12) (total 38))


Given:

(define (map: func seq)
  (map (lambda(x) (apply func x)) seq))


--
[T]he problem is that lispniks are as cultish as any other devout group and
basically fall down frothing at the mouth if they see [heterodoxy].
  --- Kenny Tilton
The good news is, it's not Lisp that sucks, but Common Lisp. --- Paul Graham

Date Sujet#  Auteur
8 Aug 25 o Re: Lisp Function Problem1B. Pym

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal