Path: news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail From: "B. Pym" Newsgroups: comp.lang.lisp,comp.lang.scheme Subject: Re: Why don't people like lisp? Date: Tue, 1 Jul 2025 15:10:56 -0000 (UTC) Organization: A noiseless patient Spider Lines: 71 Message-ID: <1040tps$2tj5t$1@dont-email.me> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Injection-Date: Tue, 01 Jul 2025 17:10:56 +0200 (CEST) Injection-Info: dont-email.me; posting-host="f0a476c038bf77ded6c9426ab8ea97af"; logging-data="3067069"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/q/aCqRAmgjvmfjwK0hAXG" User-Agent: XanaNews/1.18.1.6 Cancel-Lock: sha1:Y93OzB7QKMcZHGQcX7ToTaVadyg= 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 (define (max-by func List) (fold (lambda (x best) (let1 score (func x) (cond ((or (not (car best)) (> score (car best))) `(,score (,x))) ((= score (car best)) (push! (cadr best) x) best) (#t best)))) '(#f ()) List)) (max-by (lambda(x) (modulo x 5)) '(22 23 24 25 26 27 28 29)) ===> (4 (29 24))