Join the discussion
Write your take first — we'll ask for email only when you're ready to publish.
- Hacker News
- Would be interesting to see how Jank is coming along in this space as well.by arikrahman
- Jank's just supposed to be Clojure with full compatibility, when mature.by veqq
- Great chrestomathy! I opened a PR for my lisp, Loon: https://github.com/clarkgrubb/hyperpolyglot/pull/139by ecto
- With all due respect, if this page adds a column for everyone's personal Lisp, it'll be as wide as the Pacific.by wk_end
- 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.
by ethagnawl - CL list comprehension:
(loop for file across "ABCDEFGH" nconc (loop for rank from 1 to 9 collect (format nil "~C~D" file rank)))by aidenn0 - Or with more Python-esque syntax:
Based on the list comprehension macro from 1991 in https://3e8.org/pub/scheme/doc/lisp-pointers/v4i2/p16-lapalm... that still works.(let ((files (coerce "ABCDEFGH" 'list)) (ranks (loop for r from 1 to 9 collect r))) [(format nil "~a~a" file rank) (file <- files) (rank <- ranks)])
Supports filtering too, e.g.(defmacro comp ((e &rest qs) l2) (if (null qs) `(cons ,e ,l2) ; rule A (let ((q1 (car qs)) (q (cdr qs))) (if (not (eq (cadr q1) '<-)) ; a generator? `(if ,q1 (comp (,e ,@q) ,l2) ,l2) ; rule B (let ((v (car q1)) ; rule C (l1 (third q1)) (h (gentemp "H-")) (us (gentemp "US-")) (us1 (gentemp "US1-"))) `(labels ((,h (,us) ; corresponds to a letrec (if (null ,us) ,l2 (let ((,v (car ,us)) (,us1 (cdr ,us))) (comp (,e ,@q) (,h ,us1)))))) (,h ,l1))))))) (defun open-bracket (stream ch) (do ((l nil) (c (read stream t nil t)(read stream t nil t))) ((eq c '|]|) `(comp ,(reverse l) ())) (push c l))) (defun closing-bracket (stream ch) '|]|) (set-macro-character #\[ #'open-bracket) (set-macro-character #\] #'closing-bracket)(let ((xs '(1 2 3 4)) (ys '(1 2 3 4))) [(+ x y) (x <- xs) (y <- ys) (evenp x) (oddp y)]) ; -> (3 5 5 7)by Jach - Clojure 1.6, Emacs 24.5... These are pretty old versions, at least of those.
- I have been a clojurist for more than a decade and I started with Clojure 1.7. 1.6 was released in 2014!by waffletower
- To be fair I think the only real differences since 1.6 you’d see are transducer versions of some of what’s in here for Clojure. The stuff expressed here is all very basic.by devin
- Most of the things in that table won’t change from version to version anyway.by db48x
- 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.by rahen
- > cannot start with digit
Not only it can, but both CL and Emacs Lisp actually defines primitives with names that start with digit.
by dfox - Emacs has cl-libby anthk
- Perhaps related, I'm maintaining a "cheatsheet" to let Python programmers see what an Elisp equivalent to typical Python functions/methods are.by kickingvegas
- Are `(push s x)` and `(push x s)` correct for push and insert, resp.?by emil-lp
- 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 langsby FergusArgyll
- 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.by sinsudo - Likewise apropos. It's an ANSI function.
- 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
One should avoid eval and use endp instead of null:(defun add (a &rest b) (if (null b) a (+ a (eval (cons '+ b)))))(defun add (a &rest b) (if (endp b) a (apply #'add (+ a (first b)) (rest b))))by sinsudo - Worse: Using recursion in Common Lisp isn't idiomatic, given that CL doesn't guarantee tail-call optimisation in the specification.by ludston
- Shouldn't it be (+ a (apply + b))by CodeArtisan
And this is undefined behavior because it mutates literal constant. I stopped reading further. The CL column is so bad.(defparameter *a* '(1 2 3)) (setf (car *a*) 3)by kscarlet- The use of cl:eval alone is enough to make me believe that the CL column was never reviewed by an experienced CL programmer. I am now more suspicious of the other columns, which are languages I'm far less familiar with.by aidenn0
- 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
by vindarel - Hash-table literals are covered by (among others):
Though now I'm wondering which libraries would make for a proper canonical extended core... asdf, uiop (comes with asdf, so naturally), alexandria, bordeaux-threads, cffi, cl-ppcre, str, local-time, trivia,... and maybe fset? (although I personally prefer Sycamore's naming conventions)- Serapeum - golden-utils - rutils - make-hash...maybe also fivem (although I personally prefer parachute) and hunchentoot.
by tmtvl - > - ah ok, for dates and times
local-time has its limits (e.g. Gregorian only), but it does everything listed in this chart
> flattening a list
What? Isn't this[1] just fine (<s>)
> hash-table literals…
Since the chart is sbcl specific, this ugly mess would technically count; a more portable (but longer) version could be made similarly using #.:
> java interop: with LispWorks or ABCL (or other libraries)#.(SB-IMPL::%STUFF-HASH-TABLE (MAKE-HASH-TABLE :TEST 'EQUAL) '((:X . :Y)))I've had good luck with .net/java interop using FOIL (written by Rich Hickey prior to Clojure).
1:
=> (A B C D E F)CL-USER> (let* ((result (cons nil nil)) (tail result)) (subst-if t (constantly nil) '(a ((b(c d)) e) f) :key (lambda (x) (when (and x (atom x)) (setf (cdr tail) (cons x nil) tail (cdr tail))))) (cdr result))by aidenn0 - 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.by sinsudo