You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
On Mastodon, between January 30 and 31, 2024, some Lispers noticed the above discussion of LOOP and elaborated on it in a thread initially started on other Lisp topics. They tracked down early implementations of LOOP and investigated their level of closeness to the ANSI Common Lisp specification.
Since the discussion is interesting but the Mastodon settings of part of the thread didn't make it all publicly visible, I'm republishing it here with permission from the participants, along with the full context. I made no edits other than adding separators between posts and links to the participants' Mastodon profiles. I also omitted some meta posts not directly related to the context.
Thanks to all who contributed to the discussion and gave permission to publish it.
Orange site is funny, on the topic of the Ideal #Lisp:
"> It would be something like a fusion of Clojure and Common Lisp, (...)
Mine would be, too. Unfortunately, that's not possible. Clojure is one of those few languages actually designed by somebody who knows what they are doing."
So .. the Lisp Machine folks, the Common Lisp people, Maclisp .. etc had no clue what they where doing.
@ekaitz_zarraga @amszmidt Common Lisp was also not trying to design a language from scratch, they were trying to broker a compromise between multiple implementors and users with existing code, essentially forced by the Dept. of Defense. They indeed knew what they were doing but "what they were doing" was not designing an ideal Lisp.
@amszmidt "To optimize this further, you need implementation dependent code and replace abstractions of S-expressions with native machine code"
This is called a compiler. And this person wants to do tooling and AI in Scheme and wants fast implementations of functional languages. Erm.
@amszmidt I almost feel bad for whichever venture capitalists might think to fund that guy. Well, he wants a co-founder so maybe I should focus on who would get the shit end of the stick.
Uh, ... I get that the context is light-hearted. And I'm sure you know there's no actual test for what is or is not a lisp. As a matter of maybe mostly accident, I think the cons operator is present in nearly all dialects, but I don't think there are many commonalities. Probably someone calls cons pair or make-pair or some such. So excluding clojure will be hard...
But the most interesting part of probably -unsupportable statements like you made (even if in response to other probably-unsupportable statements) is the justification. It's just that you've offered none.
@kentpitman
I think that's kinda the point, what would it mean to be or not to be lisp, and @amszmidt is suggesting that rather than something nearly universal - conses, or the use of ~unsyntaxful sequences as logical elements of code (where did I see this definition of lisp) being a lisp could be understood as engagement in the varied previous lisp culture
Loop in clojure seems to be #'DO : https://clojuredocs.org/clojure.core/loop
Rather than being interlisp's FOR or the progression to CL's LOOP facility *err
@kentpitman
In this Burke and Moon article you produced, they emphasise
CLISP's (conversational lisp's) FOR led to the related but incompatible development of ~zetalisp's LOOP (an interesting interpretation of the use of keyword arguments to create a "stylized english" facility).
And this emphasis on heritage from previous lisps would be one way of defining how lispy something is.
( @amszmidt 's original thread in this vane was "scheme is not a lisp, bite me" - scheme was kind of a breakaway)
That's a great bit of history on LOOP, to which I can add the following:
@amoroso asked this week on the Medley mailing list about the lack of LOOP in Medley. I went diving in my collection of the Medley CLtL2 (*) files, and found the file named ANSI-LOOP.LISP, which is copyright MIT but also littered with the occasional #+SYMBOLICS and #+GENERA. I suspect that this was the reference implementation, as it also includes a file of validation test cases and was probably used by other implementation teams.
(*) There was/is a CLtL2 version of Medley that never made it to official release, unfortunately. It was part of what was going to be the next release when the project was suspended. Getting it working in the current Medley is part of the backlog.
@runes
Thanks I missed that thread, I do love interlisp medley, whose IL execs do feature the conversational lisp #'FOR which is, as said incompatible though obviously related to the LOOP facility (west coast versus east coast?).
@kentpitman @amszmidt @amoroso
The errors implementation was, I prefer to say, a "sample" implementation, offered reference at a point in time, for discussion, so everyone started from mostly the same place, even as the standardization process continued to vote changes. It proved feasibility and created a shared mindset about how concepts might be implemented. It would have been too administratively slow and expensive, not to mention (pardon unfortunate pun) error-prone, to update after every vote after that. So not ultimately a reference to final semantics.
Guessing this LOOP implementation is of similar nature, though there may gave been some other maclisp or zetalisp system that used it more directly. Note the file references are only somewhat helpful because:
"MC: LSB1; CLLOOP >" is a reference to a file system (ITS) that is not a specific version.
ITS filenames had four parts, each six characters max. No lowecase. "device: dir; filename1 filename2". the fn2 could be either a type or version, not both, so usually CLLOOP LISP would be a link to CLLOOP > meaning numbered bersions are lisp files. CLLOOP 829 might be the referenced version, but it says LOOP 829, not CLLOOP 829. So to people who didn't use these systems that may look like adequate pedigree but to this ITS user's eye, the versioning cited is confusing.
There is also reference to a tar file but that is presumably later and with contents the same? different? And there is mention of lisp machines, but they didn't use tar files. There's no lispm-syntax file offered so this is coming from Glenn Burke, who used sources in the LSB1 dircon the MC (or ML?) machine at MIT as original source to get people started.
Also, it references Genera 6.1, which is quite an old Symbolics release. I was laid off at Symbolics in 1992 and finished work on the standard while employed at Harlequin in 1994. The Macivory box I bought on my last day at Symbolics (using my severence pay to still get it at employee prices, $3000 for what listed commercially at ten times that) ran Genera 8.3, I think. But my point is Rel 6 was more like what was running in the 80s when I was hired (1985). I see a reference to release 6.1 in a message to a slug (symbolics lisp users group) forum in 1988 (http://ml.cddddr.org/slug/msg01819.html), so 6.1 must predate that.
Additional notes on the MIT ITS to put some of the above in context:
The internet was new in 85. Symbolics (the then lisp machine company) had the first domain name, symbolics.com. After 85, MC was MC.LCS.MIT.EDU, but in the arpanet it was originally just MIT-MC, or MC, to its friends because there were so few machines on the arpanet one didn't get confused. Domains were added as the commercial world would need them. Just finished listening to audiobook of Where Wizards Stay Up Late about origins of internet. (HIGHLY recommended to anyone still reading me here. Not sure how accessible to the lay public. Maybe.)
There were only then four machines running the ITS operating system: MIT-MC, MIT-AI, MIT-ML, MIT-DM. MC was the Macsyma Consortium, developing Macsyma, a symbolic algebra system. ML I am not sure the acronym expansion, I'd thought originslly mathlab but math work had moved to mc. Bill Martin, one of the macsyma originators, had gone on to do computational linguistics and medical decision making, and i think that Glenn was supporting that work on ML. (DM was dynamic modeling, I think, though eventually became infocom because zork was the big result. The MDL, pronounced muddle, language came from there. It was lispy in ways.)
The 4 MIT ITS machines could easily refer to each others files over the net even in 1977 when I arrived on scene. The file ML: LSB1; CLLOOP > on MC would referred to DSK: LSB1; CLLOOP > in ML if there existed such a thing, and my possibly ailing memory remembers LSB as some ML project, not an MC project. Though maybe LSB was someone's initials, not sure. Sometimes dirs were locally mirrored but disk space and directory names were at such premium, I'm not sure. (There were only 512 total directories possible on the ITS file system.) But this is another way in which the reference to a source seems potentially imprecise to me.
I haven't checked, but the emulators now available might deliberately blur the distinction between what were originally the separate machines MC, ML, and AI. I wonder if the attempt to reconstruct an ITS at all isn't a kind of Frankenstein patchwork of the three systems. (@larsbrinkhoff please correct me on any of this) But close enough. These machines were almost like conjoined twins (quadruplets almost, or triplets anyway. DM was its own world, but AI/MC/ML so tightly interacted that some parts seemed tied together), arguably part of a whole, even as also individuals.
@kentpitman @amoroso@runes@Screwtape @amszmidt You are entirely correct about the Frankensteinian aspects. We're trying to present an anachronistic amalgam of all ITS machines.
@kentpitman As you say, it is light-heated, and defining what is or isn't a Lisp is really a yak shaving exercise. Nothing makes Clojure Un-Lispy, I think. I don't think it is very Lisp-y either, but that becomes a philosophical and personal discussion with no end. At the end ... it does not matter, I just get slightly annoyed when everything and anything becomes "A Lisp", when nobody goes around calling Javascript a C, despite syntax similarities, or semantics, or what have you.
@kentpitman It is a similar thing people like to harp about that DO or FOR are not "Lisp-y" -- despite Lisp having DO for ever. Or that mutation is unLispy.
FWIW, Strange to see #'FOR or #'DO -- they are not functions!
@amszmidt
oh, bizarre. It seems like sbcl fills #'loop and #'do and so forth with #<CLOSURE (:MACRO LOOP) {}> whereas ECL for example complains there's no such function.
@kentpitman
I'd been quietly squirming at references to #'. Macros exist in the function namespace but generally aren't functions and my vague recollection is we left it undefined whether their definition lives in that cell or not. It isn't meaningful to access it. Funcalling such objects, if it works at all, does not work portably.
But there's a deeper point here. A lisp2, like CL, is designed around the idea that there are names that have more than one meaning which is resolved by context. When referring to DO or FOR, in a form, they would occur in the car of the form, so programmaticaly that would be be unambiguous. One doesn't write (#'LOOP ...) because (LOOP ...) is enough.
When referring to them in sentences, they are unlikely variable names, so I understand your urge to put the sharp quote in front of them, but technically the whole point of having names resolved by context is that you spend a lot less time worrying about the fact that they have multiple meanings and you just refer to them in the natural way, by name, just as no one talks about the noun apple fearing there might be a verb apple. They just talk about apples. Once in a while you must create disambiguation, but it's not that often.
Lisp1 fans seem to me to think the sky will fall in if context gets involved, but no human language doesn't routinely attach multiple meanings to nearly all words. We humans are nothing if not context resolvers. So, might as well use that brain wetware. Some say simplicity is about minimalism. I say, and at least some contexts, simplicity is about isomorphism to human brain function. Lisp1 fights/ignores how we think, and how we design human language. It's a thing you can do, but I challenge the right to claim that always makes things simpler. Simplicity is more complex than that. :)
I advocate designing languages that are not most minimal but most suited to human reasoning. And that extends to promoting conversations that are non nerdy, not adding spoken words you don't need. So, yes, CL is case sensitive, but it is also case translating, so in the common situation we do not call out case either, only when needed. We don't say "all-uppercase CAR" (or all-uppercase DO) because no one makes a competing one. The notations are there in case we need them, but I advocate normally just speaking to other humans in the simple way about CAR and DO because ... why not? We have brains. We figure it out.
That we want people to talk about language is why the spec contains pronunciation guides, by the way. Not to force anything, but to understand that there are norms, so people learning in isolation can feel included and not be embarrassed later.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
In another thread here about the level of completeness of Common Lisp in Medley we discussed the implementation of its
LOOP
macro, which is just a stub.On Mastodon, between January 30 and 31, 2024, some Lispers noticed the above discussion of
LOOP
and elaborated on it in a thread initially started on other Lisp topics. They tracked down early implementations ofLOOP
and investigated their level of closeness to the ANSI Common Lisp specification.Since the discussion is interesting but the Mastodon settings of part of the thread didn't make it all publicly visible, I'm republishing it here with permission from the participants, along with the full context. I made no edits other than adding separators between posts and links to the participants' Mastodon profiles. I also omitted some meta posts not directly related to the context.
Thanks to all who contributed to the discussion and gave permission to publish it.
Alfred M. Szmidt:
Orange site is funny, on the topic of the Ideal #Lisp:
"> It would be something like a fusion of Clojure and Common Lisp, (...)
Mine would be, too. Unfortunately, that's not possible. Clojure is one of those few languages actually designed by somebody who knows what they are doing."
So .. the Lisp Machine folks, the Common Lisp people, Maclisp .. etc had no clue what they where doing.
Oh yeah .. Clojure isn't a Lisp, now bite me.
Ekaitz Zárraga:
@amszmidt Common Lisp people were literally the most informed people in the planet about Lisp... omg... The orange site does it again...
Joe Oswald:
@ekaitz_zarraga @amszmidt Common Lisp was also not trying to design a language from scratch, they were trying to broker a compromise between multiple implementors and users with existing code, essentially forced by the Dept. of Defense. They indeed knew what they were doing but "what they were doing" was not designing an ideal Lisp.
Hayley:
@amszmidt charitably, one person instead of multiple people? Not a quality I aspire for, but "one snob instead of a committee" is a quality.
Hayley:
@amszmidt "To optimize this further, you need implementation dependent code and replace abstractions of S-expressions with native machine code"
This is called a compiler. And this person wants to do tooling and AI in Scheme and wants fast implementations of functional languages. Erm.
@amszmidt I almost feel bad for whichever venture capitalists might think to fund that guy. Well, he wants a co-founder so maybe I should focus on who would get the shit end of the stick.
Alfred M. Szmidt:
@hayley You wish us folk could get VC cash and burn it for whatever shenanigans we might come up with… the world would be si much colorful!
count:
@amszmidt @hayley you’d think Paul Graham would do this…
Alfred M. Szmidt:
@counteractor @hayley No. Please no!
Ringtail Ringo:
@amszmidt Since it is not en vogue anymore to search for the Holy Grail, Ideal Lisp must suffice as a replacement.
Kent Pitman:
@amszmidt
Uh, ... I get that the context is light-hearted. And I'm sure you know there's no actual test for what is or is not a lisp. As a matter of maybe mostly accident, I think the cons operator is present in nearly all dialects, but I don't think there are many commonalities. Probably someone calls cons pair or make-pair or some such. So excluding clojure will be hard...
But the most interesting part of probably -unsupportable statements like you made (even if in response to other probably-unsupportable statements) is the justification. It's just that you've offered none.
What makes clojure seem unlispy?
screwlisp:
@kentpitman
I think that's kinda the point, what would it mean to be or not to be lisp, and @amszmidt is suggesting that rather than something nearly universal - conses, or the use of ~unsyntaxful sequences as logical elements of code (where did I see this definition of lisp) being a lisp could be understood as engagement in the varied previous lisp culture
Loop in clojure seems to be #'DO : https://clojuredocs.org/clojure.core/loop
Rather than being interlisp's FOR or the progression to CL's LOOP facility *err
screwlisp:
@kentpitman @amszmidt
*actually maybe not similar to do either.
Kent Pitman:
@Screwtape @amszmidt
Actually i think CL's LOOP comes from Alan Bawden and Glenn Burke.
Edit: hmm. Maybe also Moon.
https://apps.dtic.mil/sti/citations/ADA087372
screwlisp:
@kentpitman
In this Burke and Moon article you produced, they emphasise
CLISP's (conversational lisp's) FOR led to the related but incompatible development of ~zetalisp's LOOP (an interesting interpretation of the use of keyword arguments to create a "stylized english" facility).
And this emphasis on heritage from previous lisps would be one way of defining how lispy something is.
( @amszmidt 's original thread in this vane was "scheme is not a lisp, bite me" - scheme was kind of a breakaway)
Runes:
@Screwtape @kentpitman @amszmidt
That's a great bit of history on LOOP, to which I can add the following:
@amoroso asked this week on the Medley mailing list about the lack of LOOP in Medley. I went diving in my collection of the Medley CLtL2 (*) files, and found the file named ANSI-LOOP.LISP, which is copyright MIT but also littered with the occasional #+SYMBOLICS and #+GENERA. I suspect that this was the reference implementation, as it also includes a file of validation test cases and was probably used by other implementation teams.
(*) There was/is a CLtL2 version of Medley that never made it to official release, unfortunately. It was part of what was going to be the next release when the project was suspended. Getting it working in the current Medley is part of the backlog.
screwlisp:
@runes
Thanks I missed that thread, I do love interlisp medley, whose IL execs do feature the conversational lisp #'FOR which is, as said incompatible though obviously related to the LOOP facility (west coast versus east coast?).
@kentpitman @amszmidt @amoroso
Runes:
@Screwtape @kentpitman @amszmidt @amoroso CLISP is very dependent on DWIM, so not very portable outside of Interlisp. The paper describing how it works is here: https://www.ijcai.org/Proceedings/73/Papers/075.pdf
You can turn off DWIM but it is not a good idea.
screwlisp:
@runes @kentpitman @amszmidt @amoroso
[]
You can stop the computer from doing what you mean but it is not a good idea
Paolo Amoroso:
@runes Good catch. Is this the reference implementation of LOOP?
https://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/lisp/code/iter/loop/mit/0.html
@Screwtape @kentpitman @amszmidt
Kent Pitman:
@amoroso @runes @Screwtape @amszmidt
Reference implementation for what? The header says it's not ANSI CL compliant. But that was ultimately true of https://www.nhplace.com/kent/CL/Revision-18.lisp.txt too.
The errors implementation was, I prefer to say, a "sample" implementation, offered reference at a point in time, for discussion, so everyone started from mostly the same place, even as the standardization process continued to vote changes. It proved feasibility and created a shared mindset about how concepts might be implemented. It would have been too administratively slow and expensive, not to mention (pardon unfortunate pun) error-prone, to update after every vote after that. So not ultimately a reference to final semantics.
Guessing this LOOP implementation is of similar nature, though there may gave been some other maclisp or zetalisp system that used it more directly. Note the file references are only somewhat helpful because:
"MC: LSB1; CLLOOP >" is a reference to a file system (ITS) that is not a specific version.
ITS filenames had four parts, each six characters max. No lowecase. "device: dir; filename1 filename2". the fn2 could be either a type or version, not both, so usually CLLOOP LISP would be a link to CLLOOP > meaning numbered bersions are lisp files. CLLOOP 829 might be the referenced version, but it says LOOP 829, not CLLOOP 829. So to people who didn't use these systems that may look like adequate pedigree but to this ITS user's eye, the versioning cited is confusing.
There is also reference to a tar file but that is presumably later and with contents the same? different? And there is mention of lisp machines, but they didn't use tar files. There's no lispm-syntax file offered so this is coming from Glenn Burke, who used sources in the LSB1 dircon the MC (or ML?) machine at MIT as original source to get people started.
Also, it references Genera 6.1, which is quite an old Symbolics release. I was laid off at Symbolics in 1992 and finished work on the standard while employed at Harlequin in 1994. The Macivory box I bought on my last day at Symbolics (using my severence pay to still get it at employee prices, $3000 for what listed commercially at ten times that) ran Genera 8.3, I think. But my point is Rel 6 was more like what was running in the 80s when I was hired (1985). I see a reference to release 6.1 in a message to a slug (symbolics lisp users group) forum in 1988 (http://ml.cddddr.org/slug/msg01819.html), so 6.1 must predate that.
Additional notes on the MIT ITS to put some of the above in context:
The internet was new in 85. Symbolics (the then lisp machine company) had the first domain name, symbolics.com. After 85, MC was MC.LCS.MIT.EDU, but in the arpanet it was originally just MIT-MC, or MC, to its friends because there were so few machines on the arpanet one didn't get confused. Domains were added as the commercial world would need them. Just finished listening to audiobook of Where Wizards Stay Up Late about origins of internet. (HIGHLY recommended to anyone still reading me here. Not sure how accessible to the lay public. Maybe.)
There were only then four machines running the ITS operating system: MIT-MC, MIT-AI, MIT-ML, MIT-DM. MC was the Macsyma Consortium, developing Macsyma, a symbolic algebra system. ML I am not sure the acronym expansion, I'd thought originslly mathlab but math work had moved to mc. Bill Martin, one of the macsyma originators, had gone on to do computational linguistics and medical decision making, and i think that Glenn was supporting that work on ML. (DM was dynamic modeling, I think, though eventually became infocom because zork was the big result. The MDL, pronounced muddle, language came from there. It was lispy in ways.)
The 4 MIT ITS machines could easily refer to each others files over the net even in 1977 when I arrived on scene. The file ML: LSB1; CLLOOP > on MC would referred to DSK: LSB1; CLLOOP > in ML if there existed such a thing, and my possibly ailing memory remembers LSB as some ML project, not an MC project. Though maybe LSB was someone's initials, not sure. Sometimes dirs were locally mirrored but disk space and directory names were at such premium, I'm not sure. (There were only 512 total directories possible on the ITS file system.) But this is another way in which the reference to a source seems potentially imprecise to me.
I haven't checked, but the emulators now available might deliberately blur the distinction between what were originally the separate machines MC, ML, and AI. I wonder if the attempt to reconstruct an ITS at all isn't a kind of Frankenstein patchwork of the three systems. (@larsbrinkhoff please correct me on any of this) But close enough. These machines were almost like conjoined twins (quadruplets almost, or triplets anyway. DM was its own world, but AI/MC/ML so tightly interacted that some parts seemed tied together), arguably part of a whole, even as also individuals.
Alfred M. Szmidt:
@kentpitman @amoroso @runes @Screwtape @larsbrinkhoff The LOOP file history is quite interesting, AFAIU the actual version was for NIL and lived on Corwin, where ITS and LispM had copies of said file, some hints can be found in:https://tumbleweed.nu/r/sys/file?ci=tip&name=sys2/loop.lisp&ln=9-15 and https://tumbleweed.nu/r/sys/file?ci=tip&name=sys2/loop.lisp&ln=21-24
The current version for CADR is version 829.
Lars Brinkhoff:
@kentpitman @amoroso @runes @Screwtape @amszmidt You are entirely correct about the Frankensteinian aspects. We're trying to present an anachronistic amalgam of all ITS machines.
Alfred M. Szmidt:
@kentpitman As you say, it is light-heated, and defining what is or isn't a Lisp is really a yak shaving exercise. Nothing makes Clojure Un-Lispy, I think. I don't think it is very Lisp-y either, but that becomes a philosophical and personal discussion with no end. At the end ... it does not matter, I just get slightly annoyed when everything and anything becomes "A Lisp", when nobody goes around calling Javascript a C, despite syntax similarities, or semantics, or what have you.
Alfred M. Szmidt:
@kentpitman It is a similar thing people like to harp about that DO or FOR are not "Lisp-y" -- despite Lisp having DO for ever. Or that mutation is unLispy.
FWIW, Strange to see #'FOR or #'DO -- they are not functions!
screwlisp:
@amszmidt
oh, bizarre. It seems like sbcl fills #'loop and #'do and so forth with #<CLOSURE (:MACRO LOOP) {}> whereas ECL for example complains there's no such function.
@kentpitman
Alfred M. Szmidt:
@Screwtape @kentpitman
debugger invoked on a UNDEFINED-FUNCTION in thread
#<THREAD "main thread" RUNNING {7008A20B03}>:
COMMON-LISP:DO is a macro, not a function.
Kent Pitman:
@Screwtape @amszmidt
I'd been quietly squirming at references to #'. Macros exist in the function namespace but generally aren't functions and my vague recollection is we left it undefined whether their definition lives in that cell or not. It isn't meaningful to access it. Funcalling such objects, if it works at all, does not work portably.
Kent Pitman:
@Screwtape @amszmidt
But there's a deeper point here. A lisp2, like CL, is designed around the idea that there are names that have more than one meaning which is resolved by context. When referring to DO or FOR, in a form, they would occur in the car of the form, so programmaticaly that would be be unambiguous. One doesn't write (#'LOOP ...) because (LOOP ...) is enough.
When referring to them in sentences, they are unlikely variable names, so I understand your urge to put the sharp quote in front of them, but technically the whole point of having names resolved by context is that you spend a lot less time worrying about the fact that they have multiple meanings and you just refer to them in the natural way, by name, just as no one talks about the noun apple fearing there might be a verb apple. They just talk about apples. Once in a while you must create disambiguation, but it's not that often.
Lisp1 fans seem to me to think the sky will fall in if context gets involved, but no human language doesn't routinely attach multiple meanings to nearly all words. We humans are nothing if not context resolvers. So, might as well use that brain wetware. Some say simplicity is about minimalism. I say, and at least some contexts, simplicity is about isomorphism to human brain function. Lisp1 fights/ignores how we think, and how we design human language. It's a thing you can do, but I challenge the right to claim that always makes things simpler. Simplicity is more complex than that. :)
I advocate designing languages that are not most minimal but most suited to human reasoning. And that extends to promoting conversations that are non nerdy, not adding spoken words you don't need. So, yes, CL is case sensitive, but it is also case translating, so in the common situation we do not call out case either, only when needed. We don't say "all-uppercase CAR" (or all-uppercase DO) because no one makes a competing one. The notations are there in case we need them, but I advocate normally just speaking to other humans in the simple way about CAR and DO because ... why not? We have brains. We figure it out.
That we want people to talk about language is why the spec contains pronunciation guides, by the way. Not to force anything, but to understand that there are norms, so people learning in isolation can feel included and not be embarrassed later.
Beta Was this translation helpful? Give feedback.
All reactions