| 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