Path: ...!feed.opticnetworks.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: "B. Pym" 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: 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