This seems like a very odd thing to point out. Any library interface is (or, extends) a language; this isn’t true of common lisp more so than any other language (for instance, cl:format has the counterpart of printf in c). And one of the examples they give, clos, is an example of how this can be problematic—as guy steele might put it, the language has grown, but with a seam. For clos introduces standard objects and standard classes, which are first-class, but pre-clos objects (like numbers and conses) are not guaranteed to be standard objects, and so there are some things that you cannot do with them.
lol! I wonder whose fault that was exactly—i know at least that guy says he campaigned hard for tail calls and operator overloading but got neither. The nonuniformity thing you’d think might be a concession to the implementation, but gilad bracha explains a straightforward implementation strategy (based on standard strategies for lisp implementations) that would pose little burden
Any library interface is (or, extends) a language; this isn’t true of common lisp more so than any other language
I don’t think I agree with the second part of this. By analogy with natural language: anyone can invent new words and be understood but if you invent new grammar then you’ve at least introduced a new dialect. Any language with closures or function pointers can be used to build new object models and flow control, but they often look foreign. For example, C++ has a bunch of loops in the standard algorithms library but they are weird: there’s no ergonomic non-local return in C++ and so you can’t break out of them as you can with native loops.
In contrast, a language like Lisp or Smalltalk intentionally tries to blur the distinction between language and library features. In Smalltalk, if statements and while loops are part of the standard library (though typically implemented with compiler intrinsics, which Smalltalk calls primitive methods) and so any loop construct that you write will have the same ergonomics. In contrast, if you try to build your own object model in Smalltalk or Java, it will be very clunky to use.
In Lisp, most of these things are both possible to build in a Turing you-can-implement-the-semantics sense and also in a usability they-feel-like-native-things sense. This means that a Lisp program is far more likely than, say, a Java program to depend on object models, flow-control constructs, and so on that are not part of the core language. If you did the same in Java, it would feel bolted on and weird, even if Church and Turing tell you it’s fine.
C is a little bit interesting here because it lacks so many features that you need to build non-trivial software and so you end up with clunky things like the 4BSD data-structure-iteration macros that everyone copied, or bolted-on object models like GObject. The main difference is that it’s obvious when you use these that they’re not part of the language.
My benchmark for “is it a single language?” is being able to share a library ecosystem. Which, from what I can tell as an outsider, is pretty much true for CL as there is quicklisp.org.
It’s possible for Common Lisp to be a single language, and at the same time to have identifiable subsets. The two are not mutually exclusive.
The book cited is called “Common Lisp: The Language”. Note that “Language” is singular, not plural. Also note that there are two editions of that book, describing different states of the draft Common Lisp standard (which was not finalized when either edition was published). The final official Common Lisp standard is not described by either edition of the book. So when we talk about these books, and the Common Lisp standard, there are actually three different versions of Common Lisp being described, and we could say that these versions are “three different languages”. Maybe that’s what that puzzling wording in the cited Wikipedia page is hinting at. This is a possible basis for claiming that “Common Lisp is not a Single Language”, but it applies to any language that has evolved over time, and it doesn’t seem to be what the author has in mind.
The division of the book “Common Lisp: The Language” into chapters and appendices is used as evidence that Common Lisp is not a single language. For example, the book describes CLOS in chapter 28, which the blog post characterises as “And all the mentions of CLOS etc. are only happening near the end of the book. An epilogue. Appendix. Erratum”, so that’s evidence that CLOS is a separate language.
To repeat: this book describes an unfinished draft standard, and is useful as an historical document, to understand how the language evolved, and the rationale for its features. CLOS historically was developed by a small group and then added to the Common Lisp standard, and the structure of the book reflects that history. Chapter 28 has a different set of authors than other chapters in the book.
But the book is not the standard. For a more useful and accurate description of the Common Lisp standard (describing the language as it is actually implemented and used), look at the Common Lisp Hyperspec. Here the object oriented features are an integral part of the language description. According to the hyperspec, everything (including numbers) is an object, and every object is a direct instance of a class.
I used to have a massive crush for Scheme first and then Lisp, then Haskell completely flushed out my ability to read all those parens and expand the macros in my head.
This might be splitting hairs, but I think it’s worth adding that the Wikipedia quote about CL being a set of languages is from the article on the book “Common Lisp The Language” rather than from an article about Common Lisp itself.
As such it’s the opinion of whoever added that comment to the article in early 2019, and does not necessarily reflect the consensus of the overall community of Common Lisp devotees let alone the broader CS community.
Racket: “hold my beer and watch this!”
At least they embrace this and do not pretend to be one language.
This seems like a very odd thing to point out. Any library interface is (or, extends) a language; this isn’t true of common lisp more so than any other language (for instance, cl:format has the counterpart of printf in c). And one of the examples they give, clos, is an example of how this can be problematic—as guy steele might put it, the language has grown, but with a seam. For clos introduces standard objects and standard classes, which are first-class, but pre-clos objects (like numbers and conses) are not guaranteed to be standard objects, and so there are some things that you cannot do with them.
In fairness this seam carried over to Java, courtesy of some guy who might have known better
lol! I wonder whose fault that was exactly—i know at least that guy says he campaigned hard for tail calls and operator overloading but got neither. The nonuniformity thing you’d think might be a concession to the implementation, but gilad bracha explains a straightforward implementation strategy (based on standard strategies for lisp implementations) that would pose little burden
Link to this explanation by Gilad Bracha, please?
I don’t think I agree with the second part of this. By analogy with natural language: anyone can invent new words and be understood but if you invent new grammar then you’ve at least introduced a new dialect. Any language with closures or function pointers can be used to build new object models and flow control, but they often look foreign. For example, C++ has a bunch of loops in the standard algorithms library but they are weird: there’s no ergonomic non-local return in C++ and so you can’t break out of them as you can with native loops.
In contrast, a language like Lisp or Smalltalk intentionally tries to blur the distinction between language and library features. In Smalltalk, if statements and while loops are part of the standard library (though typically implemented with compiler intrinsics, which Smalltalk calls primitive methods) and so any loop construct that you write will have the same ergonomics. In contrast, if you try to build your own object model in Smalltalk or Java, it will be very clunky to use.
In Lisp, most of these things are both possible to build in a Turing you-can-implement-the-semantics sense and also in a usability they-feel-like-native-things sense. This means that a Lisp program is far more likely than, say, a Java program to depend on object models, flow-control constructs, and so on that are not part of the core language. If you did the same in Java, it would feel bolted on and weird, even if Church and Turing tell you it’s fine.
C is a little bit interesting here because it lacks so many features that you need to build non-trivial software and so you end up with clunky things like the 4BSD data-structure-iteration macros that everyone copied, or bolted-on object models like GObject. The main difference is that it’s obvious when you use these that they’re not part of the language.
My benchmark for “is it a single language?” is being able to share a library ecosystem. Which, from what I can tell as an outsider, is pretty much true for CL as there is quicklisp.org.
It’s possible for Common Lisp to be a single language, and at the same time to have identifiable subsets. The two are not mutually exclusive.
The book cited is called “Common Lisp: The Language”. Note that “Language” is singular, not plural. Also note that there are two editions of that book, describing different states of the draft Common Lisp standard (which was not finalized when either edition was published). The final official Common Lisp standard is not described by either edition of the book. So when we talk about these books, and the Common Lisp standard, there are actually three different versions of Common Lisp being described, and we could say that these versions are “three different languages”. Maybe that’s what that puzzling wording in the cited Wikipedia page is hinting at. This is a possible basis for claiming that “Common Lisp is not a Single Language”, but it applies to any language that has evolved over time, and it doesn’t seem to be what the author has in mind.
The division of the book “Common Lisp: The Language” into chapters and appendices is used as evidence that Common Lisp is not a single language. For example, the book describes CLOS in chapter 28, which the blog post characterises as “And all the mentions of CLOS etc. are only happening near the end of the book. An epilogue. Appendix. Erratum”, so that’s evidence that CLOS is a separate language.
To repeat: this book describes an unfinished draft standard, and is useful as an historical document, to understand how the language evolved, and the rationale for its features. CLOS historically was developed by a small group and then added to the Common Lisp standard, and the structure of the book reflects that history. Chapter 28 has a different set of authors than other chapters in the book.
But the book is not the standard. For a more useful and accurate description of the Common Lisp standard (describing the language as it is actually implemented and used), look at the Common Lisp Hyperspec. Here the object oriented features are an integral part of the language description. According to the hyperspec, everything (including numbers) is an object, and every object is a direct instance of a class.
I used to have a massive crush for Scheme first and then Lisp, then Haskell completely flushed out my ability to read all those parens and expand the macros in my head.
This might be splitting hairs, but I think it’s worth adding that the Wikipedia quote about CL being a set of languages is from the article on the book “Common Lisp The Language” rather than from an article about Common Lisp itself.
As such it’s the opinion of whoever added that comment to the article in early 2019, and does not necessarily reflect the consensus of the overall community of Common Lisp devotees let alone the broader CS community.