Why don't people like lisp?
Pascal Costanza
costanza at web.de
Sun Oct 19 10:48:08 EDT 2003
Marcin 'Qrczak' Kowalczyk 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)))
Pascal
More information about the Python-list
mailing list