• sinsudo 4 hours ago

    I know that the purpose of the page is to compare syntax of common lisp, racket, clojure, and emacs lisp. But some examples could be more idiomatic, for instance instead of

      (defun add (a &rest b)
        (if (null b)
            a
            (+ a (eval (cons '+ b)))))
    
    One should avoid eval and use endp instead of null:

       (defun add (a &rest b)
            (if (endp b) a
                (apply #'add (+ a (first b)) (rest b))))
    • ludston an hour ago

      Worse: Using recursion in Common Lisp isn't idiomatic, given that CL doesn't guarantee tail-call optimisation in the specification.

      • CodeArtisan 2 hours ago

        Shouldn't it be (+ a (apply + b))

        • db48x 34 minutes ago

          Almost. It should be (+ a (apply #'+ b)). Common Lisp is a Lisp-2, so a + in the argument position is assumed to be a variable named +, not the function named +, unless you specify otherwise.

      • kickingvegas 2 hours ago

        Perhaps related, I'm maintaining a "cheatsheet" to let Python programmers see what an Elisp equivalent to typical Python functions/methods are.

        https://kickingvegas.github.io/elisp-for-python/

        • emil-lp 2 hours ago

          Are `(push s x)` and `(push x s)` correct for push and insert, resp.?

        • vindarel 2 hours ago

          Notes on CL:

          - why nothing on the "compiler" line? Everytime you load a snippet or a file with SBCL, it compiles it (to machine code). There's also compile-file.

          - interpreter: likewise, all code is compiled by default with SBCL, not interpreted, even in the REPL. To use the interpreter, we must do this: https://github.com/lisp-tips/lisp-tips/issues/52

          - command line program: the racket cell shows the use of -e (eval), the same can be done with any CL implementation.

          - since the string split line introduces cl-ppcre, one could mention cl-str :D (plug) (much terser join, trim, concat etc)

          - ah ok, for dates and times, flattening a list, hash-table literals… we need more libraries.

          - more files operations: https://lispcookbook.github.io/cl-cookbook/files.html

          - emacs buffers: now compare with Lem buffers 8-)

          - posix-getenv: I'd rather use uiop:getenv (comes in implementations).

          - uiop:*command-line-arguments*

          - exit: uiop:quit

          - uiop:run-program (sync) / launch-program (async)

          - java interop: with LispWorks or ABCL (or other libraries)

          my 2c

          • sinsudo 2 hours ago

            Since you are also commenting libraries, I think that FSet (1) for inmutable memory,and perhaps a comparison with clojure, and the quick-lisp package manager could be mentioned.

            (1) https://news.ycombinator.com/item?id=47779659

          • sinsudo 3 hours ago

            The page indicates that there is not function for documentation in common lisp, but

              (documentation 'documentation 'function)
                  "Return the documentation string of Doc-Type for X, or NIL if none 
                    exists. 
                    System doc-types are VARIABLE, FUNCTION, STRUCTURE, TYPE, SETF, and T.
            
             Also http://rosettacode.org for computer tasks implemented in many computer languages to allow you compare syntax and code.
            • ethagnawl 3 hours ago

              This is really neat.

              Something I've been meaning to do is try putting together a cross-lisp package manager -- if only because it'd be fun. Maybe it would favor code that could be readily run or eval'd or maybe with some sort of clj/cljs type dynamic dispatch for anything implementation specific.

              • ecto 4 hours ago

                Great chrestomathy! I opened a PR for my lisp, Loon: https://github.com/clarkgrubb/hyperpolyglot/pull/139

                • wk_end 27 minutes ago

                  With all due respect, if this page adds a column for everyone's personal Lisp, it'll be as wide as the Pacific.

                • arikrahman 4 hours ago

                  Would be interesting to see how Jank is coming along in this space as well.

                  • veqq 27 minutes ago

                    Jank's just supposed to be Clojure with full compatibility, when mature.

                  • eamonnsullivan 4 hours ago

                    Clojure 1.6, Emacs 24.5... These are pretty old versions, at least of those.

                    • rahen 39 minutes ago

                      Emacs Lisp is a descendant of PDP-10 MAClisp, which makes it one of the oldest Lisp dialects still actively maintained. Whether it's version 24.5 or 30.2 doesn't make much of a difference semantically.

                      • db48x 4 hours ago

                        Most of the things in that table won’t change from version to version anyway.

                      • FergusArgyll 3 hours ago

                        As someone who's not a programmer but has beginner - medium python & C skills. I'm in middle of learning lisp (elisp to be precise) and it feels like reading poetry. It's a transcendent experience that's hard to explain. Such beautiful concepts. Everything flows in a way it doesn't in C based langs

                        • anthk 3 hours ago
                          • FrustratedMonky 3 hours ago

                            Nice comparison.

                            But makes me think we'd be better off if we all just focused on a single one, and grew it, made it better. Not having 4 versions of something almost identical. Fragmentation can hurt adoption.

                            • ludston an hour ago

                              They are as different from one another as Java is from C# is from JavaScript.

                              • db48x 2 hours ago

                                That’s what Common Lisp is.

                                • MathMonkeyMan an hour ago

                                  You got downvoted, but you're correct. Obligatory XKCD: <https://xkcd.com/927/>

                                  Personally I prefer lisp 1 languages, like scheme. Even there, though, there was a split over r6rs, so we got a bunch of mostly-like-r5rs schemes and racket.

                                  Maybe the problem is that lisps are no longer popular enough to have a winning implementation! If there is one, though, then it's Common Lisp on SBCL.

                                • erichocean 2 hours ago

                                  There are deep reasons for the variations, especially around (reader) macros.