Deutsch   English   Français   Italiano  
<v5nbe0$3he95$1@dont-email.me>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!feed.opticnetworks.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: "B. Pym" <No_spamming@noWhere_7073.org>
Newsgroups: comp.lang.lisp
Subject: Re: Why don't people like lisp?
Date: Fri, 28 Jun 2024 21:54:10 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 76
Message-ID: <v5nbe0$3he95$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Injection-Date: Fri, 28 Jun 2024 23:54:10 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="b1ceb86ed3a735c50ed835e76e0169f9";
	logging-data="3717413"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX19JA79nVq6ohOXO0UHfEtzz"
User-Agent: XanaNews/1.18.1.6
Cancel-Lock: sha1:Uao8F+Q0hjkzU4F+XmYZz2jNMTQ=
Bytes: 3430

Pascal Costanza wrote:

> > Indentation in Lisp is not clear enough. Let's look at an example from
> > http://www-users.cs.umn.edu/~gini/aiprog/graham/onlisp.lisp:
> >
> > (defun mostn (fn lst)
> >   (if (null lst)
> >       (values nil nil)
> >       (let ((result (list (car lst)))
> >             (max (funcall fn (car lst))))
> >         (dolist (obj (cdr lst))
> >           (let ((score (funcall fn obj)))
> >             (cond ((> score max)
> >                    (setq max    score
> >                          result (list obj)))
> >                   ((= score max)
> >                    (push obj result)))))
> >         (values (nreverse result) max))))
> >
> > Note that only one pair of adjacent lines is indented by the same amount.
> > Other alignments are in the middle of lines.
> >
> > Here is a straightforward translation into my dream language; note that
> > there aren't a lot of parens despite insignificant indentation and despite
> > using braces (like C) instead of bracketing keywords (like Pascal):
> >
> > def mostn Fun [] = [], null;
> > def mostn Fun (First\List) {
> >    var Result = [First];
> >    var Max = Fun First;
> >    each List ?Obj {
> >       let Score = Fun Obj;
> >       if Score >  Max {Max = Score; Result = [Obj]}
> >       if Score == Max {Result = Obj\Result}
> >    };
> >    reversed Result, Max
> > };
> 
> Apparently, Paul Graham doesn't like CLOS nor the LOOP macro. Here is
> another verson in Common Lisp (and this is not a dream language ;):
> 
> (defmethod mostn (fn (list (eql nil)))
>    (declare (ignore fn list))
>    (values nil nil))
> 
> (defmethod mostn (fn list)
>    (loop with result = (list (car list))
>          with max = (funcall fn (car list))
>          for object in (cdr list)
>          for score = (funcall fn object)
>          when (> score max) do (setq max score
>                                      result (list object))
>          when (= score max) do (push object result)
>          finally return (values (nreverse result) max)))

Gauche Scheme

(use gauche.collection) ;; fold2

(define (max-by fn lst)
  (if (null? lst)
    (values '() #f)
    (fold2
      (lambda (x best worth)
        (let ((score (fn x)))
          (cond ((> score worth) (values (list x) score))
                ((= score worth) (values (cons x best) worth))
                (#t (values best worth)))))
      (take lst 1) (fn (car lst))
      (cdr lst))))

(max-by (lambda(x) (modulo x 5)) '(22 23 24 25 26 27 28 29))

  ===>
(29 24)
4