Remarkable is the fully interactive way of working in the REPL (Lisp's Read Eval Print Loop) and through the GUI, including live editing all classes/etc. via menus. LOOPS extended Interlisp with various ways to do object-oriented programming and a rule-system.
There is also a "friendly primer" for Xerox LOOPS, from mid 1980s. https://bitsavers.org/pdf/xerox/interlisp-d/198510_Koto/3102...
Note that LOOPS is an early OOP System, it's not a about iteration in a loop.
I think LOOPS was limited by only being available on Interlisp-D related systems. Common LOOPS was supposed to be portable, but I remember it only in the context of the CLOS development as a stepping stone, but not as a product or environment like LOOPS.
CLOS (Common Lisp Object System) is a general OOP standard extension for Common Lisp. A specification was proposed in 1987/88. CLOS was included in the Common Lisp standard and widely implemented by various implementations.
Both were a "system" -> meaning that it is available and programmable also at runtime.
LOOPS is an actual piece of software with a GUI, which integrates into the Interlisp-D development environment.
LOOPS was based on message sending, classes, methods, interactive changes to the object system.
CLOS does not use message sending, but calling generic functions with multi-methods and multiple dispatch.
LOOPS supports Access-oriented Programming with Active Values. Demons can act based on access to objects. CLOS has no direct support for that. Maybe partial (-> :before & :around &:after methods in CLOS).
LOOPS includes a rule-system. CLOS systems have that as extensions. It's not a part of CLOS itself.
LOOPS includes graphical & menu tools to browse and edit objects. CLOS systems have some of that as extensions, depending on the implementation.
LOOPS was a programming system for knowledge-based systems, like Expert Systems. CLOS was not designed for that, but such programming systems were also developed for Common Lisp, some using CLOS. Example: KnowledgeWorks from LispWorks.
LOOPS was later rewritten as CommonLOOPS for Common Lisp. The software "Portable Common LOOPS" (PCL) then was further developed into a portable (and widely ported) and complete prototype implementation of CLOS + MOP.
Update: my remark was about an earlier posted content, which had an "AI" generated answer. That text has been removed.
CommonLoops was proposed by Xerox to be the OOP system of Common Lisp in the standardization process. It was then decided to design a new system called Common Lisp Object System (CLOS), starting with a merge of the features of New Flavors (MIT/Symbolics) and CommonLoops (Xerox). Xerox implemented CLOS by modifying its CommonLoops implementation, during the standardization process. Thus Portable CommonLoops (PCL) was eventually the prototype CLOS + MOP implementation.
OP is a very long book, I haven't had a chance to read it fully, but first thing I wanted to see is how they manage message sending, and it's as jank as it is in flavors. I thought considering how custom interlisp can be they'd do something special. nope, it's just send.
for those who don't know what I'm talking about, an old school smalltalk style object system lets one send arbitrary messages, without prior knowledge of what those messages might be, and treats the receiving object as a blackbox (conceptually anyway). this approach doesn't map well to s-exp, because first symbol in an s-expression drives the logic. in flavors (and in LOOPS) the symbol used is "SEND", so in order to actually send a message you write something like
(send some-window :set-edge 10 10 40 40)
as you can imagine a very heavily object oriented code becomes littered with sends. LOOPS seems to make it a little bit less painful by making ← an equivalent of send, so above can be written as (← SomeWindow SetEdge 10 10 40 40)
this is obviously only a margin improvement.clos solved this problem by drifting away from smalltalk's blackbox concept and making everything generic function oriented,
(set-edge some-window 10 10 40 40) (DEFMACRO SEND (OBJECT OPERATION &REST ARGUMENTS)
"Send a message to OBJECT, with operation OPERATION and ARGUMENTS."
`(FUNCALL ,OBJECT ,OPERATION . ,ARGUMENTS))