Deutsch English Français Italiano |
<v5nsmf$3nsv3$1@dont-email.me> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!3.eu.feeder.erje.net!2.eu.feeder.erje.net!feeder.erje.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: HenHanna <HenHanna@devnull.tb> Newsgroups: comp.lang.lisp Subject: Re: Why don't people like lisp? Date: Fri, 28 Jun 2024 19:48:46 -0700 Organization: A noiseless patient Spider Lines: 97 Message-ID: <v5nsmf$3nsv3$1@dont-email.me> References: <v5nbe0$3he95$1@dont-email.me> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Sat, 29 Jun 2024 04:48:48 +0200 (CEST) Injection-Info: dont-email.me; posting-host="a284b8b9998909dad96ddd00bdf8ce4c"; logging-data="3929059"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+gy91o8V/rZyKB+3OgREydfYv8GPSG5fs=" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:P4R35zHRftpW5jUBfKsGH1hNIYw= In-Reply-To: <v5nbe0$3he95$1@dont-email.me> Content-Language: en-US Bytes: 4353 On 6/28/2024 2:54 PM, B. Pym wrote: > 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 How do i avoid using -99999 ??? (define (print x) (newline) (write x) (newline)) (define (max-by fn Lis) (maxBy fn Lis '() -99999)) (define (maxBy fn x cLis cMax) (cond ((null? x) (cons (reverse x) cMax)) ((= (fn (car x)) cMax) (maxBy fn (cdr x) (cons (car x) cLis) cMax)) ((> (fn (car x)) cMax) (maxBy fn (cdr x) (list (car x)) (fn (car x)))) (else (maxBy fn (cdr x) cLis cMax)))) (print (max-by (lambda(x) (modulo x 5)) '(4 5 6 7 8 9 3 44))) (print (max-by (lambda(x) (modulo x 5)) '(24 25 26 27 28 29 33 44)))